更改此项目的范围意味着以前的两个工作簿现在必须成为一个工作簿。工作簿有3个页面:输出(由最终用户查看)数据(用于将小型SQL查询删除到工作表上并运行如下所示的逻辑)和Data2,它与DB有活动连接以通过数据透视表在服务器上执行更大的查询表。
此代码(没有工作簿中的Data2表)可以在不到5秒的时间内循环~15k行
For i = Sheets("Data").Range("A" & Rows.count).End(xlUp).Row To 1 Step -1
If Not (Range("D" & i).Value > qs) And (Range("D" & i).Value < qe) Then
Range("D" & i).EntireRow.Delete
End If
Next i
添加新工作表(其中有两个数据透视表查询SQL数据库,有几个过滤器,每个都有一个切片器)这个单循环(这是8个中的一个)需要很长时间才能运行我实际上没有让它完。在“End If”上删除一个中断并重复按住F5表示代码正常工作。 Data2工作表上没有任何内容引用工作表之外的任何内容。我觉得由于某种原因,数据透视表在循环的每次迭代中都是刷新的,没有充分的理由。
没有帮助的事情:
PivotTable("table1").ManualUpdate = True
或
application.screenupdating = false
或
application.calculation = xlmanual
答案 0 :(得分:0)
稍微修改一下,无法解决根本问题,但可能会加快处理速度:
Dim sht as Worksheet
Dim rngDel as Range
Set sht = Sheets("Data")
For i = 1 to sht.Range("A" & Rows.count).End(xlUp).Row
If Not (sht.Range("D" & i).Value > qs) And (sht.Range("D" & i).Value < qe) Then
If rngDel is Nothing Then
Set rngDel = sht.Range("D" & i).EntireRow
Else
Set rngDel = Application.Union(rngDel, sht.Range("D" & i).EntireRow)
End If
End If
Next i
if Not rngDel is Nothing Then rngDel.Delete
@ Acantud的评论也值得解决:不合格的Range
对象会导致读取/修改的表格不是您想要的那种问题。