代码有两个问题:您不需要变量声明,而且您的变量的作用域与预期不同。
在Visual Basic编辑器中,选择工具 - 选项并选中需要变量声明。这将自动包括Option Explicit
在任何新模块的顶部。不幸的是,对于现有的模块,您必须自己在顶部输入Option Explicit
。
如果您需要变量声明,编译器会告诉您何时使用不在范围内的变量。它会告诉你(以你为例)Variable not defined
并突出显示num
(因为它是第一个)。这将有助于您在将来识别这些类型的问题。
显然你打算声明你的变量,你只是没有在正确的位置声明它们。您的变量可以有三个范围:本地,模块,全局。您总是希望使用适合您代码的最小范围。所以使用本地,除非你需要使用模块。并且使用模块,除非全球是绝对必要的。这里的范围是如何工作的:
本地 - 使用Dim
过程中(Sub
和End Sub
或同等之间)。该过程之外没有任何东西可以看到或更改变量。
模块 - 使用Private
(Dim
也可以)位于模块顶部,在任何程序之外。现在该模块中的所有程序都可以看到并使用该变量。其他模块中的程序不能。
全球 - 使用Public
(Global
也适用)以标准模块(而不是类模块,像的ThisWorkbook,Sheet1中,Userform1,或1类)的顶部。项目中的每个过程都可以看到并设置此变量。
对于您的情况,您应该使用模块范围变量。您的事件子目录位于相同的模块中,并且它们是使用这些变量的唯一子目录。如果模块外部的过程需要使用该变量,则可能需要将其移至标准模块并用Public
声明。但是,作为最后的手段。还有其他选项,比如将变量作为参数传递,比使用全局作用域变量更好。
还有两件事:如果您使用Application.InputBox()
,您可以指定一个确保用户输入数字的类型。如果您想继续使用InputBox()
功能,那么CInt
将在用户输入任何不能强制为数字的内容时出错。在这种情况下,请考虑使用Val
函数。
将您的变量拉出子变量。只需将它们自己放置即可。快速搜索找到[this](http://stackoverflow.com/questions/2722146/how-do-i-declare-a-global-variable-in-vba)。 –
谢谢。你的解决方案很好。 – neofini