XL 2013 Fonction ET ou OU imbriquée dans Select Case

Lone-wolf

XLDnaute Barbatruc
Bonjour le Forum, :)

Dans les formules on peu imbriquer plusieurs conditions avec Et ou Ou. Comment appliquer ET avec Select Case? J'ai écrit ceci:
Case Is > Val(PointsJoueur.Value), Is <= 21, met la macro n'en tiens pas compte.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je vous l'ai déjà dit.
Déjà mettez Rng devant les noms de variables As Range. PointsJoueur devrait être déclaré As Double
PointsJoureur = RngPntJoueur.Value
PointsOrdi = RngPntOrdi.Value
If PointsJoueur > 21 Then PointsJoueur = 0
If PointsOrdi > 21 Then PointsOrdi = 0
Select Case Sgn(PointsJoueur - PointsOrdi)
Case -1
Case 0
Case 1
 

Lone-wolf

XLDnaute Barbatruc
Bonjour Bernard,

d'accord. Mais pourquoi = 0. En image un cas de figure.

bj2.gif


Comment arrêter la macro à 15 ou au 5 de piques?? Voilà pourquoi l'importance de And. Si joueur à plus de 21 ET moi j'ai moins de 21, alors je m'arrête et totalise 15; suffisant pour gagner.
Parce-que c'est le loop ou application.ontime qui causent problème.
 

Lone-wolf

XLDnaute Barbatruc
Re,

Ok. Mais en vrai, tu as toujours 24 points sur la table et donc on ne peux pas afficher 0. La macro devrais stopper à 15 et non continuer.

Edit: les pointsJ et O font référence au cellules
With Sht
Set PointsJoueur = .Range("b3")
Set PointsOrdi = .Range("h3")

Je ne comprend pas pourquoi les mettre a Double. Ou alors je dois supprimer Set?
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Bonjour Bernard,

j'ai bizarrement un souci de doublons, comme tu peux le voir en image, ou que le joueur aie la même carte que l'ordi.

bj.gif


Celà, malgré le fait d'avoir créé de nouvelles variables qui font appel à ListAleat, et ajouté la fonction CartesJoueur, c'est la même que NomCarte, sauf que j'ai changé le nom.

Private LcJ As New ListeAleat
Private Ligne As Long, Num As Long, CJoueur As Long

En gros, j'ai fait 2 modules. Un pour le joueur et l'autre pour l'ordi.

Comment parer au problème?
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Utilisez le même ListeAléat pour les 2, évidemment, s'ils prennent des cartes différentes du même paquet.
Je propose la fonction commune CarteTirée qui renvoie un type personnalisé Carte à 3 éléments :
VB:
Private LAt As New ListeAléat, …
Type Carte: Nom As String: Valeur As Byte: Couleur As Byte: End Type
…
Function CarteTirée() As Carte
   Dim N As Long: N = LAt.Aléat
   If N = 0 Then MsgBox "Le paquet est épuisé.", vbCritical, "CarteTirée": End
   LAt.Supprimer N
   CarteTirée.Couleur = (N - 1) \ 13 + 1
   N = (N - 1) Mod 13 + 1
   CarteTirée.Nom = Choose(N, "as", "deux", "trois", "quatre", "cinq", _
      "six", "sept", "huit", "neuf", "dix", "valet", "dame", "roi") & " de " & _
      Choose(CarteTirée.Couleur, "cœur", "carreau", "pique", "trèfle")
   CarteTirée.Valeur = IIf(N > 10, 10, N)
   End Function
Sub TirerUneCarte()
   Dim Carte As Carte, …
   Carte = CarteTirée
  …
 

Dranreb

XLDnaute Barbatruc
Il n'y a pas lieu de préciser d'argument à la cette fonction CarteTirée. Elle fournit systématiquement le 1er de sa liste, mais l'en supprime aussitôt pour ne plus proposer le même à l'invocation suivante.
Ça devrait être plus simple comme ça, parce qu'avant cette variable P servait à 2 choses à la fois: comme numéro de ligne et comme rang dans la liste des numéros disponibles dans l'objet. Maintenant le numéro de ligne où vous voulez ranger son résultat se gère complètement à l'extéreur. C'est mieux puisque ça doit pouvoir aller dans 2 ensembles différents.
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re,

j'ai du mal à saisir, désolé. La première fonction qui sert à l'ordi, dois-je la gardé? Sinon voici le code.

VB:
Option Explicit

Private LAt As New ListeAleat
'Type Carte: Nom As String: Valeur As Byte: Couleur As Byte: End Type

Private P As Long, OrdNum As Long, Points As Double, derlig As Integer, i As Byte, t
Private Sh As Worksheet, Plage As Range, PointsOrdi As Range, PointsJoueur As Range, _
        Pl As Range, cel As Range, celP As Range

'Premier mélange pour la distribution des deux premières cartes.

Sub Tirage_Ordi()
    P = 0: OrdNum = 0: Points = 0
    Randomize
    LAt.Init 52
    Call Tirage_Cartes_Ordi
End Sub

    'Inscriptions des deux premières cartes de l'ordi dans la feuille "Jeu"

