[英]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。
在位級別上,計算機將該信息分別存儲為1
或0
。
在 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 時, 1
和Not(1)
都變為 True,從而導致您的問題。
我建議考慮將您的系統更改為使用 0 和 -1,或者編寫一個小型轉換器 function 以保持對齊。
注意:我已經把我的 memory 拉得比我在回答上述問題時想承認的更遠,所以如果我離開學校后某些語言或理解發生了變化,請原諒我(當時 8 位是常態) - 但我認為這一切仍然成立。 我注意到 SQL 位列的工作方式不同,例如由於它們的存儲方式,但這不是這里的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.