这个VBA代码有什么问题?

时间:2015-10-06 19:07:20

标签: excel vba

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。

1 个答案:

答案 0 :(得分:1)

代码存在两个问题:您不需要变量声明,并且您的变量范围与预期不同。

在Visual Basic编辑器中,选择“工具” - “选项”,然后选中“需要变量声明”。这将自动包含Option Explicit在任何新模块的顶部。不幸的是,对于现有模块,您必须自己在顶部键入Option Explicit

如果需要变量声明,编译器会告诉您何时使用不在范围内的变量。它会告诉你(在你的例子中)Variable not defined并突出显示num(因为它是第一个)。这有助于您将来识别这些类型的问题。

显然,您打算声明您的变量,您只是没有在正确的位置声明它们。您的变量可以有三个范围:local,module,global。您总是希望使用适合您代码的最小范围。所以使用local,除非你需要使用模块。除非全局是绝对必要的,否则使用模块。以下是范围的解决方法:

本地 - 在程序中使用Dim(在SubEnd Sub之间或等效)。该程序之外的任何内容都无法查看或更改变量。

模块 - 在任何程序之外的模块顶部使用PrivateDim也可以)。现在该模块中的所有过程都可以查看和使用该变量。其他模块中的程序不能。

全局 - 使用PublicGlobal也可以)在标准模块的顶部(不是类模块,如ThisWorkbook,Sheet1,Userform1或Class1) 。项目中的每个过程都可以查看和设置此变量。

对于您的情况,您应该使用模块范围的变量。您的事件子服务器位于同一模块中,它们是使用这些变量的唯一子服务器。如果模块外部的过程需要使用变量,则可能需要将其移动到标准模块并使用Public进行声明。但这是最后的手段。还有其他选项,比如将变量作为参数传递,比使用全局范围变量更好。

还有两件事:如果您使用Application.InputBox(),您可以指定一个类型,以确保用户输入一个数字。如果要继续使用InputBox()函数,则当用户键入无法强制转换为数字的任何内容时,CInt将会出错。在这种情况下,请考虑使用Val函数。