2015-11-08 32 views
2

我似乎無法理解的第二行:VBA Cbool是什麼意思? (在實際英語)

If Not CBool(GetKeyState(vbKeyRButton) And &H8000) 

你是善良,請解釋一下,這是用簡單的英語說? 所有我能理解的是「如果不是」和「和」 我對這裏的所有VBA奇才都有堅定的信念!請幫幫我!

完整的代碼如下:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) 

If Not CBool(GetKeyState(vbKeyRButton) And &H8000) Then 

    If IsEmpty(strBoardSize) Then 
     Exit Sub 
    End If 
Else 
End if 
Sub end 

strBoardSize是一個表的大小是預先

Dim strBoardSize as string 
+2

請注意,在這種情況下'和'是[按位](https://en.wikipedia.org/wiki/Bitwise_operation#AND)。我一直對VB/VBA爲什麼在邏輯和按位使用相同的關鍵字時感到困惑...... – Comintern

回答

2

根據這一page時,CBool​​函數方法需要任何投入和嘗試做一個布爾值的比較。

所以,在英語:

If the value returned by (GetKeyState(vbKeyRButton) And &H8000) is not true, then: 
    If IsEmpty(strBoardSize) Then 
     Exit Sub 
    End If 
Else 
End if 

另一種方式來看待這個是:

Dim LCompare as Boolean 
LCompare = CBool(GetKeyState(vbKeyRButton) And &H8000) 'Sets the value returned from CBool in LCompare 
If Not LCompare Then 
    If IsEmpty(strBoardSize) Then 
     Exit Sub 
    End If 
Else 
End if 

other article解釋什麼函數GetKeyState輸入以及它們如何影響位運算符回事。

希望這有助於了一下......

+0

謝謝!我現在明白「cBool」這個大概念是什麼,但仍然無法讓我的腦袋纏繞在&H8000上。文章說這是一個價值,但它的目的是什麼? – Yong

+1

從第二篇文章「&H8000 = decimal 32768」。它是一個定義的數字,用於對返回的keystate值執行按位操作。但是,我無法在VBA中逐位加速,因此您可能需要將其作爲單獨的問題發佈。 –

1

CBool​​將字面意思是「轉換到布爾」(它是一個鑄造),因爲GetKeyState和& H8000不是類型布爾值,它需要轉換或轉換。

If Not CBool(GetKeyState(vbKeyRButton) And &H8000) 

因此,對於你的代碼就意味着:

If vbKeyRButton AND &H8000 are both false then ... 

對於代碼的其餘部分,

If IsEmpty(strBoardSize) 

這用來檢查字符串strBoardSize是空的。 所以它如果strBoardSize是空去到下一行代碼,否則結束if語句,去到別的(但你必須什麼都沒有)

+0

不,「GetKeyState(vbKeyRButton)和&H8000」是一個按位與。GetKeyState返回一些16位整數值。 GetKeyState(vbKeyRButton)如果此整數的高位已設置,&H8000的計算結果爲&H8000(32768),否則計算爲0。 CBool​​將非零值32768轉換爲布爾值TRUE,並將0值轉換爲FALSE。 –

2

函數GetKeyState是https://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).aspx描述Windows API函數。它返回一個整數,如前所述,「如果高位是1,則關鍵是關閉,否則關閉。」 (在這裏,感興趣的關鍵是鼠標右鍵,通過恆定vbKeyRButton指定。)

的& H8000僅與高階位組的整數,所以操作返回0或& H8000。 & H8000是高階位的掩碼(以白話文表示)。

CBool​​函數將0轉換爲False並將任何非零值轉換爲True,所以在這裏,如果按下該鍵則返回True,否則返回False。

+0

另外,'IsEmpty(someString)'不是空字符串的有效測試。使用'如果Len(someString)= 0那麼' – shg