首页 > 解决方案 > 使用 Do While 优化 VBA 宏

问题描述

我有一个包含很多工作表的 excel 文件,我想运行一个宏,该宏将根据该范围顶部的值隐藏一系列行。我的宏可以工作,但是由于我有很多工作表,所以要花很长时间才能运行...

有人可以帮我优化它,因为我可能做了一些非正统的事情......

Sub MasquerPrix()

Dim RowNum As Long
Dim StartRow As Long
Dim ColNum As Long

Columns("D:H").Select
Range("F1").Activate
Selection.EntireColumn.Hidden = False
Columns("E:F").Select
Selection.EntireColumn.Hidden = True
Range("A1").Select
        
StartRow = 1
RowNum = 1
ColNum = 2

    Do While Cells(RowNum, ColNum).Value <> "Prix  Total (Public HT)"
        If Cells(RowNum, ColNum).Value <> "Prix  Total (Public HT)" Then
            Rows(RowNum).Resize(12).EntireRow.Hidden = True
            Rows(StartRow & ":" & (RowNum)).EntireRow.Hidden = False
        End If
        RowNum = RowNum + 1
    Loop
End Sub

太感谢了 !

标签: excelvbaoptimizationdo-while

解决方案


没有原始数据并且不了解其处理的逻辑,草拟了一个使用Application.Match()而不是Do ... Loop

Sub MasquerPrix()   'processes ActiveSheet
    Const STR_TO_MATCH = "Prix  Total (Public HT)", COL_NUM = 2
    Dim RowNum As Long, StartRow As Long
    
    Application.ScreenUpdating = False
    Columns("D:H").Hidden = False
    Columns("E:F").Hidden = True
            
    StartRow = 1

    RowNum = Application.Match(STR_TO_MATCH, Columns(COL_NUM), 0)
    If IsNumeric(RowNum) Then
        Rows(RowNum).Resize(12).EntireRow.Hidden = True
        Rows(StartRow & ":" & RowNum).EntireRow.Hidden = False
    End If
    Application.ScreenUpdating = True
End Sub

推荐阅读