Tout d'abord, le L'opérateur ne fonctionne pas correctement , exactement comme il se doit.
"Mais j'essaie de faire basculer la propriété .FitText dans une cellule de tableau (dans Word). .FitText commence par True..."
Pour basculer, cela fonctionne très bien :
If Selection.Cells(1).FitText Then
Selection.Cells(1).FitText = False
Else
Selection.Cells(1).FitText = True
End If
Quant à la raison pour laquelle vous ne voyez pas le résultat que vous attendiez, elle est liée au moulage de type, aux conversions de type implicites et au passage d'une valeur d'un type à une variable du même type. Dans votre cas, la propriété de la cellule est booléenne. Puisque vous explicitement définir le type de la variable réceptrice comme étant booléenne, non implicite est en cours : Le booléen X reçoit la valeur interne valeur de la propriété booléenne, qui ( Cindy Meister est correcte) s'est avérée être 1, et 1 s'évalue bien à Vrai en tant que variable booléenne.
Aujourd'hui, Mathieu Guindon a fait remarquer à juste titre que "Le -2 est dû au fait que les opérateurs logiques effectuent des opérations par bits..." . Donc, Not 1 = -2, et -2 s'évalue également à Vrai ; en effet, tout nombre stocké en interne pour une variable booléenne autre que 0 rend la valeur de cette variable Vrai comme dans un CBool(any_number_but_0) = True explicite.
Le problème est donc le passage de booléen à booléen de la valeur numérique 1 (la représentation interne) de l'un à l'autre. Vous devez forcer la réévaluation du type de variable implicitement ou explicitement, et tout fonctionnera comme vous le souhaitez :
' Illustration: a few possible solutions
Dim X As Variant
' implicit re-evauation
X = Selection.Cells(1).FitText ' X=True, a Variant sub-type Boolean, CInt(X)=-1
X = Not X ' X=False, CInt(X)=0
Dim X As Boolean
' explicit re-evaluation
X = Selection.Cells(1).FitTex ' X=True, CInt(X)=1
X = Not CBool(CInt(X)) ' X=False, CInt(X)=0
' explicit re-evaluation
X = Selection.Cells(1).FitText ' X=True, CInt(X)=1
X = Not CBool(CStr(X)) ' X=False, CInt(X)=0
' explicit and implicit (by the "+" operator) re-evaluation
X = Selection.Cells(1).FitText ' X=True, CInt(X)=1
X = Not (CBool(X) + 0) ' X=False, CInt(X)=0; same as Not (True + 0)
etc.
0 votes
Répondre à la clôture comme dupliqué par un badge d'or : Alors que l'autre question porte sur le moment où
Not
ne fonctionne pas comme prévu, il ne gère pas le pourquoi derrière ce comportement : Le modèle d'objet de Word ne se comporte pas selon les règles de VBA. Une discussion sur cet aspect est totalement absente de la question liée en double.2 votes
@Cindy Le "pourquoi" est exactement la même chose dans les deux cas. Il s'agit d'un problème classique avec Visual Basic et VBA.
False
est égal à 0 (tous les bits sont effacés), etTrue
est défini comme suitNot False
Cela pose également des problèmes d'interopérabilité avec WinAPI. Toute valeur non nulle est traitée commeTrue
Le problème ne se pose donc que si l'on commence à manipuler des bits sans comprendre ce qui se passe, ce qui est aggravé par l'absence de distinction entre les opérateurs logiques et les opérateurs bitwise. Je ne vois pas l'intérêt de rouvrir ce dossier alors que la cause première et la solution sont fondamentalement identiques.0 votes
@CindyMeister S'il n'avait pas déjà été expliqué ici que c'est le modèle d'objet de Word qui génère un message malformé, il n'y aurait pas de problème.
Boolean
J'aurais ajouté ce commentaire en plus du vote de clôture. Mais comme il y avait déjà une excellente réponse qui l'expliquait, je n'ai pas eu à le faire. La raison sous-jacente est identique, comme l'a mentionné Cody Gray, et en plus de cela, je vois la fermeture des doublons comme un moyen de relier les questions utiles entre elles plutôt que de punir le dernier demandeur.