【问题标题】:Excel error: Method 'Refresh' of object 'WorkbookConnection' failed. Then it crashesExcel 错误:对象“WorkbookConnection”的“刷新”方法失败。然后它崩溃
【发布时间】:2018-02-12 21:07:05
【问题描述】:

我使用的是 2013 32 位 Excel。

我正在尝试在代码中更改数据连接中文本文件的名称(见下文)。它最初是通过录制宏在电子表格中手动设置的:

Data标签→From TextGet External Data group

这个电子表格中有几个连接,都是手动设置的,都需要在代码中更新。它们都是同一类型的连接:text

当我执行下面的代码时,Excel 在 Refresh 语句中返回错误:

"Method 'Refresh' of object 'WorkbookConnection' failed"

然后我再一步,这一次它成功地执行了Refresh 语句,因为它没有返回错误。但是当我然后按F5 继续时,Excel 崩溃了。

Dim wC As WorkbookConnection
Dim rG As Range
Dim rSummary As Range
Dim sh As Worksheet
Dim sChangeValue As String
Dim sWorksheetName As String
Dim sDataTableName As String
Dim sConnection As String
Dim lo As ListObject


For Each wC In ActiveWorkbook.Connections
    If wC.Type = xlConnectionTypeTEXT Then
        'I say "For Each", but in practice there is only one range per sheet
        For Each rG In wC.Ranges
            Set rSummary = Sheets("Summary").ListObjects("d_QueryTable").Range
            sChangeValue = Application.WorksheetFunction.VLookup(wC.Name, rSummary, 7, False)
            If sChangeValue = "Y" Then
                sWorksheetName = Application.WorksheetFunction.VLookup(wC.Name, rSummary, 2, False)
                sDataTableName = Application.WorksheetFunction.VLookup(wC.Name, rSummary, 3, False)
                sConnection = Application.WorksheetFunction.VLookup(wC.Name, rSummary, 10, False)
                With wC
                    .TextConnection.Connection = sConnection
                    .Refresh
                End With
                'sh(sWorksheetName).ListObjects(sDataTableName).TableObject.Refresh
            End If
        Next rG
    End If
Next wC

wC.TextConnection.Connection 字段取值

"TEXT;Y:\Investigations\run_49.csv"

为了测试目的,我将其更改为存储在sConnection 中的值是相同的。但是为什么我会收到 Refresh 错误?那么 Excel 为什么会崩溃呢?

感谢所有帮助。

【问题讨论】:

  • 如果您Step 到下一行而不是推送F5,会发生什么?答案将有助于确定哪一行实际上导致了错误。
  • @ashleedawg 请参阅下面您帖子下方的评论

标签: excel vba


【解决方案1】:

您可能会收到错误,因为 .TextConnection.Connection.Refresh 之前,而 SQL Server 根本不喜欢它。

一般来说,SQL Server 中的.Connection 确实是一个敏感信息(非常敏感,在某种程度上,整个 SQL Server 中没有比这更敏感的了),SQL Server 避免像这样简单地设置它。试试这个来查看哈希,SQL Server 在其中保存连接字符串:

Sub TestME()

    Dim wC As WorkbookConnection
    Dim rG As Range
    Dim rSummary As Range

    For Each wC In ActiveWorkbook.Connections
        For Each rG In wC.Ranges
            Set rSummary = Worksheets(1).Range("A1:H100")
            With wC
                Debug.Print .OLEDBConnection.Connection
                .Refresh
            End With
        Next rG
    Next wC
End Sub

应该是大约 1000+ 个随机标志,打印在即时窗口上。

【讨论】:

  • 当我运行它并到达 debug.print 行时,它返回错误“应用程序定义或对象定义错误”。可能是因为电子表格中没有 OLEDB 连接?它们都是文本连接。如果我将 OLEDBConnection 关键字更改为 TextConnection,我会得到原始帖子中指定的字符串。
【解决方案2】:

根据我的经验,几乎所有 VBA 崩溃都是由内存问题引起的,通常是对象处理不当

我敢打赌是因为这条线:

Set rSummary = Sheets("Summary").ListObjects("d_QueryTable").Range

在前两个循环的每次迭代中,您多次“重新Seting”该对象。

由于它可能只需要设置一次,因此将该行移到第一个 For 语句之前。

【讨论】:

  • 该行需要在第一个 for 循环中,因为在这种情况下,它将为每个连接 wC 重置。在这种情况下,我在第二个 for 循环中拥有它,这是不必要的。我将它移到了第一个 for 循环之后,但在刷新时仍然出现相同的错误。然后我跳过了 Refresh 语句,它并没有倒下。但是,当我按下 F5 时,Excel 并没有崩溃。这就是进步。
  • 重置对象时的最佳做法是在使用完对象后将它们设置为Nothing,然后再重新使用它们。在这种情况下,请使用Set rSummary = Nothing,可能就在@之前987654326@ 声明。我告诉你,我几乎敢打赌,崩溃与 object 的错误处理有关,而且这是我唯一看到的 [无论如何都在循环中]。 (但有时我有点瞎!):-)
  • 基本上确保创建/打开的任何对象都设置为nothing 和/或closed,如果适用...另外,另一个“最佳实践”:将Option Explicit 放在模块的开头(如果还没有),以帮助识别变量/对象/等的潜在问题
  • 好吧,我在上面的第一条评论中取得的进展是一个虚假的黎明。当我在 F5 完成运行后尝试保存电子表格时,它崩溃了。我已根据您的建议整理了模块中的对象,但没有任何区别。首先,Excel 仍然返回相同的错误消息,其次,当我按 F5 时它崩溃了。这里真正的关键是错误消息,因为这是首先发生的。
  • 哦!另一个建议:重新启动!总是忘记了 [如果我关于这是内存问题的理论是正确的] Excel 往往会像“幽灵进程”一样在内存中留下废话。因此,请尝试重新启动,如果您丢失了所做的更改,请在再次运行程序之前再次进行更改。 (我的大脑*也*有记忆问题,我仍然很确定问题与对象有关。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多