XL 2013 Supprimer des doublons pendant un loop - Résolu par Dranreb.

Lone-wolf

XLDnaute Barbatruc
Bonjour le Forum, :)

Après plusieures tentatives faite avec Dictionnary, if cells(k, 3) = cells(k-1) then, boucle for each etc. Je me tourne vers vous pour trouvez une solution au problème.
En PJ, le fichier pour test.
 

Pièces jointes

  • Classeur1.xlsm
    18 KB · Affichages: 32

patricktoulon

XLDnaute Barbatruc
bonjour lone-Wolf
au regard de la plage de test je ne suis pas sur que tu est besoins d'un dico
un test simple à la volée avec countif
VB:
Sub test()
    For i = 5 To 10
        If WorksheetFunction.CountIf(Range("B5", Cells(i, 2)), Cells(i, 2)) = 1 Then texte = texte & Cells(i, 2) & "  ligne(" & i & ")" & vbCrLf
    Next
    MsgBox texte
End Sub
comme la plage s'agrandi au fur et a mesure de "i" tu a les uniques et le premier des doublons
Capture.JPG




maintenant si tu veux vraiment faire péter les doublons le test se fait non plus sur la plage progréssée mais la plage entière
VB:
Sub test2()
    For i = 5 To 10
        If WorksheetFunction.CountIf(Range("B5", Cells(10, 2)), Cells(i, 2)) = 1 Then texte = texte & Cells(i, 2) & "  ligne(" & i & ")" & vbCrLf
    Next
    MsgBox texte
End Sub
Capture.JPG


dans les deux modele c'est la colonne B qui sert de controle mais tu peux choisr la colonne de données a mettre dans texte ou un tableau comme tu veux
pas de dico ;)
 

Lone-wolf

XLDnaute Barbatruc
Bonjour Patrick, :)
merci d'être intervenu.

Comme tu as pu le voir dans le fichier, jutilise un do loop pour afficher une à une les cartes. Il faudrait supprimer les doublons, puis inscrire les uniques un à un. Et c'est là mon problème, comment faire?
 

patricktoulon

XLDnaute Barbatruc
ok si tu ne veux pas de doublons au tirage de l'ordi
"remelange et retire" a la source
ici
VB:
re:
   Cells(k, 3) = carteOrdi(((nb * Rnd) + 1))
  If WorksheetFunction.CountIf(Range("c5", Cells(10, 3)), Cells(k, 3)) >= 1 Then GoTo re
je ne sais pas a quoi te sert le do loop mais tu peux virer

édit:
petite correction
code a reprendre ;)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Parce que si c'est ça je le ferais comme ça, en supposant un délai de 2 secondes entre chaque apparition d'une carte :
VB:
Option Explicit
Private LAt As New ListeAléat, P As Long
Sub Jeu_Ordi()
   Randomize
   LAt.Init 52
   Range("B5:C10").ClearContents
   P = 0
   Application.OnTime Now + TimeSerial(0, 0, 3), "TirerUneCarte"
   End Sub
Sub TirerUneCarte()
   Dim Carte As Long
   P = P + 1: Carte = LAt.Aléat(P)
   Cells(4 + P, 2).Value = Carte
   Cells(4 + P, 3) = NomCarte(Carte)
   If P < 6 Then Application.OnTime Now + TimeSerial(0, 0, 2), "TirerUneCarte"
   End Sub
Function NomCarte(ByVal N As Long) As String
   NomCarte = Choose((N - 1) Mod 13 + 1, "as", "deux", "trois", "quatre", "cinq", _
      "six", "sept", "huit", "neuf", "dix", "valet", "dame", "roi") & " de " & _
      Choose((N - 1) \ 13 + 1, "cœur", "carreau", "pique", "trèfle")
   End Function
Nécessite mon module de classe ListeAléat, à glisser/déplacer depuis le projet VBA de ce classeur.
 

Pièces jointes

  • ListeAléat.xlsm
    297.4 KB · Affichages: 7

Lone-wolf

XLDnaute Barbatruc
EDIT

Re Dranreb, Patrick

Voici le code avec les modifs, mais en cours d'amelioration.

