Couleur d’une case en VBA

jeudi 14 juillet 2011
par  Matt
popularité : 4%

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 ([bleu marine]square[/bleu marine]) est blanche ([bleu marine]True[/bleu marine]) ou noire ([bleu marine]False[/bleu marine]).

           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 "[bleu marine]le fonctionnement de l’opérateur And[/bleu marine]", 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 ([bleu marine]bitwise[/bleu marine]) :
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 ([bleu marine]bitwise[/bleu marine]) : 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


Brèves

Championnat jeunes 2018

dimanche 25 février 2018

A St Sernin sur Rance, Vadim Breton se qualifie pour le championnat de France jeunes. Il termine à la 4ème place des benjamins. http://echecs-occitanie.com/spip.php?article382&mode=AF

Les Jeunes qualifiés en NIII !

mercredi 14 décembre 2016

Dimanche 11 décembre 2016, aux interclubs jeunes à Leguevin, notre équipe a gagné un match et fait match nul aux deux autres.

L’équipe composée de Xavier, Vadim, Aurélie et Titouan termine 8ème et se qualifie pour la N3. A noter que Xavier et Vadim ont gagné toutes leurs parties.

Sur le Web : Site de la LMPE

Championnat jeunes

lundi 5 décembre 2016

Xavier, Vadim et Martin trois champions du Tarn et Garonne
Lire l’article

Coupe Loubatière

lundi 5 décembre 2016

Le club qualifié pour la phase régionale de la coupe Loubatière
Lire l’article

Sur le Web : Coupe Loubatière

Tournoi interne 2016-2017

lundi 5 décembre 2016

C’est reparti pour le tournoi interne : 1 partie par mois de novembre à mai
Lire l’article

Live Playchess.com

mercredi 7 septembre 2016