VBA Excel 2007 は行を非表示にするコードを高速化するのに役立ちます

VBA Excel 2007 は行を非表示にするコードを高速化するのに役立ちます

行の値が "" に等しい場合に行を自動的に非表示にする VBA コードを作成しようとしています。値の範囲は A37:A400 です。範囲が非常に大きいため、以前の VbA は遅く、一度に 1 行ずつ表示します。この大きなリストを調べて行をすばやく非表示にする高速コードを作成するアイデアはありますか。現在、行を非表示にするのに約 1 分かかりますが、これは長すぎます。

Sub HideRows()
    Dim cell As Range
    For Each cell In Range("A37:A400")
        If Not IsEmpty(cell) Then
            If cell.Value = "" Then
                cell.EntireRow.Hidden = True
            End If
        End If
    Next
End Sub

答え1

非表示コードの直前に追加しApplication.ScreenUpdating = False、非Application.ScreenUpdating = True表示コードの後に​​追加してみてください。通常、このトリックにより、コードの実行時にアプリケーションが自分自身を再描画し続ける必要がなくなるため、ほとんどの VBA マクロの速度が約 10 倍向上します。

これは、行を一括して非表示にするのではなく、各セルを個別にチェックして行を個別に非表示にするため、あなたのケースでは役立つはずです。

答え2

あなたのコードがどのように機能するのかさえわかりません。

次の2行があります

If Not IsEmpty(cell) Then
        If cell.Value = "" Then

最初の行が空でない場合、2 行目は常に false を返します。最初の行は「セルが空でない場合」と述べており、次の行は「行が空の場合」と述べており... まあ、すでに空ではないと評価されています。したがって、行を非表示にすることは決してできないはずなので、コードがどのように機能するのかわかりません。コードの外で何か他のことが起こっているのではないかと思いますが...

しかし、これは私のマシンでは問題なく動作します

Sub Button1_Click()
Dim cell As Range
    For Each cell In Range("A1:A1600")
        If cell.Value = "" Then
            cell.EntireRow.Hidden = True
        End If            
    Next
End Sub

1600行あり、実行には5秒ほどかかります

関連情報