VB:
Sub TirerUneCarte()
    Dim Carte As Long, i As Byte
   
    P = P + 1: Carte = LAt.Aléat(P)
    Cells(4 + P, 3) = NomCarte(Carte)
    Cells(4 + P, 2).Value = Split(Cells(4 + P, 3), " de")(0)

    Select Case Cells(4 + P, 2)
    Case "as": num = 1
    Case "deux": num = 2
    Case "trois": num = 3
    Case "quatre": num = 4
    Case "cinq": num = 5
    Case "six": num = 6
    Case "sept": num = 7
    Case "huit": num = 8
    Case "neuf": num = 9
    Case Else
        num = 10
    End Select
    Cells(4 + P, 4).Value = num
    Range("d2") = Range("d5") + Range("d6") + Range("d7") + Range("d8") + Range("d9") + Range("d10")


    If Range("d2") > Range("b2") And Range("d2") < 21 Then Range("c3") = "La banque gagne !": Exit Sub
    If Range("d2") > Range("b2") And Range("d2") = 21 Then Range("c3") = "La banque gagne !": Exit Sub

    If Range("d2") > Range("b2") And Range("d2") > 21 Then Range("c3") = "Le joueur gagne !": Exit Sub
    If Range("d2") = Range("b2") And Range("d2") < 21 Then Range("c3") = "Egalité !": Exit Sub

    If Range("b5") = "as" And Range("b6") = "dix" Then Range("d2") = Range("d2") + 10: Range("c2") = "BLACK JACK": Exit Sub
    If Range("b5") = "dix" And Range("b6") = "as" Then Range("d2") = Range("d2") + 10: Range("c2") = "BLACK JACK": Exit Sub

    If Range("b5") = "as" And Range("b6") = "valet" Then Range("d2") = Range("d2") + 10: Range("c2") = "BLACK JACK": Exit Sub
    If Range("b5") = "valet" And Range("b6") = "as" Then Range("d2") = Range("d2") + 10: Range("c2") = "BLACK JACK": Exit Sub

    If Range("b5") = "as" And Range("b6") = "dame" Then Range("d2") = Range("d2") + 10: Range("c2") = "BLACK JACK": Exit Sub
    If Range("b5") = "dame" And Range("b6") = "as" Then Range("d2") = Range("d2") + 10:  Range("c2") = "BLACK JACK": Exit Sub

    If Range("b5") = "as" And Range("b6") = "rois" Then Range("d2") = Range("d2") + 10:  Range("c2") = "BLACK JACK": Exit Sub
    If Range("b5") = "rois" And Range("b6") = "as" Then Range("d2") = Range("d2") + 10:  Range("c2") = "BLACK JACK": Exit Sub

    If Range("b5") = "as" And Range("d2") <= 11 Then Range("d2") = Range("d2") + 10
    If Range("b6") = "as" And Range("d2") <= 11 Then Range("d2") = Range("d2") + 10
    If Range("b7") = "as" And Range("d2") <= 11 Then Range("d2") = Range("d2") + 10
    If Range("b8") = "as" And Range("d2") <= 11 Then Range("d2") = Range("d2") + 10
    If Range("b9") = "as" And Range("d2") <= 11 Then Range("d2") = Range("d2") + 10
    If Range("b10") = "as" And Range("d2") <= 11 Then Range("d2") = Range("d2") + 10

    If Range("d2") > 20 And Range("d2") <= 24 Then Exit Sub


    If P < 7 Then Application.OnTime Now + TimeSerial(0, 0, 1), "TirerUneCarte"

End Sub
 

Pièces jointes

  • Classeur1.xlsm
    31.1 KB · Affichages: 4

Lone-wolf

XLDnaute Barbatruc
Bonjour Dranreb,

je suis à des milliers de kilomètres d'être doué comme toi, et en conséquence je fais les choses au plus simple.:( Il y a peu de temps, je me suis intêressé à Select Case qui est plus sûr et éfficace; et je l'utilise de façon basic, n'étant pas un farouche programmeur. Comme je peux le constater, il y a encore plus simple, mais il m'est impossible d'en arriver là, vu mon niveau.

Sans vouloir abuser, pourrais-tu me montrer comment simplifier ceci. C'est un code pris sur un ancien fichier fait avec des label's. Personnellement, j'aimerais le modifier en Select Case, mais si tu as un meilleur exemple à me donner, ce serait sympa de ta part. Merci d'avance.

VB:
        If Range("b2") < 21 And Range("b2") > Range("d2") Then
            Range("c3") = "Le joueur gagne"
            Range("l22") = Range("l22") + Range("l25")
        ElseIf Range("d2") > 21 And Range("b2") < 21 Then
            Range("c3") = "Le joueur gagne"
            Range("l22") = Range("l22") + Range("l25")
        ElseIf Range("d2") > 21 And Range("d2") < 21 Then
            Range("c3") = "Le joueur gagne"
            Range("l22") = Range("l22") + Range("l25")
        ElseIf Range("b2") = 21 And Range("d2") <> 21 Then
            Range("c3") = "Le joueur gagne"
            Range("l22") = Range("l22") + Range("l25") + (Range("l22") / 2)  '<- mise de départ ex.: 100.  Partage en deux entre la banque et le joueur.
        ElseIf Range("d2") = 21 And Range("b2") <> 21 Then
            Range("c3") = "La banque gagne"
            Range("l22") = Range("l22") - Range("l25")
        ElseIf Range("d2") < 21 And Range("d2") > Range("b2") Then
            Range("c3") = "La banque gagne"
            Range("l22") = Range("l22") - Range("l25")
        ElseIf Range("b2") > 21 And Range("d2") < 21 Then
            Range("c3") = "La banque gagne"
            Range("l22") = Range("l22") - Range("l25")
        ElseIf Range("b2") = 21 And Range("d2") = 21 Then
            Range("c3") = "Égalité"
        ElseIf Range("d2") = Range("b2") Then
            Range("c3") = "Égalité"
        End If
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 366
Messages
2 087 639
Membres
103 627
dernier inscrit
nabil