刷新时出现Excel数据连接错误

Aar*_*ras 9 excel ms-access vba excel-vba excel-2010

解决了!请参阅下面的解决方案

我在Excel 2010中通过数据透视表数据连接从Excel 连接到多个独立的 Access 2010数据库.

刷新所有连接会导致最终刷新失败.顺序没关系,我手动刷新了不同的顺序,同样的错误.

但是,如果我在刷新几个后保存并关闭,然后返回并刷新最后一个,则完全没有问题.

让我相信我正在点击某种内存上限,当我保存并关闭时它会被重置.

我是否可以通过VBA重新创建该效果而无需实际保存/关闭?这个问题有更好的解决方案吗?

错误消息 - 这三个按此顺序弹出:

  • 查询未运行,或无法打开数据库表.
  • 获取数据的问题.
  • 使用连接的数据透视表,多维数据集函数或切片器无法刷新.

现行守则

Private Sub CommandButton1_Click()
On Error GoTo ErrHndlr

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.StatusBar = "Refreshing Data - Please Be Patient"

ActiveWorkbook.Connections("Connection_1").Refresh
ActiveWorkbook.Connections("Connection_2").Refresh
ActiveWorkbook.Connections("Connection_3").Refresh

Application.Calculation = xlCalculationAutomatic
Application.StatusBar = "Ready"
[LastUpdated].Value = FormatDateTime(Now, vbGeneralDate)
Application.ScreenUpdating = True
Exit Sub

ErrHndlr:
  Application.StatusBar = "Ready"
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
  [LastUpdated].Value = "Update Error"
  Exit Sub

End Sub
Run Code Online (Sandbox Code Playgroud)

连接字符串

Provider=Microsoft.ACE.OLEDB.12.0
;User ID=Admin
;Data Source=C:\Folders\Database_1.accdb
;Mode=Share Deny None
;Extended Properties=""
;Jet OLEDB:System database=""
;Jet OLEDB:Registry Path=""
;Jet OLEDB:Engine Type=6
;Jet OLEDB:Database Locking Mode=0
;Jet OLEDB:Global Partial Bulk Ops=2
;Jet OLEDB:Global Bulk Transactions=1
;Jet OLEDB:New Database Password=""
;Jet OLEDB:Create System Database=False
;Jet OLEDB:Encrypt Database=False
;Jet OLEDB:Don't Copy Locale on Compact=False
;Jet OLEDB:Compact Without Replica Repair=False
;Jet OLEDB:SFP=False
;Jet OLEDB:Support Complex Data=False
;Jet OLEDB:Bypass UserInfo Validation=False
Run Code Online (Sandbox Code Playgroud)

试图解决方案

  • 禁用后台刷新 - 已禁用
  • 禁用自动恢复(以节省内存)
  • 清除"撤消堆栈"(以节省内存)
  • 'DoEvents'延迟代码执行直到每次刷新结束,更改:

这个

ActiveWorkbook.Connections("Connection_1").Refresh
Run Code Online (Sandbox Code Playgroud)

With ActiveWorkbook.Connections("Connection_1")
  Select Case .Type
    Case xlConnectionTypeODBC
      With .ODBCConnection
        .Refresh
        Do While .Refreshing
          DoEvents
        Loop
      End With
    Case xlConnectionTypeOLEDB
      With .OLEDBConnection
        .Refresh
        Do While .Refreshing
          DoEvents
        Loop
      End With
    Case Else
      .Refresh
  End Select
End With
Run Code Online (Sandbox Code Playgroud)

解!

旁注,我有一些额外的连接,我不希望通过此代码更新,并添加了一些额外的,简单的逻辑来指定我想要更新的连接.此代码用于刷新工作簿中的每个连接:

Dim i As Integer
Dim awc As WorkbookConnection
Dim c As OLEDBConnection

Set awc = ActiveWorkbook.Connections.Item(i)
Set c = awc.OLEDBConnection
c.EnableRefresh = True
c.BackgroundQuery = False
c.Reconnect
c.Refresh
awc.Refresh
c.MaintainConnection = False
Next i
Run Code Online (Sandbox Code Playgroud)

我不知道为什么这样做的具体细节,这部分允许Excel克服其自我限制.如果有人更熟悉我会更喜欢听到!

Exa*_*Box 2

这不是完整的答案,而是尝试帮助调试,以便我们能够找到解决方案。

我相信您可以通过调试连接来解决这个问题。尝试用以下 Sub 替换上面的 Refresh 代码(以及 DoEvents 的替换)。首先,在刷新之间显示对话框可能会解决问题(如果问题是并发刷新等)。其次,每次运行时,仔细检查是否没有任何变化。请报告任何发现或信息。如果仍然出现错误,请单步执行代码并报告引发错误的行。

Sub ShowDebugDialog()

   Dim x As Integer
   Dim i As Integer, j As Integer
   Dim awc As WorkbookConnection
   Dim c As OLEDBConnection

   For i = 1 To ActiveWorkbook.Connections.Count
   'For i = ActiveWorkbook.Connections.Count To 1 Step -1

      For j = 1 To ActiveWorkbook.Connections.Count
         Set awc = ActiveWorkbook.Connections.Item(j)
         Set c = awc.OLEDBConnection
         x = MsgBox("ConnectionName: " & awc.Name & vbCrLf & _
              "IsConnected: " & c.IsConnected & vbCrLf & _
              "BackgroundQuery: " & c.BackgroundQuery & vbCrLf & _
              "MaintainConnection: " & c.MaintainConnection & vbCrLf & _
              "RobustConnect: " & c.RobustConnect & vbCrLf & _
              "RefreshPeriod: " & c.RefreshPeriod & vbCrLf & _
              "Refreshing: " & c.Refreshing & vbCrLf & _
              "EnableRefresh: " & c.EnableRefresh & vbCrLf & _
              "Application: " & c.Application & vbCrLf & _
              "UseLocalConnection: " & c.UseLocalConnection _
              , vbOKOnly, "Debugging")
      Next j

      Set awc = ActiveWorkbook.Connections.Item(i)
      Set c = awc.OLEDBConnection
      c.EnableRefresh = True
      c.BackgroundQuery = False
      c.Reconnect
      c.Refresh
      awc.Refresh
      c.MaintainConnection = False
   Next i

End Sub
Run Code Online (Sandbox Code Playgroud)

如果仍然出现错误,您可以回答以下其他问题:

  • BackgroundQuery 总是错误的吗?
  • 每组对话框之间是否存在明显的延迟(表明 Excel 正在等待刷新完成),或者它们是否在最后一个对话框之后立即出现?
  • 哪一行代码引发了初始错误?如果您按向后顺序刷新连接(通过取消注释“Step -1”行),您是否会在同一连接中收到错误?
  • 当您说可以手动更新连接时,这是通过不同的宏还是通过数据>>连接>>刷新?
  • 如果手动选择“RefreshAll”会出现错误吗?

对于所有问题,我们深表歉意,但在调试此类令人讨厌的连接错误时,您必须考虑到一切。