刷新时发生Excel数据连接错误

解决了! 见下面的解决scheme!

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

刷新所有连接会导致最终刷新失败。 顺序不重要,我已经手动刷新不同的顺序,相同的错误。

但是,如果我在刷新了一些后保存并closures,然后回来刷新最后一个,那么根本没有问题。

引导我相信,当我保存并closures时,我正在打开一些重置的内存上限。

我可以通过VBA重新创build该效果, 而不实际保存/closures吗? 有没有更好的解决这个问题?

错误消息 – 这三个按以下顺序popup:

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

当前代码

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 

连接string

 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 

尝试解决scheme

  • 禁用后台刷新 – 已禁用
  • 禁用自动恢复(以节省内存)
  • 清除“撤销堆栈”(节省内存)
  • 'DoEvents'延迟代码执行直到每个刷新结束,改变:

这个

 ActiveWorkbook.Connections("Connection_1").Refresh 

 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 

解!

注意,我有几个额外的连接,我不想通过这个代码更新,并添加了一些额外的,简单的逻辑来指定我想更新哪些连接。 此处的代码可以刷新工作簿中的每个连接:

 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 

我不知道为什么这个工作的具体细节,这部分允许Excel克服自我限制。 如果有人更熟悉,我很乐意听到更多!

这不是一个完整的答案,而是一个帮助debugging的尝试,所以希望我们能够得到一个解决scheme。

我相信你可以通过debugging连接来解决这个问题。 尝试用以下Subreplace上面的刷新代码(和DoEventsreplace)。 首先,显示刷新之间的对话框可能会解决问题(如果问题是并发刷新等)。 其次,每次运行时,仔细检查没有任何改变。 请报告任何发现或信息。 如果仍然出现错误,请逐句通过代码并向后报告引起错误的行。

 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 

如果您仍然收到错误,您可以回答其他问题:

  • BackgroundQuery始终是否为false?
  • 在每组对话框之间是否存在可感知的延迟(表示Excel正在等待刷新完成),还是在最后一个对话框之后立即出现?
  • 哪一行代码引发了初始错误? 如果以向后顺序刷新连接(通过取消注释“步骤-1”行),是否在相同的连接上出现错误?
  • 当你说你可以手动更新连接,这是通过一个不同的macros或通过数据>>连接>>刷新?
  • 任何错误,如果你手动select“RefreshAll”?

对于所有的问题抱歉,但是在debugging这样的恶意连接错误时,你必须考虑所有的问题。

所以当我尝试创build一个VBA脚本来在给定时间自动刷新一个Excel工作簿时,我遇到了一个类似的错误,而且在我的VBA脚本中做了一些事情来实现这个function。 其中之一是禁用后台刷新 。 这可能是你的问题,你可以很容易地通过去你的连接属性和禁用背景刷新来禁用它。

这是我在VBA中所做的,当我得到这个错误时,虽然我会说我没有使用MS Access数据库。 我用了一本excel工作手册作为“跑步者”,并且逐一打开了其他书籍,并更新了他们的联系。 基本上我有一个pathextension的variables,并将每个工作簿的名称放入一个数组,并通过数组循环。

我结合了path和扩展名给我的文件的完整文件名,你会看到在循环中。

这是我的循环看起来像:

 For i = LBound(testArray) To UBound(testArray) Dim wb As Workbook Set wb = Workbooks.Open(path & testArray(i) & ext, 0, False) 'Next I checked to see if the workbook was in protected view and allowed for editing. If Application.ProtectedViewWindows.Count > 0 Then Application.ActiveProtectedViewWindow.Edit End If 'Now comes the part that I believe should help for your case wb.Connections(testArray(i) & "This is your connection name").OLEDBConnection.BackgroundQuery = False wb.RefreshAll wb.Connections(testArray(i) & "This is your connection name").OLEDBConnection.BackgroundQuery = True wb.SaveAs fileName:= "Thisbook.xlsx" wb.Close Next i 

要获得连接名称有几种方法,包括只是看看手动。 对我来说,因为我想这样做,所以我不需要手动input每个连接名称,而是使用了与连接名称一起看到的固有模式。

在我的情况下,这是baseNameOfWorkbook & " POS Report"

我相信你可能会因为背景刷新而得到错误。 所以,如果你不需要在VBA中这样做,我只是build议去连接属性和禁用它。

让我知道这个是否奏效。

您可以使用VBA通过activeworkbook .connections对象单独调用刷新。 看到这个堆栈溢出后 ,这个方法的一些线索。 更primefaces化的应用程序可以允许更好的洞察力和控制。 例如,一旦完成了所有步骤,就可以尝试插入DoEvents来解决问题。

要清除系统内存,你总是可以运行这样的东西:

 Sub ClearUndo() Range("A1").Copy Range("A1") End Sub 

这将清除撤销堆栈,其中包含数据透视表的所有更新,允许您撤消它们,如果在中间执行此操作,它可以帮助您控制内存使用情况。

请不要认为我以前的build议,因为我正在考虑一个解决scheme,帮助我在Access中。