Sub Tirage_Cartes_Ordi()
    Dim Chemin As String, fichier As String
    Dim Carte
    
    Set Sh = Sheets(1)

    With Sh
        .Range("f7:h12").ClearContents
        Set Plage = .Range("h7:h12")
        Set PointsJoueur = .Range("b3")
        Set PointsOrdi = .Range("h3")

        P = .Cells(6, 6).Row

        While P < 8
            P = P + 1
            Carte = LAt.Aleat(P)
            .Cells(P, 7) = CartesOrdi(Carte)
            .Cells(P, 6) = Split(.Cells(P, 7), " de")(0)
            Select Case .Cells(P, 6)
            Case "as": OrdNum = 1
            Case "deux": OrdNum = 2
            Case "trois": OrdNum = 3
            Case "quatre": OrdNum = 4
            Case "cinq": OrdNum = 5
            Case "six": OrdNum = 6
            Case "sept": OrdNum = 7
            Case "huit": OrdNum = 8
            Case "neuf": OrdNum = 9
            Case Else
                OrdNum = 10
            End Select
            .Cells(P, 8) = OrdNum

            If Sh.Range("b3") <= 21 And Sh.Range("h3") > Sh.Range("b3") Or _
               Sh.Range("h3") > 21 Or Sh.Range("h3") = Sh.Range("b3") Then: Exit Sub
                t = Timer + 0.7: Do Until Timer > t: DoEvents: Loop
            Wend
            PointsOrdi.Value = WorksheetFunction.Sum(Plage)
        End With

        Select Case Sh.Cells(7, 8).Value
        Case Is = 1
            Select Case PointsOrdi
            Case Is <= 21
                PointsOrdi = Val(PointsOrdi) + 10
            Case Is > 21
                PointsOrdi = Val(PointsOrdi) - 10
            End Select
        End Select

        Select Case Sh.Cells(8, 8).Value
        Case Is = 1
            Select Case PointsOrdi
            Case Is <= 11
                PointsOrdi = Val(PointsOrdi) + 10
            Case Is > 11
                PointsOrdi = Val(PointsOrdi) - 10
            End Select
        End Select

    End Sub

'Inscriptions des cartes restantes dans la feuille "Jeu"
Sub Cartes_Ordi()
    Dim Carte

    Set Sh = Sheets(1)

    With Sh
        Set Plage = .Range("h7:h12")
        Set PointsOrdi = .Range("h3")
        Set PointsJoueur = .Range("b3")
        P = .Cells(8, 6).Row

        For i = 1 To 4
            If PointsJoueur > 21 And PointsOrdi <= 21 Then
                Exit Sub
            Else
                P = P + 1
                Carte = LAt.Aleat(P)
                .Cells(P, 7) = CartesOrdi(Carte)
                .Cells(P, 6) = Split(.Cells(P, 7), " de")(0)
                Select Case .Cells(P, 6)
                Case "as": OrdNum = 1
                Case "deux": OrdNum = 2
                Case "trois": OrdNum = 3
                Case "quatre": OrdNum = 4
                Case "cinq": OrdNum = 5
                Case "six": OrdNum = 6
                Case "sept": OrdNum = 7
                Case "huit": OrdNum = 8
                Case "neuf": OrdNum = 9
                Case Else
                    OrdNum = 10
                End Select
                .Cells(P, 8) = OrdNum

                Select Case Sh.Cells(P, 8).Value
                Case Is = 1
                    Select Case PointsOrdi
                    Case Is <= 21
                        PointsOrdi = Val(PointsOrdi) + 10
                    Case Is > 21
                        PointsOrdi = Val(PointsOrdi) - 10
                    End Select
                End Select

                PointsOrdi = WorksheetFunction.Sum(Sh.Range("h7:h12"))

                If Sh.Range("b3") <= 21 And Sh.Range("h3") > Sh.Range("b3") Or _
                   Sh.Range("h3") > 21 Or Sh.Range("h3") = Sh.Range("b3") Then: Exit For

                    t = Timer + 1: Do Until Timer > t: DoEvents: Loop
                End If
            Next i
        End With
    End Sub

Function CartesOrdi(ByVal N As Long) As String
    CartesOrdi = 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, "coeur", "carreau", "piques", "trèfle")
End Function

'Function CarteTiree() As Carte
'   Dim N As Long: N = LAt.Aleat
'   If N = 0 Then MsgBox "Le paquet est épuisé.", vbCritical, "CarteTiree": End
'   LAt.Supprimer N
'   CarteTiree.Couleur = (N - 1) \ 13 + 1
'   N = (N - 1) Mod 13 + 1
'   CarteTiree.Nom = Choose(N, "as", "deux", "trois", "quatre", "cinq", _
'      "six", "sept", "huit", "neuf", "dix", "valet", "dame", "roi") & " de " & _
'      Choose(CarteTiree.Couleur, "coeur", "carreau", "piques", "trèfle")
'   CarteTiree.Valeur = IIf(N > 10, 10, N)
'   End Function
 

Discussions similaires

Statistiques des forums

Discussions
312 370
Messages
2 087 689
Membres
103 639
dernier inscrit
NIEMASAFI