簡體   English   中英

VBA IF NOT [function] then [code] 運行代碼,不管 function output

[英]VBA IF NOT [function] then [code] runs code regardless of function output

我寫了以下代碼:

Sub iojh()

If Not foo() Then MsgBox ("hi")

End Sub

Function foo() As Integer
foo = 0
End Function

它在 foo = 0 和 foo = 1 時顯示 msgbox。這是為什么呢? 我找到了使用 If Else 語句的解決方法,但我想知道發生了什么以及是否有更好的解決方案。 這是我的解決方法:

Sub iojh()

If foo() Then
    '
Else
    MsgBox ("hi")
End If

End Sub

Function foo() As Integer
foo = 1
End Function

Delcare foo() function 作為`布爾類型。 嘗試-

Sub iojh()
    If Not foo() Then MsgBox ("hi")
End Sub

Function foo() As Boolean
    foo = 0
End Function

Boolean 值為 True 或 False。

在位級別上,計算機將該信息分別存儲為10

在 vba 中,True = -1 和 False = 0 - 但是.. 為什么?

然而,幾乎所有的計算機系統都以 8 位及其倍數的模式保存它們的位。 為了便於顯示,讓我們考慮一個 8 位系統 - 其中數據存儲在一個字節中:

0 = False作為一個位,變為00000000作為一個字節 - 全部關閉。

1 = True作為一個位,變為11111111作為一個字節 - 全部打開。

如您所見, True字節中的所有位都被翻轉。

要記住的另一件事是,在這種情況下,這些字節使用“符號幅度”表示,最左邊的位用作符號(+ve 或 -ve)。 因此,當字節包含11111111時,當轉換回十進制時,結果為-1

另一種思考方式:將 1 添加到11111111將導致00000000丟失額外的位,因此從00000000中減去 1 會導致11111111

十進制1寫入boolean

當您將1寫入 vba 中的 boolean 數據類型時,它必須表示為全零: 00000000 ,或全一: 11111111 轉換設置為11111111 看起來,將任何位寫入該值會導致所有位變為“1” - 導致 output 為True

不寫入(十進制1)到 boolean

但是,當您將Not (1)寫入(或測試)到 boolean 時,首先執行Not操作數。 但是,將這些數字視為位, 1 = 00000001 ,因此Not (1) = 11111110 同樣,根據上述規則,由於至少有 1(在本例中為 7)位處於打開狀態,因此全部打開 這個結果是True的 output 。

如您所見,當轉換為 boolean 時, 1Not(1)都變為 True,從而導致您的問題。

我建議考慮將您的系統更改為使用 0 和 -1,或者編寫一個小型轉換器 function 以保持對齊。

注意:我已經把我的 memory 拉得比我在回答上述問題時想承認的更遠,所以如果我離開學校后某些語言或理解發生了變化,請原諒我(當時 8 位是常態) - 但我認為這一切仍然成立。 我注意到 SQL 位列的工作方式不同,例如由於它們的存儲方式,但這不是這里的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM