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)
试图解决方案
这个
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克服其自我限制.如果有人更熟悉我会更喜欢听到!
这不是完整的答案,而是尝试帮助调试,以便我们能够找到解决方案。
我相信您可以通过调试连接来解决这个问题。尝试用以下 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)
如果仍然出现错误,您可以回答以下其他问题:
对于所有问题,我们深表歉意,但在调试此类令人讨厌的连接错误时,您必须考虑到一切。