Excel VBAでグループ化する際のコード修正方法|空白セルの処理

Visual Basic

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で空白セルをグループ化する際には、空白行を正確に検出し、グループ化範囲を動的に処理することが重要です。上記の修正を行うことで、空白セルを対象にしたグループ化を正確に行えるようになります。もし他の特定のケースにも対応したい場合は、さらに条件を追加して調整を行いましょう。

コメント

タイトルとURLをコピーしました