我有一个选项卡和几个透视表。一切都很好,但现在因为我在选项卡中添加了vlookup和一些公式,所以文件速度很慢。请注意,我有一个到ODBC和SQL的连接,可以提取大约30000行和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
提高性能的方法
(如果没有工作簿,很难找出真正的罪魁祸首(。。。
似乎您已经涵盖了VB的大部分通用部分:
Application.screenupdating=falss
Application.calculationmode = xlManualClaculation
等等。,因此,转移到什么可能是罪魁祸首*:
*(尽管您意识到"Doevents"会减慢宏的速度
1(VLOOKUP
1.1(使用索引匹配
我个人讨厌VLOOKUP,从Excel 2000之类的东西开始就没有使用过,因为当时我不知道有什么比这更好的了。虽然XLOOKUP看起来很有前景,但通常情况下,VLOOKUP对索引/匹配的限制太大,因为它只能搜索到查找列的右侧(排除特殊情况(。
你猜怎么着?它也比索引/匹配慢得多!
参见此处(Kyd,n.a,浏览量超过4万次,可下载excel工作簿/示例(
">对于未排序的数据,VLOOKUP和INDEX-MATCH的计算时间大致相同。。。通过排序数据和近似匹配,INDEX-match比VLOOKUP快约30%。通过排序数据和快速查找精确匹配的技术,INDEX-match比VLOOKUP快约13%";
关于偏移/匹配与索引匹配(性能方面(的优点的讨论可以在这里找到(Ed,2003(
1.2(限制范围
无论您使用VLOOKUP/INDEX-MATCH/OTHER,请尝试:
- 限制适用的范围-例如,如果你已经在做了,不要突出显示整列,或者使用动态范围(Cheusheva,2021(
2.1(其他
- 关于你的VB-你是否尝试过执行程序的不同部分(第一、第二、第三个关键区域(?即发现哪个耗时最长
- 什么时候开始"陷入困境"?在导入阶段,还是在进行计算时?或创建/更新枢轴
- excel文件有多大?如果超过40MB,这可能是一个问题。另存为filetype.xlsb如果你还没有,你将拥有相同的VB访问权限,除非你使用SQL输出(你可能是(,否则你可以将文件大小减少40-50%
- 如果你确实有SQL连接,最近你的网络连接有什么奇怪/有趣的地方吗(如果适用的话?(你能把数据导入一个完全独立的工作簿中,然后使用数据导入来处理本地文件中的数据吗(我知道你可以,我的意思是,试试这个,看看它是否能缩短时间(
- 将计算输入到枢轴,然后再"重新枢轴",可能会导致实质性延迟
如果要从SQL server提取数据,请确保查询是从VIEW中选择的。。永远不要从静态TABLE中进行选择。