【エクセル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)」は、(当初)結合されていたセル範囲の一番左上のセルを指すことになります。

結局、

.Value = .Resize(1, 1).Value

という文は、「結合されていた全セルの値」(=rng.MergeArea.Value)を、元々結合セルに入っていた値(=rng.MergeArea.Resize(1, 1).Value)にする、という意味になるのです。

エクセル基礎講座 「無料」動画マニュアル

「経理事務のためのエクセル基礎講座(初級編)」(動画マニュアル 総収録時間162分)を無料プレゼント中です!

このマニュアルで解説していることを一通り学べば、経理事務を行う上で最低限必要となる知識が得られます。

ご登録者の方には、合わせて、公認会計士が実体験を通して身に付けたエクセルを使う技をメールにてお伝えしていきます!

無料動画講座 登録フォーム

※ご登録頂いたメールアドレスに、エクセルを使いこなすための情報を配信するメールセミナー「エクセル倍速講座」も合わせて配信させていただきます。