有人可以告诉我为什么这段代码永远不会退出Do循环吗?我设法提出了解决方案,但是我对为什么它无法按原样工作感到困惑。在Excel 2003或2010下运行的结果相同。
Public Declare Function EnableWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal fEnable As Long) As Long
Public Declare Function IsWindowEnabled Lib "user32" (ByVal hWnd As Long) As Boolean
Sub test()
Dim b As Boolean, h As Long
h = FindWindow("xlmain", Application.Caption)
Do
EnableWindow h, True
b = IsWindowEnabled(h)
Loop Until b = True
End Sub
这是一篇非常有趣的文章,我相信这是解决您的问题的关键:
http://blogs.msdn.com/b/oldnewthing/archive/2004/12/22/329884.aspx
基本上说,不同的编码语言以不同的方式表示布尔。
在后台,布尔实际上是一个数字变量。
在vba中,False的值表示为(-1)。
您可以通过以下方法对此进行测试:
Public sub TestBool
dim b as boolean
b = 1
msgbox cint(b) '->> the result will be -1, not 1
End sub
如上所示,vba在“ b = 1”行中进行了从1到-1的秘密转换。然而,我敢打赌,当你声明IsWindowEnabled布尔,因为这是外部代码,VBA不会为你做的“繁重”,并没有做上述转换(我猜IsWindowEnabled是用C写的,在那里他们的布尔表示为1)。
因此,在这一行中:
Loop Until b = True
实际发生的情况是:
Loop until 1 = -1
您可以通过在“循环直到”之前添加以下行来进行测试:
msgbox clng(b) & " " & clng(True)
有几种解决方案:
将IsWindowEnabled声明为Long(我认为这是最好的解决方案):
公开声明函数IsWindowEnabled库“USER32”(BYVAL的hWnd长)随着龙
声明b为变体(到目前为止,尚可,尚不确定原因):
昏暗b
-EDIT(30.3.15)-这是一小段子来演示此问题:
私有声明函数IsWindowEnabled Lib“ user32”(ByVal hWnd一样长)为布尔值
Private Sub Demo_API_true_in_VBA()
Dim b As Boolean
Dim b2 As Boolean
b = 1
Debug.Print "b = 1 : " & "Clng(b)=" & CLng(b) & " b=" & b
'result- b = 1 : Clng(b)=-1 b=True
b = -1
Debug.Print "b = -1: " & "Clng(b)=" & CLng(b) & " b=" & b
'result- b = -1: Clng(b)=-1 b=True
Debug.Print
b2 = IsWindowEnabled(Application.hWnd)
Debug.Print "b2 = IsWindowEnabled() : " & "Clng(b2)=" & CLng(b2) & " b2=" & b2
'result- b2 = IsWindowEnabled() : Clng(b2)=1 b2=True
' NOTE HERE THAT b2 equels to 1, not to -1 !!!
Debug.Print
Debug.Print "b = " & b & " ; " & "b2 = " & b2 ' both will **appear** as True
'result- b = True ; b2 = True
Debug.Print
' However, the result of the comparison here will be False !!!
' because vba actually does a numerical comparison, and 1 <> -1 .
Debug.Print "Is b = b2 ? " & CStr(b = b2)
'result- Is b = b2 ? False
End Sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句