Excel VBAでグループ化を行う際、特に空白セルを対象にする場合にはいくつかの注意点があります。この記事では、Excel VBAを使用して空白セルをグループ化するためのコードを解説し、問題となる部分の修正方法を説明します。
1. VBAで空白セルをグループ化する方法
Excel VBAを使って、連続しない空白セルをグループ化する方法には、まず空白セルを検出し、そのセルが含まれる行をグループ化するというアプローチが一般的です。しかし、この方法にはいくつかのコツが必要です。
あなたが記載したコードでは、`blankRows`コレクションに空白行を収集し、それらをグループ化しています。しかし、コードにいくつかの修正が必要です。
2. コードの問題点と修正方法
以下は、あなたのコードの修正点です。
- 変数の定義:変数`blankRows`の再設定を`Do While`ループ内で行う必要がありますが、再初期化のタイミングに注意が必要です。`Set blankRows = New Collection`を毎回のループで実行するようにしましょう。
- グループ化の範囲指定:現在のコードでは、`blankRows`の最初と最後の行を指定していますが、これを動的に扱う方法を見直す必要があります。
3. 修正後のコード例
以下に修正後のコード例を示します。
Sub GroupByDate() Dim lastRow As Long Dim i As Long, startDateRow As Long, endDateRow As Long Dim blankRows As Collection Dim r As Long, c As Long Dim isBlankAll As Boolean lastRow = Cells(Rows.Count, "A").End(xlUp).Row i = 1 Do While i <= lastRow ' --- A列結合(日付ブロック)範囲取得 --- If Cells(i, "A").MergeCells Then startDateRow = Cells(i, "A").MergeArea.Row endDateRow = startDateRow + Cells(i, "A").MergeArea.Rows.Count - 1 Else startDateRow = i endDateRow = i End If ' --- 完全空白行だけ収集 --- Set blankRows = New Collection For r = startDateRow To endDateRow ' A〜Eすべて空白か判定 isBlankAll = True For c = 1 To 5 ' A=1〜E=5 If Trim(Cells(r, c).Value) <> "" Then isBlankAll = False Exit For End If Next c If isBlankAll Then blankRows.Add r End If Next r ' --- グループ化(完全空白行のみ) --- If blankRows.Count > 0 Then Rows(blankRows(1) & ":" & blankRows(blankRows.Count)).Group End If ' 次のブロックへ i = endDateRow + 1 Loop End Sub
この修正後のコードでは、`blankRows`コレクションを毎回再初期化し、空白行を適切に収集・グループ化するようになっています。
4. まとめ
Excel VBAで空白セルをグループ化する際には、空白行を正確に検出し、グループ化範囲を動的に処理することが重要です。上記の修正を行うことで、空白セルを対象にしたグループ化を正確に行えるようになります。もし他の特定のケースにも対応したい場合は、さらに条件を追加して調整を行いましょう。


コメント