Bonjour bonjour,

Alors, je veux faire appel aux puristes afin de m'améliorer.
Je ne rencontre pas de difficulté particulière avec ce qui suit, autant sur le fonctionnel que sur la vitesse d'exécution. Vous allez me dire, j'en conviens : "Alors, WTF ?!"
Et bien, c'est tout simplement pour savoir si je n'écris/ne développe pas n'importe quoi.

Pour résumer, j'ai une fonction (deux exactement) qui me retournent un Boolean en fonction des paramètres passés.
Il y a plusieurs conditions à respecter ce qui implique une multitude de If ... Else ... End If.

Ainsi, j'ai procédé de la manière suivante : dès que je trouve une condition non-passante, je fais un Carte_valide = False: Exit Function. "Carte_valide" est le nom de ma fonction.
Et donc, par opposition, si tous mes tests sont passants, j'ai un Carte_valide = True en toute fin de fonction.
Il m'arrive à plusieurs reprises de rentrer dans une boucle et d'en sortir par un Exit For ou, carrément, un Exit Function.

Je voudrais savoir si ce procédé est un procédé :
  • "optimisé",
  • "correct",
  • "admis",
  • "passable",
  • "à appliquer uniquement dans ce cas de figure"
... ou, à contrario :
  • "à ne pas reproduire",
  • "à changer de toute urgence",
  • "horrible",
  • "désastreux",
  • "va crever, tu ne comprends rien au VBA...".

Je vous mets mes fonctions ici, mais je ne suis pas sûr qu'elles vous serviront vraiment. C'est plutôt pour illustrer le contexte précédemment évoquer si je ne suis pas très clair dans mes explications, ce qui est très probable !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
Function Carte_valide(oNombre As String, oCouleur As String, oPlay As Byte) As Boolean
Dim i As Byte
 
'Si pas de carte encore appelée
If Carte_appelee.Couleur = "" Then
    'On set la carte appelée
    Carte_appelee.Nombre = oNombre
    Carte_appelee.Couleur = oCouleur
 
    'Et la carte max
    Carte_max.Nombre = oNombre
    Carte_max.Couleur = oCouleur
 
    'Et le joueur maitre
    Joueur_maitre = oPlay
 
'Si il y a une carte déjà appelée
Else
    'Est-ce que la carte jouée est de la même couleur que la carte appelée ?
    If oCouleur = Carte_appelee.Couleur Then
        'Si oui, la carte appelée (ou jouée) est-elle de l'atout ?
        If oAtout(1).Couleur = Carte_appelee.Couleur Then
            'Si oui, est-elle supérieure ?
            If Carte_superieure(oNombre, oCouleur, Carte_max.Nombre, Carte_max.Couleur) Then
                'On set la nouvelle carte max
                Carte_max.Nombre = oNombre
                Carte_max.Couleur = oCouleur
                'Et le nouveau joueur maitre
                Joueur_maitre = oPlay
 
            'sinon, vérifions que le joueur ne possède pas une carte supérieure dans son jeu
            Else
                For i = LBound(oJoueur, 2) To UBound(oJoueur, 2)
                    If Carte_superieure(oJoueur(oPlay, i).Nombre, oJoueur(oPlay, i).Couleur, Carte_max.Nombre, Carte_max.Couleur) Then
                        Carte_valide = False
                        Exit Function
                    End If
                Next i
            End If
        'Si la carte appelée (ou jouée) n'est pas de l'atout
        Else
            'Si la carte jouée est supérieure
            If Carte_superieure(oNombre, oCouleur, Carte_max.Nombre, Carte_max.Couleur) Then
                'On set la nouvelle carte max
                Carte_max.Nombre = oNombre
                Carte_max.Couleur = oCouleur
                'Et le nouveau joueur maitre
                Joueur_maitre = oPlay
            End If
        End If
    'Si la carte jouée n'est pas de la même couleur
    Else
        'On vérifie si je joueur n'a pas de la couleur appelée
        For i = LBound(oJoueur, 2) To UBound(oJoueur, 2)
            If oJoueur(oPlay, i).Couleur = Carte_appelee.Couleur Then
                Carte_valide = False
                Exit Function
            End If
        Next i
 
        'S'il n'a pas de la couleur appelée on regarde si son partenaire est maitre
        If Partenaire_maitre(oPlay) Then
            'On vérifie si la carte posée est supérieure
            If Carte_superieure(oNombre, oCouleur, Carte_max.Nombre, Carte_max.Couleur) Then
                'On set la nouvelle carte max
                Carte_max.Nombre = oNombre
                Carte_max.Couleur = oCouleur
                'Et le nouveau joueur maitre
                Joueur_maitre = oPlay
            End If
        'Si le partenaire n'est pas maitre
        Else
            'Joue-t-il de l'atout ?
            If oCouleur = oAtout(1).Couleur Then
                'S'il joue de l'atout, il doit être supérieure à la carte max
                If Carte_superieure(oNombre, oCouleur, Carte_max.Nombre, Carte_max.Couleur) Then
                    'On set la nouvelle carte max
                    Carte_max.Nombre = oNombre
                    Carte_max.Couleur = oCouleur
                    'Et le nouveau joueur maitre
                    Joueur_maitre = oPlay
                'S'il n'est pas suppérieur à la carte max
                Else
                    'On vérifie que le joueur n'a pas de plus grande carte d'atout
                    For i = LBound(oJoueur, 2) To UBound(oJoueur, 2)
                        If oJoueur(oPlay, i).Couleur = oAtout(1).Couleur Then
                            If Carte_superieure(oJoueur(oPlay, i).Nombre, oJoueur(oPlay, i).Couleur, Carte_max.Nombre, Carte_max.Couleur) Then
                                Carte_valide = False
                                Exit Function
                            End If
                        End If
                    Next i
                End If
            'S'il ne joue pas d'atout
            Else
                'A-t-il de l'atout ?
                For i = LBound(oJoueur, 2) To UBound(oJoueur, 2)
                    If oJoueur(oPlay, i).Couleur = oAtout(1).Couleur Then
                        Carte_valide = False
                        Exit Function
                    End If
                Next i
            End If
        End If
    End If
