Excel VBA と 画面更新

投稿者: | 2012/07/17

Excel VBA で細かい処理を連続して行う場合、画面更新を切っておくことをお勧めします。
ちょこちょことお仕事するExcelの姿を愛でたいとかいうマニアックな趣味がない限りは。

下記は、オートフィルタで非表示にした行を削除するという処理です。
数百行程度でしたら可愛いものですが、シートいっぱい65535行くらいのデータで処理すると、かなり目がチカチカします。

Dim lngEndRow As Long
    lngEndRow = Cells.SpecialCells(xlCellTypeLastCell).Row '表の最終行取得
'オートフィルタ実行
Range("A1").Select
Selection.AutoFilter
'フィルタ条件(1列目の値が(Field:=1)、100より大きく(">100")、かつ(xlAnd)、10,000より小さい("<10000")
Selection.AutoFilter Filed:=1, Criteria1:=">100", Operator:=xlAnd, Criteria2:="<10000"

'行削除処理(行が非表示なら、削除)
Dim i As Long
For i = lngEndRow To Step -1 '最終行から1行ずつ上に(先頭から下にだと削除後に行がズレるのでダメ)
    If Rows(i).Hidden Then ' 行が「非表示(=フィルタではじかれた)」な場合
        Rows(i).Delete ' 行を削除
    End If
Next i


そこで、行削除を繰り返す処理の前後に画面更新の停止と再開を設定します。

Dim lngEndRow As Long
    lngEndRow = Cells.SpecialCells(xlCellTypeLastCell).Row '表の最終行取得
'オートフィルタ実行
Range("A1").Select
Selection.AutoFilter
'フィルタ条件(1列目の値が(Field:=1)、100より大きく(">100")、かつ(xlAnd)、10,000より小さい("<10000")
Selection.AutoFilter Filed:=1, Criteria1:=">100", Operator:=xlAnd, Criteria2:="<10000"

'画面更新を停止
Application.ScreenUpdating = False

'行削除処理(行が非表示なら、削除)
Dim i As Long
For i = lngEndRow To Step -1 '最終行から1行ずつ上に(先頭から下にだと削除後に行がズレるのでダメ)
    If Rows(i).Hidden Then ' 行が「非表示(=フィルタではじかれた)」な場合
        Rows(i).Delete ' 行を削除
    End If
Next i

'画面更新を再開
Application.ScreenUpdating = True

画面更新の停止を設定した後、用が済んだら再開を忘れずに。

 


 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください