这个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。

代码有两个问题:您不需要variables声明,而且您的variables的作用域与预期不同。

在Visual Basic编辑器中,select工具 – 选项,然后选中需要variables声明。 这将在任何新模块的顶部自动包含Option Explicit 。 不幸的是,对于现有的模块,您必须自己在顶部inputOption Explicit

如果你需要variables声明,编译器会告诉你什么时候使用一个不在范围内的variables。 它会告诉你(在你的例子) Variable not defined和突出显示数量(因为这是第一个)。 这将有助于您在将来确定这些types的问题。

显然你打算声明你的variables,你只是没有在正确的地方宣布它们。 你的variables可以有三个作用域:本地,模块,全局。 你总是希望使用适合你的代码的最小范围。 所以使用本地,除非你需要使用模块。 并且使用模块,除非全球是绝对必要的。 以下是示波器的工作原理:

本地 – 在程序中使用Dim (在SubEnd Sub之间或同等的地方)。 该过程之外没有任何东西可以看到或更改variables。

模块 – 在任何程序之外,在模块的顶部使用PrivateDim也可以)。 现在该模块中的所有程序都可以看到并使用该variables。 其他模块中的程序不能。

全局 – 使用PublicGlobal也可以)在标准模块(不是类模块,如ThisWorkbook,Sheet1,Userform1或Class1)的顶部。 项目中的每个过程都可以看到并设置这个variables。

对于你的情况,你应该使用一个模块作用域variables。 你的事件潜艇是在同一模块,他们是使用这些variables的唯一潜艇。 如果模块之外的过程需要使用该variables,则可能需要将其移至标准模块并使用Public声明。 但是,作为最后的手段。 还有其他选项,比如将variables作为parameter passing,比使用全局作用域variables更好。

还有两件事:如果你使用Application.InputBox()你可以指定一个Type来确保用户input一个数字。 如果你想继续使用InputBox()函数,那么CInt会在用户input任何不能被强制转换的数字时出错。 在这种情况下,请考虑使用Val函数。