不会退出执行循环

戴夫

有人可以告诉我为什么这段代码永远不会退出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)

有几种解决方案:

  1. 将IsWindowEnabled声明为Long(我认为这是最好的解决方案):

    公开声明函数IsWindowEnabled库“USER32”(BYVAL的hWnd长)随着

  2. 声明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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

执行bash脚本循环而不会错误退出

来自分类Dev

同时执行循环不会在C中退出

来自分类Dev

循环不会退出循环吗?

来自分类Dev

While循环不会退出Java

来自分类Dev

JavaScript不会退出while循环

来自分类Dev

代码不会退出 while 循环

来自分类Dev

C - while 循环不会退出

来自分类Dev

For循环不会执行

来自分类Dev

启动 StepFunction 并退出不会触发执行

来自分类Dev

Bash脚本不会循环退出

来自分类Dev

要求时,Python While循环不会退出

来自分类Dev

程序不会退出do-while循环

来自分类Dev

Javascript 递归,foreach 循环不会退出?

来自分类Dev

Python进程不会在GTK循环退出时退出

来自分类Dev

foreach循环不会继续执行

来自分类Dev

PHP:For循环将不会执行

来自分类Dev

在退出循环Java时执行method()

来自分类Dev

While循环内while循环无济于事。不会退出

来自分类Dev

片段进入和退出转换不会同时执行

来自分类Dev

片段进入和退出转换不会同时执行

来自分类Dev

类中的while循环不会执行c ++

来自分类Dev

内部嵌套的while循环不会执行

来自分类Dev

循环不会在R中执行

来自分类Dev

Java for循环中的return语句不会退出方法

来自分类Dev

由于QCoreApplication事件循环,QThread永远不会退出

来自分类Dev

Python的while循环不会退出(初学者)

来自分类Dev

试图在python中创建菜单但循环不会退出

来自分类Dev

Break语句不会退出JavaScript中的所有嵌套循环

来自分类Dev

猫鼬退出.map(...)循环后不会保存数组