【发布时间】:2021-08-18 08:51:24
【问题描述】:
我有一个标签和几个数据透视表。一切正常,但现在因为我在选项卡中添加了 vlookup 以及一些公式,它使文件非常慢。 请注意,我与 ODBC 和 SQL 建立了连接,可以提取 30,000 行和 32 列的数据。
有什么方法可以提高性能吗?
我试过了: 取消选中后台更新 添加了等待查询
它仍然很慢...大约需要 15 分钟才能完成并打开!任何有助于减少这种情况的帮助将不胜感激!
谢谢,
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
ActiveSheet.DisplayPageBreaks = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
DoEvents
ActiveWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
If Not Application.CalculationState = xlDone Then
DoEvents
End If
DoEvents
Range("A3:P3").Select
Sheets("FRQ-4").Select
Range("A6").Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("STATUT")
.PivotItems("INACTIF").Visible = False
.PivotItems("(blank)").Visible = False
End With
ActiveSheet.Range("$A$3:$P$385").AutoFilter Field:=14, Criteria1:="=1", _
Operator:=xlOr, Criteria2:="=BESOIN-ACHAT " & Chr(10) & "1=OUI 0=NON"
DoEvents
Range("A3:P3").Select
Sheets("FRQ-3").Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("STATUT")
.PivotItems("INACTIF").Visible = False
.PivotItems("(blank)").Visible = False
End With
ActiveSheet.Range("$A$3:$P$385").AutoFilter Field:=14, Criteria1:="=1", _
Operator:=xlOr, Criteria2:="=BESOIN-ACHAT " & Chr(10) & "1=OUI 0=NON"
Range("A6").Select
DoEvents
Range("A3:P3").Select
Sheets("FRQ-2").Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("STATUT")
.PivotItems("INACTIF").Visible = False
.PivotItems("(blank)").Visible = False
End With
ActiveSheet.Range("$A$3:$P$385").AutoFilter Field:=14, Criteria1:="=1", _
Operator:=xlOr, Criteria2:="=BESOIN-ACHAT " & Chr(10) & "1=OUI 0=NON"
Range("A6").Select
DoEvents
Range("A3:P3").Select
Sheets("FRQ-1").Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("STATUT")
.PivotItems("INACTIF").Visible = False
.PivotItems("(blank)").Visible = False
End With
ActiveSheet.Range("$A$3:$P$385").AutoFilter Field:=14, Criteria1:="=1", _
Operator:=xlOr, Criteria2:="=BESOIN-ACHAT " & Chr(10) & "1=OUI 0=NON"
Range("A6").Select
Sheets("FRQ-4").Select
With ActiveSheet.Columns("E:S")
.HorizontalAlignment = xlCenter
End With
With ActiveSheet.Columns("A:D")
.HorizontalAlignment = xlLeft
End With
Sheets("FRQ-3").Select
With ActiveSheet.Columns("E:S")
.HorizontalAlignment = xlCenter
End With
With ActiveSheet.Columns("A:D")
.HorizontalAlignment = xlLeft
End With
Sheets("FRQ-2").Select
With ActiveSheet.Columns("E:S")
.HorizontalAlignment = xlCenter
End With
With ActiveSheet.Columns("A:D")
.HorizontalAlignment = xlLeft
End With
Sheets("FRQ-1").Select
With ActiveSheet.Columns("E:S")
.HorizontalAlignment = xlCenter
End With
With ActiveSheet.Columns("A:D")
.HorizontalAlignment = xlLeft
End With
MsgBox "Ready"
End Sub
【问题讨论】:
-
在任何事情之前,请参阅How to avoid using Select in Excel VBA(尤其是第一个和第二个最佳答案)。
-
可以,但速度较慢的部分是更新数据表中的公式和 vlookup,数据透视表的选择部分是最后一部分,速度较快。但是,我会更改它以防止出现问题
-
你为什么要调用多个
DoEvents?谨慎使用它,主要用于背景/外部需求。请参阅MSDN docs page 上的备注。 -
通常使用 DoEvents 来确保代码的每个部分都有时间完成,直到完成剩余的代码。无论如何,我已经删除了所有的 DoEvents,它仍然很慢,并且仍然在从 SQL/ODBC 查询中检索的超过 30K 行数据的 vlookup/公式中。如果我删除所有的 vlookup,它会很快。所以问题在于使用检索到的数据更新公式......
-
有这么多行,Vlookup 会很慢。如果您能找到一种方法将该查找预加载到字典中(将需要初始时间来加载,但只需执行一次),那么它可能会快得多。
标签: sql vba excel-formula odbc ms-query