銀河鉄道

【VBA】シートの初期化|ClearContentsで値のみ削除

サムネイル
[VBA]ClearContentsシート初期化

Public Sub ClearSheet(Byval ws As Worksheet)
		With ws
				.Cells.ClearContents
		End With
End Sub

注意点:前処理が必ず必要

ClearContentsの前に、必ず
オートフィルタを解除し、非表示部分を表示する必要がある

組み合わせて使う

' Reset all filters, outlines, and hidden rows/columns|全フィルタ・グループ・非表示行列を解除
Public Function ResetFilterMode(ByVal ws As Worksheet)
	On Error GoTo ErrHdl

	With ws
		' オートフィルタ解除
		If .FilterMode Then .ShowAllData

		' グループ展開(最大階層まで)
		With .Outline
			.ShowLevels ColumnLevels:=8, RowLevels:=8
		End With

		' 非表示解除
		.Cells.EntireColumn.Hidden = False
		.Cells.EntireRow.Hidden = False
	End With

	Exit Function

ErrHdl:
	Call MsgError("ResetFilterMode") ' エラー発生時の識別用に関数名を渡すと良い
End Function

Public Sub ClearSheet(Byval ws As Worksheet)
		With ws
				.Cells.ClearContents
		End With
End Sub

' 呼び出し側
Public Sub ClearAllData(ByVal ws As Worksheet)
	Call ResetFilterMode(ws)
	ws.Cells.ClearContents
End Sub

“リセットせずに消す” は、危ない

なぜリセット?

見えてないセル”には ClearContents が効かないの

ClearContetnsの前に必ずフィルタ解除をする理由

.Cells.ClearContents の落とし穴

ClearContents は「見えてるセル」にしか実際の影響が出ない。
つまり、

  • 行や列が非表示
  • フィルタで隠れている
  • グループで折りたたまれている

このどれかに当てはまるセルは、消したつもりでも中身が残る

結果として:

  • 「データが残ってて後で上書きミス」
  • 「次の処理でゴミが混入」
    というトラブルの温床になる。

ResetFilterMode の役割

「シートの見え方をリセットして、ClearContents がちゃんと全部に効く状態にする」
という「前処理(precondition)」の役割がある。

| ClearContents|セル内容の消去 |
| FilterMode|フィルタモード |
| Precondition|前提条件 |
| Hidden Cells|非表示セル |
| Safety Routine|安全処理ルーチン |

Always unhide
before you wipe.

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