等到Excel RefreshAll(Ctrl + Alt + F5)完成 – VBA
我遇到了竞争条件问题,我有两个QueryTables,每个都挂上了自己的AfterRefresh事件。 每个AfterRefresh事件做一些copy'n'pasting以及做一些计算。
现在,当用户单击刷新所有(Ctrl+Alt+F5)
在Excel中,我希望有每个AfterRefresh处理程序执行,但只有在所有QueryTable刷新完全完成后。
我在StackOverFlow上search, 有人build议
Activeworkbook.RefreshAll DoEvents
但是,这是假设我们正在编程触发RereshAll。 在我的情况下,全部刷新都是通过Excel中内置的全部刷新(Ctrl+Alt+F5)
button完成的。 因此,我没有看到我可以在哪里插入DoEvents
(除非我创build自己的全部刷新button,但是我想避免这样做)。
我试图search“Excel VBA互斥体”,但我没有find任何特别的东西。 那么在每个AfterRefresh处理程序发生之前,如何确保所有刷新都已完成?
谢谢阅读!
更新:帮助与debugging..这里是我的VBA代码。
我有一个名为AutoOpen
的模块
Dim S As New DataCopy Dim U As New DataCopy Sub Auto_Open() Set S.qt = ThisWorkbook.Sheets(1).QueryTables(2) S.myWorkbookName = ThisWorkbook.Name S.sWorksheetProcessName = "ProcessS" S.sWorksheetDataColumnStart = 1 S.sWorksheetDataColumnEnd = 5 Set U.qt = ThisWorkbook.Sheets(1).QueryTables(1) U.myWorkbookName = ThisWorkbook.Name U.sWorksheetProcessName = "ProcessU" U.sWorksheetDataColumnStart = 6 U.sWorksheetDataColumnEnd = 10 End Sub
我也有一个名为DataCopy
的类模块
Public WithEvents qt As QueryTable Public myWorkbookName As String Public sWorksheetProcessName As String Public sWorksheetDataColumnStart As Integer Public sWorksheetDataColumnEnd As Integer Private Sub qt_AfterRefresh(ByVal Success As Boolean) DataCopier End Sub Private Sub DataCopier() 'Debug.Print sWorksheetProcessName & "," & Application.CalculationState Dim LastNRows As Integer Dim sWorksheetDataName As String ' How many rows to copy LastNRows = 297 sWorksheetDataName = "Data" Application.ScreenUpdating = False ' Clear content in process tab With Workbooks(myWorkbookName).Worksheets(sWorksheetProcessName) .Range(.Cells(4, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 6)).ClearContents End With ' Copy to process Tab With Workbooks(myWorkbookName).Worksheets(sWorksheetDataName) LastRow = .Cells(Rows.Count, 1).End(xlUp).Row FirstRow = LastRow - LastNRows If FirstRow < 2 Then FirstRow = 2 End If .Range(.Cells(FirstRow, sWorksheetDataColumnStart), .Cells(LastRow, sWorksheetDataColumnEnd)).Copy _ Destination:=Workbooks(myWorkbookName).Worksheets(sWorksheetProcessName).Range("A4") End With Debug.Print (sWorksheetProcessName & "," & sWorksheetDataColumnStart & "," & sWorksheetDataColumnEnd) Application.ScreenUpdating = True End Sub
由于竞争条件,只有一个AfterRefresh处理程序成功copy'n'pasting ..另一个不工作,直到我再次单击刷新全部button(Ctrl+Alt+F5)
。
如果一个DoEvents
在显式VBA触发后工作Activeworkbook.RefreshAll
那么在你想在事件处理程序中运行的代码之前 , DoEvents
应该覆盖当Ctrl+Alt+F5
触发刷新的情况。 因此,使用DoEvents
行开始每个事件处理程序。
更改查询不允许后台刷新,并且在刷新之前不会放弃控制