Excel错误:方法'刷新'对象' WorkbookConnection'失败。然后它崩溃了

时间:2018-02-12 12:45:12

标签: excel-vba vba excel

我使用的是2013 32位Excel。

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

  

Data标签→From TextGet External Data group

此电子表格中有多个连接,都是手动设置的,所有连接都需要在代码中更新。它们都是相同类型的连接:文本

当我执行下面的代码时,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中的值是相同的。但为什么我会得到刷新错误?那为什么Excel会崩溃?

所有帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

可能您收到错误,因为.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个随机标志,印在即时窗口上。

答案 1 :(得分:0)

根据我的经验,几乎所有的VBA崩溃都是由内存问题引起的,通常会以某种方式错误地处理对象

我敢打赌这是因为这一行:

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

你是"重新 - Set"这个对象多次,前两个循环的每次迭代。

由于可能只需将 设置为 ,因此请将该行移至第一个For语句之前。