Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 "And" sur valeur numérique entière

Olic78124

XLDnaute Nouveau
Salut à toutes et à tous,

Je ne sais pas comment exprimer/formuler le sujet de la discussion, j'ai fait ce que j'ai pu

Je reprends encore et toujours le même fichier contenant des macros développées dans un garage et je tombe sur une palanquée de tests du genre :
If (Cells(liv, 17).Value And 2) = 2 Or (Cells(liv, 17).Value And 4) = 4 Or (Cells(liv, 17).Value And 8) = 8 Or (Cells(liv, 17).Value And 16) = 16 Then "CODE" End If

Ma question, car j'ai beau faire tourner le truc dans tous les sens, je ne vois pas ce que And a comme effet sur une cellule contenant des valeurs toujours entières (pas de décimales donc) !?

J'ai extrait chaque "Cells(liv, 17).Value And X" pour récupérer les résultats dans des variables qui dans l'exemple ci-dessus contiennent des fois 0, des fois 2, des fois 4, des fois 8, des fois 16... et je ne comprends pas à quoi ça sert :-(

Une petite explication simple serait la bienvenue.

D'avance merci.
Olivier
 
Dernière édition:

sousou

XLDnaute Barbatruc
bonjour
Il me semble que ca test des valeur numérique ou alphanumérique se terminant par 2 4 8 ou16
si il n'y à rien ou 0 devant le 2,le 4 ou le 8 ou le 16 d'une cellule
condition vrai si valeur=2 4 8 ou16
faux si 42 ou a2 .....
 

Olic78124

XLDnaute Nouveau
c'est ce que j'imaginais mais... j'ai fait quelques tests :
1 And 2 = 0 ' 1 ne se termine pas par 2 : OK
2 And 2 = 2 ' 2 se termine par 2 : OK
3 And 2 = 2 ' 3 ne se termine pas par 2 : On devrait avoir 0 ?
4 and 2 = 0 ' 4 ne se termine pas pas 2 : OK

Je n'explique pas le 3 And 2 avec cette logique
 

Olic78124

XLDnaute Nouveau
Bonjour Staple1600,

Message clairement reçu

J'ai simplifié car il y a des dizaines de lignes de codes qui se ressemblent toutes plus les unes que les autres avec des doublons dans tous les sens.
Je laisse l'utile, à savoir l'incrémentation de la variable add_DE qui est ensuite mise dans une feuille fraîchement créée puis testée avec ces fameux And que je ne comprends toujours pas

 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Olic78124
Tu aimes bien jouer avec le feu?
Ou tu veux tester la nouvelle mesure Pole Emploi pour les démissionnaires?

Relis le pavé de code que tu as posté
Et supprimes vite ce que le RGPD aurait du t'inciter à ne pas publier...

Sinon pour ton questionnement, est-ce que ce petit code éclaire ta lanterne ?
VB:
Sub PetitTest()
Dim t, i As Byte, x
t = Array(64, 23, "=TODAY()", 32, "a")
[A1].Select
For i = 0 To 4
[A1] = t(i)
[A1].NumberFormatLocal = "Standard"
On Error GoTo e_rr:
x = [A1] And 32
MsgBox x & Chr(13) & (([A1] And 32) = 32) & Chr(13) & Range("A1").FormulaLocal
Next
e_rr:
MsgBox "Valeur non numérique", vbCritical
Exit Sub
End Sub
 

Olic78124

XLDnaute Nouveau

J'étais persuadé d'avoir tout retiré... C'est ça de tout faire en courant !
Pour le code vu d'ici il ne me parle pas plus que ça, je regarde ce soir quand j'aurai mon PC dans le mains et je te dis quoi.
Merci
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

il s'agit d'un masque.
Considère tes nombres écrits en binaire, le AND est fait bit à bit.
Le faire avec une puissance de 2 (un seul bit de positionné donc) revient à masquer tous les autres bits en les passant à 0 pour tester le bit voulu.
3=2 => 11 AND 10 >= 10 => 2 => VRAI
Le bit de poids 1 (numérotés à partir de 0 de droite à gauche) est positionné.

Ta ligne teste donc si un des bits 1 à 4 est positionné : 11110
J'aurais plutôt écris ta ligne ainsi
VB:
if (Cells(liv, 17) ).Value And 2) Or (Cells(liv, 17) .Value And 4)  Or (Cells(liv, 17) .Value And 8)  Or (Cells(liv, 17) .Value And 16) then
les =x sont inutiles et embrouillent la lecture et la compréhension.

Et tant qu'on y est autant grouper tous les bits testés. Vu que 11110=30 :
Code:
if Cells(liv, 17) .Value And 30 then
donne le même résultat

Disons qu'avec les tailles mémoire qu'on a aujourd'hui, stocker plusieurs infos dans un mot binaire est un peu daté mais ça peut avoir son utilité.
eric
 
Dernière édition:

Olic78124

XLDnaute Nouveau

D'où le bout de code qui, en fonction de ce qui a été modifié, vient additionner les valeurs 2,4,8,16... à add_DE ! J'ai compris le principe merci Eriiiic pour ces explications claires et limpides.
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…