在VBA Excel 2003中,迭代800行花费太多时间来获得所需的输出,如何克服这一点?

请build议解决scheme在Excel 2003中迭代800行以隐藏和取消隐藏行。

For i = 0 To WSTreatmentOutComes.Range("F14:F813").Rows.Count - 1 If WSTreatmentOutComes.Range("F" & 14 + i).Value = "" Or WSTreatmentOutComes.Range("F" & 14 + i).Value = "0" Then For j = 0 To 9 WSTreatmentOutComes.Range("F" & 14 + i + j).Rows.Hidden = True Next j Else For k = 0 To 9 If WSTreatmentOutComes.Range("G" & 14 + i + k).Value = "" Or WSTreatmentOutComes.Range("G" & 14 + i + k).Value = "0" Then WSTreatmentOutComes.Range("F" & 14 + i + k).Rows.Hidden = True End If Next k End If i = i + 9 Next i 

在A栏中input一个像这样的公式testing:

Range("A14:A813").formula="=IF(AND(F:F="""",G:G=0),NA(),"""")"

然后使用这样的代码隐藏或取消隐藏:

 ' first, unhide all rows: WSTreatmentOutComes.rows.hidden=false ' 'now hide the ones where there is an NA# error from the formula: WSTreatmentOutComes.Range("A14:A813").SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Hidden = True 

最后,清理A列:

Range("A14:A813").clearcontents

你走了,立刻隐藏起来

更多关于这个方法/技术在StackOverFlow:如何删除多行,没有一个循环在excel-vba

看来你应该能够通过一次性隐藏块来摆脱内部循环。 一些接近这个应该工作:

 WSTreatmentOutComes.Range("F" & 14 + i & ":F" & 14 + i + 9).Rows.Hidden = True 

另外,没有看到你的代码的开始,你是否在开始closuresScreenUpdating?

 Application.ScreenUpdating = False <your block of code here> Application.ScreenUpdating = True 

这是我将如何做到这一点:

 Option Explicit Public Sub MacroHider() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Dim i As Long, j As Long, k As Long Dim rng As Range, vals() As Variant Set rng = WSTreatmentOutComes.Range("F14:F813") 'get all of the data in the range' ReDim vals(1 To 800, 1 To 1) vals = rng For i = 1 To UBound(vals, 1) Step 10 If vals(i) = "" Or vals(i) = "0" Then For j = 0 To 9 rng.Rows(i + j).Hidden = True Next j Else For k = 1 To 9 '(already checked the first row)' If vals(i + k) = "" Or vals(i + k) = "0" Then rng.Rows(i + k).Hidden = True End If Next k End If Next i Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub 

使用这段代码,我隐藏A列为“1”的行:

 Sub Test() For i = 1 To Sheet1.Range("A1:A50").Rows.Count If Sheet1.Range("A" & i).Value = "1" Then Sheet1.Range("A" & i).Rows.Hidden = True End If Next i End Sub 

所以,如果你想隐藏行,如果该行中的某个条件满足,你只需要适应If条件和范围。

这对你有帮助吗?