首页 > 解决方案 > VBA:为什么 Not 运算符会停止工作?

问题描述

这让我彻底懵了。

Sub testChangeBoolean()
  Dim X As Boolean       ' default value is False
  X = True               ' X is now True
  X = Not X              ' X is back to False
End Sub

但我试图在表格单元格(在 Word 中)中切换 .FitText 属性。.FitText 以 True 开头。

如果我将其分配给 X:

Sub testChangeBoolean()
  Dim X As Boolean                  ' again, default is False
  X = Selection.Cells(1).FitText    ' does set X to True
  X = Not X                         ' X is still True!
End Sub

我只是不明白我做错了什么。

标签: vbams-wordboolean-operations

解决方案


我相信解释与旧的编程语言(WordBasic 和早期的 VBA)如何存储 True 和 False 的整数值有关。在那些日子里,True = -1 和 False = 0。

较新的编程语言仍然使用 0 表示 False,但使用 1 表示 True。

大多数 Word 的布尔类型属性继续使用 -1 表示 True(例如,Font.Bold),这导致使用新语言的 Interop 的程序员感到困惑和沮丧。因此,在某些时候,微软的一些开发人员决定使用新方法并将整数值 1 分配给 True 以获得一些新功能。比如FitText

考虑以下代码示例,其中X是类型Booleany类型Integer

  • 如果FitText为 True,则整数值为 1
  • 如果反转值,则 usingNot表明布尔值保持“真”,因为它的整数值不是 0,而是 -2
  • 将整数值直接设置为 True 给出 -1

这确实令人困惑,但确实解释了为什么Not没有给出预期的结果。

Sub testChangeBoolean()
  Dim X As Boolean                  ' again, default is False
  Dim Y As Integer
  X = Selection.Cells(1).FitText    ' does set X to True
  Y = Selection.Cells(1).FitText
  Debug.Print X, Y                  ' result: True    1
  X = Not X                         ' X is still True!
  Y = Not Y
  Debug.Print X, Y                  ' result: True   -2
  X = False
  Y = True
  Debug.Print X, Y                  ' result: False  -1
End Sub

推荐阅读