我正在尝试对这个报告进行自动化,并编写了VBA来执行各种任务,然后我在"RunAll"子中按顺序调用它们中的每一个。我有来自 Access 查询的数据到数据透视表中工作簿中的选项卡。
我发现当我运行这个时:
Sub QueryTableRefresh()
ActiveWorkbook.Sheets("data").Activate
Range("A2").Activate
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
End Sub
它使用 Access 创建了一个不完整的 OLE 操作,这会导致在我运行以下内容时打开 Access 的只读实例("TableRefresh"是一个带有删除和附加查询的函数):
Public Sub RefreshAccessTables()
Dim acApp As Object
Dim db As Object
Set acApp = CreateObject("Access.Application")
acApp.OpenCurrentDatabase ("P:ReportsDaily Origination VolumeDaily Origination Volume.accdb")
Set db = acApp
acApp.Run "TableRefresh"
acApp.Quit
Set acApp = Nothing
End Sub
只读实例可防止删除和追加查询的写入操作。这不是这两个在我的 RunAll 中运行的顺序,但工作流要求在进行任何更新时再次运行 RunAll,从而导致冲突。
我已经从 Excel 连续多次运行 Access 函数并且没有问题,直到我运行查询表刷新。刷新会导致相同的问题。
如何在 Excel 中仅更新查询表,而不使此 OLE 操作不完整?
我发现可以通过选择另一种方法来导入数据来缓解问题,即 MS Query。与其选择"从访问"选项来导入数据,不如选择"从其他来源",然后选择"从Microsoft查询"。
使用这种导入方法后,我连续多次刷新它。刷新后,我能够以读/写模式打开源数据库。