sql - Excel-VBA-Query 有没有办法通过 Refresh.All 来提高 Excel VBA 的速度?
问题描述
我有一个标签和几个数据透视表。一切正常,但现在因为我在选项卡中添加了 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
解决方案
提高性能的方法
(没有工作簿的帮助,很难找出真正的罪魁祸首)......
似乎您已经涵盖了大多数通用 VB 部分:
Application.screenupdating=falss
Application.calculationmode = xlManualClaculation
等等,所以转向可能是罪魁祸首*:
*(虽然你意识到'Doevents'会减慢宏
1)VLOOKUP
1.1) 使用索引匹配
我个人很讨厌 VLOOKUP 并且自从 Excel 2000 之类的之后就没有使用过它,因为那时我不知道更好。虽然 XLOOKUP 看起来很有希望,但通常情况下 VLOOKUP 对索引/匹配的限制过于严格,因为它只能搜索查找列的右侧(排除特殊情况)。
你猜怎么着?它也比索引/匹配慢很多!
见这里(Kyd,na,有超过 40k 的浏览量,可下载的 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,这可能是个问题。如果您还没有保存为文件类型 .xlsb,您将拥有相同的 VB 访问权限,除非您使用 SQL 输出(您可能是),否则您可以将文件大小减少约 40-50%!
- 鉴于您确实有 SQL 连接,最近您的网络连接是否有一些奇怪/有趣的事情(如果适用?)您能否将数据导入完全独立的工作簿,然后使用数据导入来操作本地文件中的数据(我知道你可以,我的意思是,试试这个,看看它是否减少了时间)
- 输入枢轴然后“重新枢轴”的计算可能会导致实质性延迟
推荐阅读
- javascript - 由于 Internet 断开连接而失败后重试 AJAX
- mysql - 由于内存泄漏导致 VPS 停机?
- r - 在 R 中提取公共连续序列的函数
- r - 找不到 data.table 中存在的列?
- jquery - 选择表中最后一行id结尾的span
- javascript - Javascript获取DOM元素的索引
- java - Log4j2 动态日志未在运行时创建
- robotframework - 可以在机器人框架中使用的键盘箭头键的ascii值是多少?
- rest-assured - 放心登录测试
- amazon-web-services - 将 MIME 中的附加数据嵌入到电子邮件的 HTML 部分。未链接到附件