外見を整えるためにセル結合を駆使された「表」は、並べ替えや自動処理対象としての「データテーブル」として使えないことは、マクロを扱う人には改めての説明は不要ですね。
そのセル結合を解除すると、結合されていた先頭セル(左上端セル)に値や数式が入りますが、他のセルは空欄になります。これもデータテーブルとして使えません。
今回のマクロは、セル結合を解除して、先頭セルと同じ値を他のセルにも入力するものです。
2つのタイプを紹介しますが、セル結合に関する要領は共通です。
あるセルが他のセルと結合されているかは、.MergeCells
で確認できます。
マージされた範囲を取得するには、.MergeArea
を使います。
結合範囲に対する.UnMerge
で結合を解除できます。解除後も.MergeArea
から取得した範囲は保持されます。
数式を解除するタイプ
結合範囲の全セルに同じ「値」を入力します。先頭セルが数式の場合は数式が解除されて「値」が入ります。
OFFSET など相対位置に依存する関数が使われている場合を想定しています。値にしておけば、結合解除後に並べ替えを行っても値が変わることがありません。
Sub セル結合解除_値埋め()
Dim rngall As Range
Dim acell As Range
Dim rngMerge As Range
Dim val As Variant
Set rngall = ActiveSheet.UsedRange
For Each acell In rngall.Cells
If acell.MergeCells = True Then
'先頭セルの値を取得
val = acell.Value
Set rngMerge = acell.MergeArea
rngMerge.UnMerge
'結合されていた範囲に値を入力
rngMerge.Value = val
End If
Next acell
End Sub
数式を維持するタイプ
先頭セルが数式の場合もそのまま保持します。先頭以外のセルには、同じ数式を入れるのではなく、先頭セルへの参照式を入力します。元のデータ状態を保持したい場合を想定しています。
Public Sub セル結合解除_参照値埋め()
Dim rngall As Range
Dim acell As Range
Dim rngMerge As Range
Dim adr As String
Dim i As Long
Set rngall = ActiveSheet.UsedRange
For Each acell In rngall.Cells
If acell.MergeCells = True Then
' 先頭セルのアドレスを取得
adr = acell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
Set rngMerge = acell.MergeArea
rngMerge.UnMerge
' 先頭以外のセルに参照式を入力
For i = 2 To rngMerge.Cells.Count
rngMerge.Cells(i).Formula = "=" & adr
Next i
End If
Next acell
End Sub
セル結合と同様、テーブルデータとして扱う際の障害になる「セル内の改行」の対処はこちらです。