End If
 
'Si on passe tous les "Exit Function", la carte est valide
Carte_valide = True
 
'Et on la supprime du jeu du joueur
For i = LBound(oJoueur, 2) To UBound(oJoueur, 2)
    If oNombre = oJoueur(oPlay, i).Nombre And oCouleur = oJoueur(oPlay, i).Couleur Then
        oJoueur(oPlay, i).Nombre = ""
        oJoueur(oPlay, i).Couleur = ""
        Exit For
    End If
Next i
 
End Function
 
Function Carte_superieure(oNom_joue As String, oCoul_joue As String, oNom_comp As String, oCoul_comp As String) As Boolean
Dim i As Byte
 
''Si les arguments sont manquants, on les remplace avec la carte appelée (à faire disparaitre ?)
'If IsMissing(oCoul_comp) Or IsMissing(oNom_comp) Then
'    oCoul_comp = Carte_appelee.Couleur
'    oNom_comp = Carte_appelee.Nombre
'End If
 
'Si la couleur de la carte jouée est égale à la couleur de la carte comparée
If oCoul_joue = oCoul_comp Then
    'On regarde si c'est de l'atout
    If oAtout(1).Couleur = oCoul_joue Then
        'Si c'est de l'atout, on regarde la table oAtout
        For i = LBound(oAtout) To UBound(oAtout)
            'En parcourant, tombe-t-on sur la carte jouée ?
            If oNom_joue = oAtout(i).Nombre Then
                Carte_superieure = True
                Exit Function
            '... ou la carte comparée ?
            ElseIf oNom_comp = oAtout(i).Nombre Then
                Carte_superieure = False
                Exit Function
            End If
        Next i
    Else
        'Si c'est hors-atout, on regarde la table oNombres
        For i = LBound(oNombres) To UBound(oNombres)
            'En parcourant, tombe-t-on sur la carte jouée ?
            If oNom_joue = oNombres(i) Then
                Carte_superieure = True
                Exit Function
            '... ou la carte comparée ?
            ElseIf oNom_comp = oNombres(i) Then
                Carte_superieure = False
                Exit Function
            End If
        Next i
    End If
'Si la couleur de la carte jouée est différente de celle de la carte comparée
Else
    'Est-ce que la carte comparée est de l'atout ?
    If oCoul_comp = oAtout(1).Couleur Then
        'Si oui, la carte comparée est supérieure
        Carte_superieure = False
        Exit Function
    'Est-ce que la carte jouée est de l'atout ?
    ElseIf oCoul_joue = oAtout(1).Couleur Then
        'Si oui, la carte jouée est supérieure
        Carte_superieure = True
        Exit Function
    'Est-ce que la couleur carte comparée est égale à celle de la couleur appelée ?
    ElseIf oCoul_comp = Carte_appelee.Couleur Then
        'Si oui, la carte comparée est supérieure
        Carte_superieure = False
        Exit Function
    'Est-ce que la couleur carte jouée est égale à celle de la couleur appelée ?
    ElseIf oCoul_joue = Carte_appelee.Couleur Then
        'Si oui, la carte jouée est supérieure
        Carte_superieure = True
        Exit Function
    Else
        'On met "False" si les deux couleurs sont ni appelée ni de l'atout (il y aura forcément une autre carte plus forte)
        Carte_superieure = False
    End If
End If
 
End Function
Je remercie par avance les puristes et pros VBA pour la soufflante que je vais me prendre !

Je reste disponible pour tout complément.

Cordialement,
Kimy