“表”を”データ”に : セル結合を解除して値を埋める

外見を整えるためにセル結合を駆使された「表」は、並べ替えや自動処理対象としての「データテーブル」として使えないことは、マクロを扱う人には改めての説明は不要ですね。

そのセル結合を解除すると、結合されていた先頭セル(左上端セル)に値や数式が入りますが、他のセルは空欄になります。これもデータテーブルとして使えません。

今回のマクロは、セル結合を解除して、先頭セルと同じ値を他のセルにも入力するものです。

セル結合の対策

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

セル結合と同様、テーブルデータとして扱う際の障害になる「セル内の改行」の対処はこちらです。

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