行の値が "" に等しい場合に行を自動的に非表示にする 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秒ほどかかります