我从模块1调用模块2,在模块2中将工作簿命名为“ x”。但是稍后当我在module1中尝试“ x.Activate”时,出现错误“运行时错误'424':需要对象”
我有一个很长的模块,我想通过将其分解成多个模块来进行组织。到目前为止,我已经在该模块中创建了一个名为“ INPUTS”的模块,我大概会在将来拥有一个“ Sub RT_CMM_DATA_COMPILER_INPUTS()”这个模块中的其他Subs。 )”,并尝试在名为“沙箱”的单独模块中按名称激活该工作簿。但显示错误。
'RT_Sandbox Module
Sub sandbox()
Call RT_CMM_DATA_COMPILER_INPUTS
wkbwatchFolders_table.Activate
lastShtRow = LASTSHEETROW(ActiveSheet)
MsgBox lastShtRow
End Sub
'Inputs module
Sub RT_CMM_DATA_COMPILER_INPUTS()
watchFolders_filePath = "D:\RT_CMM_Data_File_Paths.xlsx"
Set wkbwatchFolders_table = Workbooks.Open(Filename:=watchFolders_filePath)
End Sub
我要尝试完全错误地组织我的代码吗?我应该为此使用类模块吗?还是只是我缺少的某些语法?
答案 0 :(得分:1)
您缺少的关键部分是每个模块顶部的Option Explicit
。
使用该选项,代码将拒绝编译,直到明确声明所有变量为止。
没有它,watchFolders_filePath
是两个过程中未声明的变量 ,并且在读取但未分配的范围内,其数据类型为Variant/Empty
。
Rubberduck(我管理的免费,开源VBIDE外接程序项目)可以帮助您找到并修复代码中的这些问题(以及其他问题):
对于您的代码,您不需要任何全局变量。 尽可能避免使用全局变量。使用函数(和参数)代替:
Function RT_CMM_DATA_COMPILER_INPUTS() As Workbook
Dim watchFolders_filePath As String
watchFolders_filePath = "D:\RT_CMM_Data_File_Paths.xlsx"
Set RT_CMM_DATA_COMPILER_INPUTS = Workbooks.Open(Filename:=watchFolders_filePath)
End Function
Sub sandbox()
Dim wb As Workbook
Set wb = RT_CMM_DATA_COMPILER_INPUTS
wb.Activate
lastShtRow = LASTSHEETROW(wb.ActiveSheet)
MsgBox lastShtRow
End Sub
答案 1 :(得分:0)
在此处可以使用Public
语句:
Public x As Workbook
Public your_var As Object
您需要在过程之外的模块顶部声明这些。声明它们后,您可以在任何模块中的任何位置访问它们。
在此处了解更多信息:Declaring Variables