我有一串相互调用并引用工作簿 A 和 B 的宏。我希望第一个宏提示用户选择文档 A 和 B,并将这些选择变成我引用的工作簿 A 和 B 变量到各种宏中。
如何使所选文档成为所有宏中引用的变量?
提前致谢!
最佳答案
在子例程之外声明它们,如下所示:
Public wbA as Workbook
Public wbB as Workbook
Sub MySubRoutine()
Set wbA = Workbooks.Open("C:\file.xlsx")
Set wbB = Workbooks.Open("C:\file2.xlsx")
OtherSubRoutine
End Sub
Sub OtherSubRoutine()
MsgBox wbA.Name, vbInformation
End Sub
或者,您可以在子例程之间传递变量:
Sub MySubRoutine()
Dim wbA as Workbook
Dim wbB as Workbook
Set wbA = Workbooks.Open("C:\file.xlsx")
Set wbB = Workbooks.Open("C:\file2.xlsx")
OtherSubRoutine wbA, wbB
End Sub
Sub OtherSubRoutine(wb1 as Workbook, wb2 as Workbook)
MsgBox wb1.Name, vbInformation
MsgBox wb2.Name, vbInformation
End Sub
或者使用函数
返回值:
Sub MySubroutine()
Dim i as Long
i = MyFunction()
MsgBox i
End Sub
Function MyFunction()
'Lots of code that does something
Dim x As Integer, y as Double
For x = 1 to 1000
'Lots of code that does something
Next
MyFunction = y
End Function
在第二种方法中,在 OtherSubRoutine
范围内,您可以通过参数名称 wb1
和 wb2
来引用它们。传递的变量不需要使用相同的名称,只需使用相同的变量类型即可。这允许您有一定的自由度,例如您可以循环多个工作簿,并且可以将每个工作簿发送到子例程以对该工作簿执行某些操作,而无需创建所有(或任何)变量范围内公开。
关于用户表单的注释
我个人建议在所有模块和表单中保留 Option Explicit
(这可以防止您实例化名称中带有拼写错误的变量,例如lCoutn
当您指的是 lCount
等时,除其他原因外)。
如果您使用Option Explicit
(您应该),那么您应该限定模块范围的变量的样式并避免歧义,并且您必须限定用户形式的公共(public)
作用域变量,因为这些变量不是同一意义上的“公共(public)”。例如,i
未定义,尽管它在 UserForm1
范围内是 Public
:
您可以将其称为UserForm1.i
以避免编译错误,或者由于表单是New
-able的,您可以创建一个变量对象来包含对您的表单,并以这种方式引用它:
注意:在上面的屏幕截图中,x
在另一个标准代码模块中被声明为 Public x as Long
,并且不会引发编译错误。最好将其称为 Module2.x
以避免重复使用变量名称时出现歧义和可能的阴影...
关于vba - 如何使Excel VBA变量可用于多个宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16374253/