2015-10-06 150 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函数。