【エクセルVBA】一瞬で結合セルを解除して値を埋めるマクロ
データベースとして使いたい表なのに、結合セルだらけで使い物にならない。
そんなときに、VBAで作ったマクロを起動するだけで、
- 結合セルを解除して
- 元々入っていた値を、結合されていたすべてのセルに入力する
マクロを紹介します。
ソースコードを貼り付けて実行するだけなので、1分もかからずに、表を整形できます。
この記事の目次
ソースコード
下記を、標準モジュールに貼り付けて実行してください。
Sub UnmergeCellsAndFillValues()
Dim rng As Range
For Each rng In ActiveSheet.UsedRange
If rng.MergeCells Then
With rng.MergeArea
.UnMerge
.Value = .Resize(1, 1).Value
End With
End If
Next
End Sub
解説
For Eachループ
For Each rng In ActiveSheet.UsedRange
If rng.MergeCells Then
With rng.MergeArea
.UnMerge
.Value = .Resize(1, 1).Value
End With
End If
Next
何かが入力されているすべてのセル(=UsedRange)について、1つ1つのセルを「変数rng」に格納します。
たとえば、冒頭の例では、A1セル~C12セルまでデータが入力されていますので、
- A1セル
- B1セル
- ・・・
- C12セル
というように、1つ1つのセルの情報が、順番に「変数rng」に格納されていきます。
以下、ループ内では「rng」に対して処理をしていきます。
結合セルかどうかの判定
If rng.MergeCells Then
With rng.MergeArea
.UnMerge
.Value = .Resize(1, 1).Value
End With
End If
「変数rng」に格納されているセルが「結合されているセル」の場合、「rng.MergeCells」がTrueになるので、If文の中身が実行されます。
結合されているセル範囲を取得
With rng.MergeArea
.UnMerge
.Value = .Resize(1, 1).Value
End With
「rng.MergeArea」で、結合されているセル範囲を取得できます。
たとえば、下記のような状況でrngに格納されているのが「A2セル」であれば、「rng.MergeArea」とすると「A2~A5セル」が得られます。
With文を使っているので、これ以降の処理で、「.」で始まっている文は、結合されていたセル(たとえばA2~A5セル)に対しての処理となります。
セル結合を解除
.UnMerge
指定したセル範囲の、セル結合を解除します。
なお、この文は「.」で始まっていますので、実際には「rng.MergeArea.Unmerge」と指定したのと同じ意味になります。
要は、「変数rng」が含まれる結合セル(たとえばA2~A5セル)について、結合を解除していることになります。
元々入っていた値を、結合されていたすべてのセルに入力する
.Value = .Resize(1, 1).Value
- 左辺
-
左辺は「.」で始まっていますので、Withで指定した文を補うと次のようになります。
rng.MergeArea.Value↓
指定したセルの 結合された範囲の 値 rng. MergeArea. Value 結局、「変数rng」が含まれる結合セル(たとえばA2~A5セル)に右辺の値を代入する、という意味になるわけです。
- 右辺
-
右辺も「.」で始まっていますので、Withで指定した文を補うと、次のようになります。
rng.MergeArea.Resize(1, 1).Value↓
指定したセルの 結合された範囲の 1行1列目の 値 rng. MergeArea. Resize(1,1). Value 「Resize(1,1)」というのは、元々のセル範囲(=「rng.MergeArea」)の上から1行、左から1列のセル範囲だけを選択するという意味の式です。
また、「rng.MergeArea」は、(当初)結合されていたセル範囲を表していました。
ですから、「rng.MergeArea.Resize(1, 1)」は、(当初)結合されていたセル範囲の一番左上のセルを指すことになります。
結局、
という文は、「結合されていた全セルの値」(=rng.MergeArea.Value)を、元々結合セルに入っていた値(=rng.MergeArea.Resize(1, 1).Value)にする、という意味になるのです。