分配2个工作表变量中的1个时的运行时错误438

时间:2017-11-14 18:05:39

标签: excel-vba vba excel

我在这里失去理智,我很感激帮助了解正在发生的事情。

我正在编写一个宏来提示用户打开数据文件,然后打开一个报告来填充数据。宏是通过第三个xlsm工作簿中的ActiveX按钮启动的(就像我所有的其他宏一样)。

我正在使用2个单独的FileDialog对象执行此操作。一旦我打开工作簿并将其分配给变量,我就将ByVal传递给一个应该完成工作的子工具。 sub中的第一步是为两个工作簿分配工作表变量。第一个工作表变量分配正确,但第二个工作表变量不断给我" RTE 438 - 对象不支持此属性或方法"。

我正在编写这个基于我之前写的宏,它有一个类似的开放2个工作簿(但有一个FileDialog对象)的流程,将它们传递给子,然后对它们进行操作。

我知道我的工作簿不是问题,因为当我加载当前的报表/数据工作簿时,我的旧宏工作。我还尝试在我当前的宏中打开2个测试工作簿,它仍然失败并显示与以前相同的消息。代码中正在发生一些事情但我现在还没有任何线索,我已经在这2天了。到目前为止,我当前的宏基本上是旧版本的复制/粘贴,无论如何都可以。

我尝试过的随机内容:

  • 将宏复制到新的.bas文件中,删除旧文件
  • 将2个FileDialog对象合并为1(模仿旧宏)
  • restart excel
  • 重命名变量
  • 在运行2nd filedialog对象之前设置第一个filedialog对象=什么

这里的表格上的代码与button.click()

相关联
    Dim data_Path As String, report_Path As String
    Dim getData As FileDialog
    Dim getReport As FileDialog
    Dim Data_wb As Workbook
    Dim Report_wb As Workbook

    'Prompt User open data file
    Set getData = Application.FileDialog(msoFileDialogOpen)
    With getData
        .Title = "Select the new data file."
        .Filters.Clear
        .Filters.Add "Files", "*.xlsx; *.csv", 1
        .AllowMultiSelect = False
        .Show
        If .SelectedItems.Count = 0 Then
            Exit Sub
        Else
            data_Path = .SelectedItems(1)
        End If
    End With

'Set data workbook variable
    Set Data_wb = Workbooks.Open(data_Path)

   'Prompt user to open Report 
    Set getReport = Application.FileDialog(msoFileDialogOpen)
    With getReport
        .Title = "Select the destination report."
        .Filters.Clear
        .Filters.Add "Files", "*.xlsx; *.csv", 1
        .AllowMultiSelect = False
        .Show
        If .SelectedItems.Count = 0 Then
            Exit Sub
        Else
            report_Path = .SelectedItems(1)
        End If
    End With

    Set Report_wb = Workbooks.Open(report_Path)

    Call report_update(Data_wb, Report_wb)

以下是report_update sub的代码:

Dim datash As Worksheet
Dim reportsh As Worksheet
Dim mydatawb As Workbook
Dim myreportwb As Workbook

sub report_update(ByVal mydatawb as Workbook, ByVal myreportwb as Workbook)
set datash = mydatawb.Worksheets(1)
set reportsh = myreportwb.Worksheets(1)

设置datash工作正常,但Set reportsh会引发运行时错误。

我在这里缺少什么?谢谢!

1 个答案:

答案 0 :(得分:0)

我将我的Set工作表对象移动到我的子调用之前,并传递了工作表引用而不是工作簿。这似乎已经解决了,我只是不明白为什么我以前从未这样做过。