2015-10-06 146 views
2
Sub variable() 
Dim data As Integer 
Dim square As Integer 
Dim num As String 
End Sub 

Private Sub CommandButton1_Click() 
num = InputBox("Give me the number!", "Your number") 
data = CInt(num) 
End Sub 

Private Sub CommandButton2_Click() 
square = (data^2) 
MsgBox ("The result: " & square) 
End Sub 

任何人都可以幫助我嗎?謝謝。 結果不是正確的數字。一直是0。這個VBA代碼有什麼問題?

+2

將您的變量拉出子變量。只需將它們自己放置即可。快速搜索找到[this](http://stackoverflow.com/questions/2722146/how-do-i-declare-a-global-variable-in-vba)。 –

+0

謝謝。你的解決方案很好。 – neofini

回答

1

代碼有兩個問題:您不需要變量聲明,而且您的變量的作用域與預期不同。

在Visual Basic編輯器中,選擇工具 - 選項並選中需要變量聲明。這將自動包括Option Explicit在任何新模塊的頂部。不幸的是,對於現有的模塊,您必須自己在頂部輸入Option Explicit

如果您需要變量聲明,編譯器會告訴您何時使用不在範圍內的變量。它會告訴你(以你爲例)Variable not defined並突出顯示num(因爲它是第一個)。這將有助於您在將來識別這些類型的問題。

顯然你打算聲明你的變量,你只是沒有在正確的位置聲明它們。您的變量可以有三個範圍:本地,模塊,全局。您總是希望使用適合您代碼的最小範圍。所以使用本地,除非你需要使用模塊。並且使用模塊,除非全球是絕對必要的。這裏的範圍是如何工作的:

本地 - 使用Dim過程中(SubEnd Sub或同等之間)。該過程之外沒有任何東西可以看到或更改變量。

模塊 - 使用PrivateDim也可以)位於模塊頂部,在任何程序之外。現在該模塊中的所有程序都可以看到並使用該變量。其他模塊中的程序不能。

全球 - 使用PublicGlobal也適用)以標準模塊(而不是類模塊,像的ThisWorkbook,Sheet1中,Userform1,或1類)的頂部。項目中的每個過程都可以看到並設置此變量。

對於您的情況,您應該使用模塊範圍變量。您的事件子目錄位於相同的模塊中,並且它們是使用這些變量的唯一子目錄。如果模塊外部的過程需要使用該變量,則可能需要將其移至標準模塊並用Public聲明。但是,作爲最後的手段。還有其他選項,比如將變量作爲參數傳遞,比使用全局作用域變量更好。

還有兩件事:如果您使用Application.InputBox(),您可以指定一個確保用戶輸入數字的類型。如果您想繼續使用InputBox()功能,那麼CInt將在用戶輸入任何不能強制爲數字的內容時出錯。在這種情況下,請考慮使用Val函數。