Couleur d’une case en VBA

Couleur blanche ou noire de la case : And, Xor, Selection, ColorIndex.

Couleur blanche ou noire de la case : And, Xor, Selection, ColorIndex.


Dans le code de l’affichage de l’échiquier, on se situe dans la boucle For Next la plus imbriquée qui parcourt les colonnes pour la rangée courante. La cellule courante, représentant la case, ayant été sélectionnée, on va pouvoir changer sa couleur de fond (blanche ou noire).

Résolvons le problème suivant : à partir des coordonnées de la case, déterminez sa couleur. Fort heureusement la couleur d’une case est indépendante de l’orientation de l’échiquier.

La case courante est-elle blanche ?

isSqrWhite est une variable locale de type Boolean. Elle signifie est-ce que la case courante (square) est blanche (True) ou noire (False).

            isSqrWhite = (indFile And 1) Xor (indRank And 1)

L’expression utilise l’opérateur binaire Xor entre deux expressions parenthésées basées autour de l’opérateur binaire And.

Représentation numérique en base 2

Le fonctionnement des opérateurs binaires And et Xor mérite un développement que l’on peut trouver disproportionné concernant une seule ligne de code VBA.

Cependant avec la représentation de l’échiquier dans une String BordBuild(), on peut se poser la question : peut-on faire plus court en terme d’occupation mémoire ? Ce serait la représentation la plus compacte possible si on pouvait représenter les 64 cases de l’échiquier au niveau binaire dans une seule variable 64-bit ! 1 bit = 1 case. Tout dépendra de ce que ce bit peut symboliser. Y a t’il une pièce ou la case est-elle vide ? Est-ce les pions des Blancs ou non ?

Un des fondements de l’informatique est donc la représentation des nombres en base 2. En hardware, le courant passe dans la diode ou pas ? L’interrupteur est ouvert ou non ?

3 = 2 * 1 + 1 soit "0011" en base 2.

4 = 2 * 1 + 0 soit "0010" en base 2.

Opérateur And bit à bit

On avait établi la table de vérité du And dans Mise au point avec le débogueur VBA, le chapitre "le fonctionnement de l’opérateur And", sauf qu’ici les paramètres du And ne sont pas des Boolean mais des Byte : la variable indFile ou indRank et la constante numérique 1. La table de vérité du And s’applique mais au niveau binaire (en base 2).

Considérez que l’expression (indFile And 1) signifie est-ce que la colonne indFile est impaire. Idem pour (indRank And 1), est-ce que la rangée est impaire ?

3 en base 10 est "0000 0011" en base 2.

1 en base 10 est "0000 0001" en base 2.

VBA n’a pas de préfixe syntaxique pour indiquer qu’un nombre est en base 2. Il n’y a pas à reproduire ce qui suit dans la fenêtre d’Exécution car il n’y a pas de " ?".

Base 2      Base 10
0000 0011 = 3
0000 0001 = 1
------------
0000 0001 = 3 And 1 = 1

Il faut lire verticalement colonne par colonne, bit à bit (bitwise) :
0 And 0 = 0. 1 And 0 = 0. 1 And 1 = 1.

Dans la fenêtre d’Exécution immédiate :

? 3 And 1

1

Interpréter le résultat par 3 est impair.

Base 2      Base 10
1111 1110 = 254
0000 0001 = 1
------------
0000 0000 = 254 And 1 = 0

Lire colonne de bit par colonne de bit verticalement (bitwise) : 1 And 0 = 0. 0 And 1 = 0.

? 254 And 1

0

Traduire par 254 n’est pas impair.


Conversion automatique numérique vers Boolean

On aurait pu convertir le résultat numérique 1 ou 0 du Xor en Boolean avec la fonction de conversion CBool(nombre) vers Boolean puisque la variable cible de l’affectation est de ce type.

            isSqrWhite = CBool((indFile And 1) Xor (indRank And 1))

Cependant VBA convertit automatiquement 0 en False et une valeur numérique non nulle en True.

? CBool(1)

True

? CBool(0)

False

? CBool(254)

True


Opérateur Xor

Dressons la table de vérité de l’opérateur logique Xor dans la fenêtre d’Exécution :

? False Xor False

False

? True Xor False

True

? False Xor True

True

? True Xor True

False

indFile impaire ?indRank impaire ?Xor
False False False
False True True
True False True
True True False
Table de vérité de l'opérateur logique Xor

Exemple :

indFile impaire ?indRank impaire ?Couleur de la caseCase
0 n’est pas impair (False) 0 n’est pas impair (False) Noire (False) a1
0 n’est pas impair (False) 1 est impair (True) Blanche (True) a2
1 est impair (True) 0 n’est pas impair (False) Blanche (True) b1
1 est impair (True) 1 est impair (True) Noire (False) b2

Changer la couleur de la case

Une fois la case sélectionnée par la méthode cellSqr.Select, on peut la manipuler via l’objet Selection indépendant de ce qui a été sélectionné. L’objet Selection comprend lui-même un objet Interior, lequel supporte la propriété ColorIndex.

En partie gauche du symbole d’affectation "=", la cible de l’affectation ne peut pas être une méthode d’un objet parce qu’une méthode c’est une action, c’est une Sub sans résultat ou une Function qui génère un résultat dans une expression en partie droite du "=".

Donc à gauche du "=", on ne peut avoir qu’une propriété si elle est en lecture / écriture.

En pratique, on a étudié ce que l’enregistrement de macro avait enregistré quand on change la couleur d’une cellule puis on a optimisé et adapté le code avec des noms de constante.

            Selection.Interior.ColorIndex = IIf(isSqrWhite, xlNone, colorFillBeige)

La fonction IIf() permet de factoriser l’affectation cible commune à la partie Then et à la partie Else d’un If sur une seule ligne. Cette instruction est équivalente à un If sur cinq lignes :

            If isSqrWhite Then
                Selection.Interior.ColorIndex = xlNone
            Else
                Selection.Interior.ColorIndex = colorFillBeige
            End If

Si la couleur de la case doit être blanche, alors mettre la couleur à xlNone (pas de couleur) une constante automatiquement définie par Excel VBA, sinon mettre la couleur à colorFillBeige, une constante que l’on a définie en début de module.


Précédent : VBA affiche l’échiquier

Suivant : La Tour sur la feuille de calcul

Posté le 14 juillet 2011 par Matt