【问题标题】:Excel VBA Automation Error: The object invoked has disconnected from its clientsExcel VBA 自动化错误:调用的对象已与其客户端断开连接
【发布时间】:2013-06-22 13:54:50
【问题描述】:

我知道我以前曾看到过有关此问题的参考资料,但我已经尝试了一些建议,但我仍然收到错误消息。我有一本从另一本书收集数据并生成报告的工作簿。然后我想制作一个新工作簿,将报表信息复制到新簿中,保存新簿并关闭它,然后继续下一个报表。它应该这样做大约 10 次。在我复制和粘贴工作表的部分代码中,出现错误

错误 -2147417848 自动化错误调用的对象有 与客户断开连接

我检查了有关此错误的其他帖子,并尝试了建议的解决方案,但没有任何结果。有趣的是,有时它会在中断之前完成 5 个代码循环,有时只有 2 个。唯一的一致性是它总是在同一个地方中断

fromBook.Sheets("Report").Copy Before:=newBook.Sheets("Sheet1")

我在模块顶部有 Explicit 选项,并且我已经检查以确保它正在闯入的 sub 内部没有任何全局变量。话虽如此,我完全有可能忽略了一些东西。我还设置了一个“计时器”,以确保 Excel 工作表不会相互重叠。

我真的可以使用帮助!

这是我的子代码:

Sub CreateAndSave(ByRef Reg As Integer, ByVal j As Integer)

        Dim fromBook As Workbook
        Dim fromSheet As Worksheet
        Dim newBook As Workbook
        Dim fileExists As Boolean
        Dim i As Integer
        Dim Holder As Integer


        Application.ScreenUpdating = False
        Application.DisplayAlerts = False

            Set fromBook = Application.Workbooks("Region_Audit_Report")
            Set newBook = Workbooks.Add

           With newBook
            .SaveAs Filename:="G:\DataTeam\ExcelDev\Audit Report\Region Workbooks\Region" & Reg & " " & Month(Date) & "-" & Day(Date) & "-" & Year(Date) & ".xlsx" _
            , FileFormat:=xlOpenXMLWorkbook
           End With

        Set newBook = Application.Workbooks("Region" & Reg & " " & Month(Date) & "-" & Day(Date) & "-" & Year(Date) & ".xlsx")

        fromBook.Sheets("Report").Copy Before:=newBook.Sheets("Sheet1")
        fromBook.Sheets("MonthData").Copy After:=newBook.Sheets("Report")

        newBook.Sheets("MonthData").Range("A1") = "Month"
        newBook.Sheets("MonthData").Range("B1") = "Store#"
        newBook.Sheets("MonthData").Range("C1") = "District"
        newBook.Sheets("MonthData").Range("D1") = "Region"
        newBook.Sheets("MonthData").Range("E1") = "Due Date"
        newBook.Sheets("MonthData").Range("F1") = "Comp Date"
        newBook.Sheets("MonthData").Range("G1") = "# of Errors"
        newBook.Sheets("MonthData").Range("H1") = "Late?"
        newBook.Sheets("MonthData").Range("I1") = "Complete?"

        newBook.Sheets("MonthData").Range("A1:I1").Interior.ColorIndex = 43


            newBook.Save

            newBook.Close


            Application.DisplayAlerts = True

    End Sub

【问题讨论】:

  • 尝试在宏顶部禁用计算。 Application.Calculation = xlCalculationManual (然后在最后再次启用它)((我遇到了类似的问题并修复了它))
  • 我试过了。它仍然在同一个地方破裂。

标签: excel automation runtime-error vba


【解决方案1】:

我在将 Excel 2000 转换为 2010 的多个项目中遇到了这个问题。这是我发现的似乎可行的方法。我做了两个更改,但不确定是哪个导致成功:

1) 我更改了关闭和保存文件的方式(从 close & save = true 保存为相同的文件名并关闭文件:

...
    Dim oFile           As Object       ' File being processed
...
[Where the error happens - where aArray(i) is just the name of an Excel.xlsb file]
   Set oFile = GetObject(aArray(i))
...
'oFile.Close SaveChanges:=True    - OLD CODE WHICH ERROR'D
'New Code
oFile.SaveAs Filename:=oFile.Name
oFile.Close SaveChanges:=False

2) 我回过头来查找代码中的所有 .range 并确保它是完整的构造..

Application.Workbooks("workbook name").Worksheets("worksheet name").Range("G19").Value

或(不是 100% 确定这是否是正确的语法,但这是我所做的“努力”)

ActiveSheet.Range("A1").Select

【讨论】:

  • 你把这些行放在哪里了?
【解决方案2】:

我今天刚刚遇到这个问题:我将 Excel 项目从 Office 2007 迁移到 2010。在某个时刻,当我的宏尝试插入新行(例如 Range("5:5").Insert )时,出现了相同的错误消息。仅当先前已编辑另一张工作表时才会发生这种情况(我的宏切换到另一张工作表)。

感谢 Google 和您的讨论,我找到了以下解决方案(基于“red”在 2013 年 7 月 30 日 0:27 回答时给出的答案):切换到工作表后,必须先编辑单元格插入新行。我添加了以下代码:

'=== Excel bugfix workaround - 2014.08.17
Range("B1").Activate
vCellValue = Range("B1").Value
Range("B1").ClearContents
Range("B1").Value = vCellValue

“B1”可以替换为工作表上的任何单元格。

【讨论】:

  • 我遇到了同样的错误,而巧合的是,我在做同样的事情(调用“.Insert”)并且你的解决方案是正确的!感谢您的明确分解!您可能希望在回复中以粗体显示以下内容:) 底线:“...必须在插入新行之前编辑单元格”
【解决方案3】:

您必须使用过该对象,释放它(“断开连接”),然后再次使用它。仅在您完成后或调用Form_Closing 时释放对象。

【讨论】:

  • 这确实有帮助。我的问题是我试图在 PERSONAL.XLSB 中调用 Sub。但是这个工作簿会在 Excel 启动时自动打开。当我再次尝试打开时,Excel 会提示一个窗口询问您是否要以“只读”方式打开...这会导致断开连接。
【解决方案4】:

我在包含数百行代码的大型 Excel 2000 电子表格中遇到了同样的问题。我的解决方案是在课堂开始时使工作表处于活动状态。 IE。 ThisWorkbook.Worksheets("WorkSheetName").Activate 当我注意到如果在启动操作(代码)时“WorkSheetName”处于活动状态时,终于发现了这一点,则不会发生错误。让我发疯了好一阵子。

【讨论】:

  • 很奇怪,当我将这个语句添加到我的宏中时它起作用了,但是它有一些副作用,所以我又把它拿走了,然后它仍然起作用。所以谢谢你的提示!
【解决方案5】:

要尝试的几件事...

  1. 注释掉第二行“Set NewBook”代码...

  2. 您已经拥有对工作簿的对象引用。

  3. 复制工作表后执行另存为。

【讨论】:

  • 我尝试了建议的更改,但在第二轮代码中,它在相同的位置、相同的错误中中断。
  • 这次的潜在问题是它看起来像是在代码中循环,所以在 Book1 保存和关闭之前打开了 Book2。
【解决方案6】:

以下代码行中的错误(由请求者-William 提到)是由于以下原因:

fromBook.Sheets("Report").Copy Before:=newBook.Sheets("Sheet1")

您尝试复制到的目标工作表已关闭。 (这里newbook.Sheets("Sheet1"))。 在复制到目的地之前添加以下语句。

Application.Workbooks.Open ("YOUR SHEET NAME")

这样就解决问题了!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多