gpt4 book ai didi

excel - VBA 等待刷新电源查询以执行下一行代码

转载 作者:行者123 更新时间:2023-12-03 22:55:27 24 4
gpt4 key购买 nike

我正在开发一个 VBA 项目,该项目需要通过电源查询更新特定表作为代码的一部分。
代码电源查询刷新需要在查询继续之前完成,但是,我还没有设法找到解决方案来做到这一点。

Option Explicit
Option Base 1


Public Sub LoadProductsForecast()

我插入了几个步骤来优化性能
'Deactivate global application parameters to optimise code performance
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayStatusBar = False


'Dimensions used in code for sheets etc.
Dim lastrow As Integer
Dim NoRowsInitial As Integer


''''''''''''''''''''''
''Get product data, and copy index match formula to look up the forecast

' find number of rows to use for clearing
NoRowsInitial = WorksheetFunction.CountA(Worksheets("Monthly Forecast").Range("D4:D15000"))

'Selecting Worksheet w. product master data
Dim wb As Workbook
Dim ws As Worksheet
Set wb = ActiveWorkbook
Set ws = Sheets("Products")
wb.Activate
ws.Select

下一行是我希望刷新电源查询的地方,刷新部分可以正常工作。
但是,它将继续运行下一个 VBA 代码。我在网上搜索了不同的答案,有些人提到了“DoEvents”,但是,它似乎并没有什么不同。
ActiveWorkbook.Connections("Query - tblAdjustments").Refresh
DoEvents

下面是 PowerQuery 刷新表后应该运行的剩余代码:
'Calculating number of rows to copy
lastrow = WorksheetFunction.CountA(Worksheets("Products").Range("B4:B15000"))

'Copying rows
Worksheets("Products").Range(Cells(4, 2), Cells(lastrow + 3, 10)).Copy

'Selecring forecast sheet
Set ws = Sheets("Monthly Forecast")
ws.Select

'Disabling alerts, so pop up for pasting data does not show (activated again later)
Application.DisplayAlerts = False

'Pasting product master data
Worksheets("Monthly Forecast").Range(Cells(8, 4), Cells(lastrow, 12)).PasteSpecial


'Creating a string that contains range to paste formula in to
Dim RangeString As String
RangeString = "N8:W" & lastrow + 7

'Copying formula to paste
Range("AJ2:AJ3").Select
Selection.Copy

'Pasting formula that looks up baseline FC (both seasonal and SES)
Range(RangeString).Select
ActiveSheet.Paste

Calculate

With Range(RangeString)
.Value = .Value
End With

'Activating alerts again
Application.DisplayAlerts = True



''''''''''''''''''''''
''Code to clean the rows that are not used
'Remove unescessary rows


Dim NPIProducts As Integer
NPIProducts = [tblNewProd].Rows.Count


'tbl.Range.Rows.Count



Dim RowsToDelete As String

RowsToDelete = lastrow + NPIProducts * 2 & ":" & NoRowsInitial

If Left(RowsToDelete, 1) = "-" Then
'do nothing (negative)
Else
[tblMonthly].Rows(RowsToDelete).Delete
End If


'''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''
'''''''''''''''''''''''''''''''''''''''''''''
''''End of main code

'Activate global application parameters again
Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayStatusBar = True


'Messages end user that the calculation is done
MsgBox "Load of products and forecast finished"

End Sub

最佳答案

如果您的连接是 OLEDB 或 ODBC,您可以将后台刷新临时设置为 false - 强制在代码继续运行之前进行刷新。而不是打电话
.Connections("Query - tblAdjustments").Refresh
做这样的事情:

Dim bRfresh As Boolean

With ThisWorkbook.Connections("Query - tblAdjustments").OLEDBConnection
bRfresh = .BackgroundQuery
.BackgroundQuery = False
.Refresh
.BackgroundQuery = bRfresh

End With

此示例假设您有一个 OLEDB 连接。如果您有 ODBC,只需替换 OLEDBConnectionODBCConnection

关于excel - VBA 等待刷新电源查询以执行下一行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53376784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com