如何激活在其他模块中命名的wookbook

时间:2019-05-31 15:47:17

标签: excel vba

我从模块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

我要尝试完全错误地组织我的代码吗?我应该为此使用类模块吗?还是只是我缺少的某些语法?

2 个答案:

答案 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