【问题标题】:VBA Worksheet Automation ErrorVBA 工作表自动化错误
【发布时间】:2015-07-20 08:43:42
【问题描述】:

我在例程开始时有以下代码:

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet

Set ws1 = Workbooks.Open(ThisWorkbook.Sheets(1).[b4]).Sheets(1)
Set ws2 = Workbooks.Open(ThisWorkbook.Sheets(1).[b6]).Sheets(1)
Set ws3 = Workbooks.Open(ThisWorkbook.Sheets(1).[b8]).Sheets(1)

ws1.Move after:=ThisWorkbook.Sheets("MAIN")
ws2.Move after:=ThisWorkbook.Sheets("MAIN")
ws3.Move after:=ThisWorkbook.Sheets("MAIN")

'// remove redundant data
With ws1
    With .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)  
    ...

直到第二个 With 块,当我收到自动化错误时,一切似乎都很好:

运行时错误'-2147221080 (800401a8)':

自动化错误

每个文件都是带有单个工作表的 CSV 文件,如果我在设置它们时查看本地窗口,它们会按我的预期显示为 Worksheet/Sheet1。然而,一旦我将工作表移动到ThisWorkbook,我注意到类型更改为Worksheet/Worksheet,并且我不再能够使用各自的变量引用ws1ws2ws3。变量在本地窗口中显示为工作表对象,并且似乎设置为一个对象,但是当我展开变量的节点时,它只显示<No Variables>

我以前在 VBA 中没有看到过这种行为,因此非常感谢任何解释或建议。

提前致谢。

【问题讨论】:

  • 像ws1这样没有焦点的傻事吗?
  • @99moorem 不应该有所作为,因为我指的是内存中设置的对象,但仍然没有工作 - 它似乎保留了指向该对象的指针,但没有任何它的属性或方法。很奇怪……
  • 您可以在收到错误后立即在窗口中执行 .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).address 吗?例如可以手动复制吗?
  • 不,即时窗口中的任何内容都不起作用(参考工作表变量),甚至?ws1.Name 任何访问变量属性或方法的尝试都不会导致自动化错误。
  • 将源工作簿的引用保存在变量中(即wb),然后引用它而不是依赖ThisWorkbook,因为使用多个工作簿可能会更改您当前的活动/此工作簿。跨度>

标签: vba excel


【解决方案1】:

问题是,当您从 1 张工作簿中移动工作表时,它会关闭工作簿。需要参考当前工作簿中的工作表,而不是打开的工作簿中的工作表。类似于下面的代码可以工作。

Sub tt()
Dim ws1 As Worksheet

Set ws1 = Workbooks.Open(ThisWorkbook.Sheets(1).[b1]).Sheets(1)
ws1_Name = ws1.Name

ws1.Move after:=ThisWorkbook.Sheets(1)

'// remove redundant data
With ThisWorkbook.Sheets(ws1_Name)
    With .Range("A2:A" & .Cells(.Rows.Count, 1).End(xlUp).Row)

    End With
End With
End Sub

您还可以将 ws1 重置为正确的工作表

Set ws1 = ThisWorkBook.Sheets(ws1_Name)

【讨论】:

  • 我会投赞成票,因为这与我得出的结论相同,但是我仍然很想知道为什么会发生这种情况。
  • 您是在问为什么工作表正在关闭而 ws1 丢失了它的引用,或者为什么 ws1 在您移动它时没有与同一张工作表保持链接?
  • 为什么它不保持链接 - 如果您 Set 一个对象,它应该设置对该对象的特定实例的引用。从一个工作簿移动到另一个工作簿的工作表不会更改 instance,因此该变量仍应保持功能。
  • 嗯,我只能假设这是 excel 不擅长的东西。 ws1 设置为该工作簿中的该工作表,显然这是静态的,例如它不会移动 ws1 中的引用。我想知道 .move 的幕后是否真的在做 .copy-to new dest .delete-orignal
猜你喜欢
  • 1970-01-01
  • 2014-07-18
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多