【发布时间】:2015-09-22 11:08:18
【问题描述】:
要删除我正在使用的工作表中的所有隐藏列和行:
With activeworkbook.Sheets(1)
LR = LRow(activeworkbook.Sheets(1)) ' will retrieve last row no in the sheet
lc = LCol(activeworkbook.Sheets(1)) ' will retrieve last column no in the sheet
For lp = lc To 1 Step -1 'loop through all columns
If .Columns(lp).EntireColumn.Hidden = True Then .Columns(lp).EntireColumn.Delete
Next lp
For lp = LR To 1 Step -1 'loop through all rows
If .Rows(lp).EntireRow.Hidden = True Then .Rows(lp).EntireRow.Delete
Next
end with
但这需要很长时间,因为我有 300 多列和 1000 行。当我尝试估算上述操作所需的总时间时,我发现以下几行花费的时间最多:
For lp = lc To 1 Step -1 'loop through all columns
If .Columns(lp).EntireColumn.Hidden = True Then _
.Columns(lp).EntireColumn.Delete
Next lp
但下一个循环要快得多。
您对提高执行速度有什么建议吗?
LRow 和 LCol 函数的代码如下,我确认它返回正确的最后一行和最后一列:
Function LRow(sh As Worksheet)
On Error Resume Next
LRow = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
matchCase:=False).Row
On Error GoTo 0
End Function
Function LCol(sh As Worksheet)
On Error Resume Next
LCol = sh.Cells.Find(What:="*", _
After:=sh.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
matchCase:=False).Column
On Error GoTo 0
End Function
我正在考虑使用 .specialcells 选择所有可见列,并将其反转以进行删除。
【问题讨论】:
-
很高兴确认您的
LCol(...)函数正在返回正确的列。由于这通常是一个简短的代码行,我质疑这样的子函数是否甚至是必要的,更不用说返回正确的列索引号了。使用Applciation.ScreenUpdating = False加快速度。如果要删除公式,请将计算设置为xlCalculationManual。EnableEvents通常也会截断几毫秒。 -
如果切换两个循环会发生什么,即先删除行,然后删除列?
-
好问题,尝试并确认仍然删除行比删除列快得多
-
尝试此处 OP 中提到的所有设置:stackoverflow.com/questions/5394239/…