大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、セルの結合や、結合セルの解除、判定、範囲の取得について、ご紹介します。セルの結合で使うのは、「Merge」や、「UnMerge」、「MergeCells」、「MergeArea」です。結合したいセルが大量にあると大変なので、セル結合を自動化して楽していきましょう。

はじめに

この記事では、セルの結合や、結合セルの解除、判定、範囲の取得について、ご紹介します。

セルの結合に関係するVBAコードは、「Merge」と「UnMerge」、「MergeCells」、「MergeArea」があります。

セル結合は、資料の見た目を整えることのできる便利な機能です。

結合する必要のある値が大量にある場合は、VBAで自動化して楽していきましょう。

では、セルの結合や、結合セルの解除、判定、範囲の取得について、解説していきます。

この記事で紹介すること

  • セルの結合や、結合セルの解除、判定、範囲の取得する方法

目次から見たい項目へ移動すると便利ですよ。

目次

VBAコードまとめ

セル結合についてのVBAコードをまとめています。

VBAコードだけ確認したい場合に、ご活用ください。

'セルの結合と解除
Range("A1:A4").Merge '結合
Range("A1").UnMerge '解除

Range("A1:A4").MergeCells = True '結合
Range("A1").MergeCells = False '解除

'セルに値が入力されている場合
Application.DisplayAlerts = False
Range("A1:A4").Merge
Application.DisplayAlerts = True

'列方向にセルを結合
Range("A1:B4").Merge True

'セル結合の判定
Debug.Print Range("A1").MergeCells

'結合したセルのアドレス
Debug.Print Range("A1").MergeArea.Address

'結合セルの各値を取得
With Range("A1").MergeArea
    Debug.Print .Rows.Count '行数
    Debug.Print .Columns.Count '列数
    Debug.Print .Cells(1, 1).Address '1行1列目のアドレス
    Debug.Print .Cells(.Rows.Count, 1).Address '最終行の1列目のアドレス
    Debug.Print .Cells(1, .Columns.Count).Address '1行目の最終列のアドレス
    Debug.Print .Cells(.Count).Address '最終行の最終列のアドレス
End With

では、セルの結合について、解説していきます。

セルの結合と解除

セルの結合と結合セルの解除をしてみます。

セルの結合と解除(MergeとUnMerge)

セルの結合と解除は、「Merge」と「UnMerge」を使います。

セルの結合

セルの結合をするVBAコードです。

Sub TEST1()
    
    'セルを結合
    Range("A1:A4").Merge
    
End Sub

結合する前のセルです。

結合する前のセルです

では、VBAコードを実行してみます。

セルを結合できました

セルを結合できました。

セル結合の解除

セル結合の解除をするVBAコードです。

Sub TEST2()
    
    'セル結合を解除
    Range("A1").UnMerge
    
End Sub

結合したセルを用意します。

結合したセルを用意します

では、VBAコードを実行してみます。

セル結合を解除できました

セル結合を解除できました。

セルの結合と解除(MergeCells)

セルの結合と結合セルの解除は、「MergeCells」を使ってもできます。

ただ、両方の方法を覚えても大変なので、「MergeとUnMerge」か「MergeCells」のどちらかを覚えておくといいです。

セルの結合

セルの結合するVBAコードです。

Sub TEST3()
    
    'セルを結合
    Range("A1:A4").MergeCells = True
    
End Sub

結合する前のセルです。

結合する前のセルです

では、VBAコードを実行してみます。

セルを結合できました

セルを結合できました。

結合セルの解除

結合セルの解除をするVBAコードえす。

Sub TEST4()
    
    'セル結合を解除
    Range("A1").MergeCells = False
    
End Sub

結合したセルを用意します。

結合したセルを用意します

では、VBAコードを実行してみます。

セル結合を解除できました

セル結合を解除できました。

セルに値が入力されている場合

セルに値が入力されている場合に、セル結合すると「警告」が表示されてしまいますので、「警告を非表示」にすると便利です。

ちょっとやってみます。

セルに値が入力されていると警告が表示される

セル結合するVBAコードです。

Sub TEST5()
    
    'セルを結合
    Range("A1:A4").Merge
    
End Sub

結合するセル範囲に値が入力されている場合で、やってみます。

結合するセル範囲に値が入力されている場合です

VBAコードを実行してみます。

結合しようとすると警告が表示されます

結合しようとすると警告が表示されました。

OKをクリックするとセル結合できます。

OKをクリックするとセル結合できます

セル結合できました。

ちょっと面倒ですよね。

では、「警告を非表示」にしてみましょう。

警告を「非表示」にしてセル結合

警告を「非表示」にしてセル結合するVBAコードです。

Sub TEST6()
    
    '警報を非表示
    Application.DisplayAlerts = False
    'セルを結合
    Range("A1:A4").Merge
    '警報を表示
    Application.DisplayAlerts = True
    
End Sub

結合するセル範囲に値を入力しておきます。

結合するセル範囲に値を入力しておきます

では、VBAコードを実行してみます。

警告を非表示にして、セル結合できました

警告を非表示にして、セル結合できました。

横方向にセルを結合(MergeにTrueを指定)

横方向にセルを結合することもできます。

やり方は、「Merge」に「True」を指定するという方法です。

Sub TEST7()
    
    '横方向にセルを結合
    Range("A1:B4").Merge True
    
End Sub

結合していないセルを用意しておきます。

結合していないセル

結合していないセルを用意しておきます

VBAコードを実行してみます。

横方向にセルを結合できた

横方向にセルを結合できました

横方向にセルを結合できました。

結合セルの判定

結合セルの判定をしてみます。

結合セルの判定(MergeCells)

結合セルの判定は、「MergeCells」を使います。

Sub TEST8()
    
    'セル結合の判定
    Debug.Print Range("A1").MergeCells
    
End Sub

結合セルがある場合と、ない場合で実行してみます。

結合したセルの場合は「True」

結合したセルを用意しておきます。

結合したセルを用意しておきます

では、実行してみます。

結合しているので結果は「True」となります

結合しているので結果は「True」となりました。

結合していないセルの場合は「False」

結合していないセルを用意しておきます。

結合していないセルを用意しておきます

では、実行してみます。

セル結合していないので結果は「False」となります

セル結合していないので結果は「False」となりました。

という感じで、「MergeCells」を使って結合セルの判定ができます。

結合セルの範囲を取得

結合セルの範囲を取得してみます。

結合セルの範囲を取得(MergeArea)

結合セルの範囲を取得は、「MergeArea」を使います。

Sub TEST9()
    
    '結合したセル範囲
    Debug.Print Range("A1").MergeArea.Address
    
End Sub

セルを結合しておきます。

セルを結合しておく

セルを結合しておきます

実行してみます。

結合セルのアドレスを取得できた

結合セルのアドレスを取得できました

結果は、「$A$1:$C$4」となりました。

結合セルのアドレスを取得できています。

結合セルの各値を取得

結合セルの各値を取得してみます。

「MergeArea」で結合セルの範囲を取得できれば、あとはセル範囲の操作と同じように値を取得できます。

結合セルの各値イメージ

結合セルの各値イメージです。

行数と列数のイメージは、こんな感じです。

行数と列数のイメージ

結合セルの行数と列数のイメージです

結合セルの1行1列目、最終行、最終列、最終行で最終列のイメージです。

各セルのアドレスのイメージ

結合セルの1行1列目、最終行、最終列、最終行で最終列のイメージです

という感じで、結合セルの各値を取得できます。

VBAコードをまとめるとこんな感じになります。

VABコードまとめ

'結合セルの各値を取得
With Range("A1").MergeArea
    Debug.Print .Rows.Count '行数
    Debug.Print .Columns.Count '列数
    Debug.Print .Cells(1, 1).Address '1行1列目のアドレス
    Debug.Print .Cells(.Rows.Count, 1).Address '最終行の1列目のアドレス
    Debug.Print .Cells(1, .Columns.Count).Address '1行目の最終列のアドレス
    Debug.Print .Cells(.Count).Address '最終行の最終列のアドレス
End With

では、それぞれ値を取得してみます。

結合セルの行数

結合セルの行数を取得してみます。

Sub TEST10()
    
    '結合セルの行数
    Debug.Print Range("A1").MergeArea.Rows.Count
    
End Sub

結合セルの行数を取得します。

結合セルを用意

結合セルの行数を取得します

実行してみます。

結合セルの「行数」を取得

結合セルの行数を取得できました

結合セルの行数を取得できました。

結合セルの列数

結合セルの列数を取得してみます。

Sub TEST11()
    
    '結合セルの列数
    Debug.Print Range("A1").MergeArea.Columns.Count
    
End Sub

結合セルの列数を取得します。

結合セルを用意

結合セルの列数を取得します

実行します。

結合セルの「列数」を取得

結合セルの列数を取得できました

結合セルの列数を取得できました。

結合セルの1行目の1列目

結合セルの1行目の1列目のアドレスを取得してみます。

Sub TEST12()
    
    '結合セルの1行1列目のアドレス
    With Range("A1").MergeArea
        Debug.Print .Cells(1, 1).Address
    End With
    
End Sub

結合セルの1行1列目のアドレスを取得します。

結合セルを用意

結合セルの1行1列目のアドレスを取得します

実行してみます。

結合セルの「1行1列目」のアドレス

結合セルの1行1列目のアドレスを取得できました

結合セルの1行1列目のアドレスを取得できました。

結合セルの最終行

結合セルの最終行のアドレスを取得してみます。

Sub TEST13()
    
    '結合セルの最終行1列目のアドレス
    With Range("A1").MergeArea
        Debug.Print .Cells(.Rows.Count, 1).Address
    End With
    
End Sub

結合セルの最終行のアドレスを取得します。

結合セルを用意

結合セルの最終行のアドレスを取得します

実行します。

結合セルの「最終行」のアドレス

結合セルの最終行のアドレスを取得できました

結合セルの最終行のアドレスを取得できました。

結合セルの最終列

結合セルの最終列のアドレスを取得してみます。

Sub TEST14()
    
    '結合セルの1行目最終列のアドレス
    With Range("A1").MergeArea
        Debug.Print .Cells(1, .Columns.Count).Address
    End With
    
End Sub

結合セルの最終列のアドレスを取得します。

結合セルを用意

結合セルの最終列のアドレスを取得します

実行します。

結合セルの「最終列」のアドレス

結合セルの最終列のアドレスを取得できました

結合セルの最終列のアドレスを取得できました。

結合セルの最終行の最終列

結合セルの最終行で最終列のアドレスを取得してみます。

Sub TEST15()
    
    '結合セルで、最終行の最終列のアドレス
    With Range("A1").MergeArea
        Debug.Print .Cells(.Count).Address
    End With
    
End Sub

結合セルの最終行最終列のアドレスを取得します。

結合セルを用意

結合セルの最終行最終列のアドレスを取得します

実行します。

結合セルの「最終行最終列」のアドレス

結合セルの最終行最終列のアドレスを取得できました

結合セルの最終行最終列のアドレスを取得できました。

こんな感じで、結合セルの各値を取得できます。

ちょっと応用

結合セルについて、ちょっと応用したものです。

すべての結合セルを色付け

すべての結合セルを色付けしてみます。

手順は、

  • セルをループして結合セルを探す
  • セルを塗りつぶしする

という流れです。

Sub TEST16()
    
    For i = 1 To 9
        'セル結合されている場合
        If Cells(i, "A").MergeCells Then
            '背景色を設定
            Cells(i, "A").Interior.Color = RGB(255, 255, 155)
        End If
    Next
    
End Sub

結合セルを用意しておきます。

結合セルを用意

結合セルを用意しておきます

実行してみます。

結合セルの塗りつぶしができた

結合したセルの塗りつぶしができました

結合したセルの塗りつぶしができました。

すべての結合セルのアドレスを取得

すべての結合セルのアドレスを取得してみます。

手順は、

  • 値が入力されているセルを探す
  • 結合セルかを判定する
  • 結合セルの場合はアドレスを取得

という流れです。

Sub TEST17()
    
    For i = 1 To 10
        '値が入力されている場合
        If Cells(i, "A") <> "" Then
            'セル結合されている場合
            If Cells(i, "A").MergeCells Then
                '結合セルの範囲を取得
                Debug.Print Cells(i, "A").MergeArea.Address
            End If
        End If
    Next
    
End Sub

結合セルを用意しておきます。

結合セルを用意

結合セルを用意しておきます

実行してみます。

結合セルのアドレスを取得

結合セルのアドレスを取得できました

結合セルのアドレスを取得できました。

結合セルを検索して値を取得

結合セルを検索して値を取得してみます。

手順は、

  • 値が入力されているセルを探す
  • 結合セルの範囲をループする(結合されていない場合は1行だけ)
  • 一つ右の値を取得する

という感じです。

Sub TEST18()
    
    For i = 1 To 9
        'セルの値が「"C"」の場合
        If Cells(i, "A") = "C" Then
            '結合セルの範囲をループ(結合されていない場合は1行だけ)
            For Each A In Cells(i, "A").MergeArea
                '「型番」の値を取得
                Debug.Print A.Offset(0, 1)
            Next
            Exit For
        End If
    Next
        
End Sub

結合セルを含む表を用意しておきます。

結合セルを含む表を用意

結合セルを含む表を用意しておきます

実行してみます。

結合セルを検索して値を取得

結合セルを検索して値を取得できました

結合セルを検索して値を取得できました。

セル結合を解除して同じ値を入力

セル結合を解除して同じ値を入力してみます。

手順は、

  • セルをループして結合セルを探す
  • セル結合の範囲を保存
  • セル結合を解除
  • 元の結合の範囲に値を入力

という流れです。

Sub TEST19()
    
    Dim A, B
    'データをループ
    For Each A In Range("A2:A10")
        'セル結合されている場合
        If A.MergeCells Then
            'セル結合の範囲を保存
            Set B = A.MergeArea
            'セル結合を解除
            A.UnMerge
            'セル結合されていた範囲に値を入力
            B.Value = A.Value
        End If
    Next
    
End Sub

結合したセルを用意しておきます。

結合したセルを用意

結合したセルを用意しておきます

実行してみます。

セル結合を解除して同じ値を入力

セル結合を解除して同じ値を入力できました

セル結合を解除して同じ値を入力できました。

セル結合を解除して同じ値を入力する方法について、詳細はこちらでまとめています。

同じ値をセル結合する

同じ値をセル結合してみます。

手順は、

  • 作業列に値を転記
  • 重複を削除
  • 重複しないリストと一致する値を探す
  • 一致する値のセル範囲を保存
  • 2回目以降のセル範囲はUnionでくっつけていく
  • セル範囲を結合する
  • 中央に揃える
  • 作業列をクリア

という流れです。

Sub TEST20()
    
    '作業列に値を貼り付け
    Range("C2:C9").Value = Range("A2:A9").Value
    '重複を削除
    Range("C2:C9").RemoveDuplicates Columns:=1
    
    Dim A
    
    '重複しないリストをループ
    For j = 2 To 5
        Flag = 0 'フラグをオフ
        A = Empty '初期値を入力
        '結合するリストをループ
        For i = 1 To 9
            '重複しないリストと一致した場合
            If Cells(i, "A") = Cells(j, "C") Then
                '最初の場合
                If IsEmpty(A) Then
                    '範囲を保存
                    Set A = Cells(i, "A")
                '2回目以降
                Else
                    '範囲を追加で保存
                    Set A = Union(A, Cells(i, "A"))
                End If
            End If
        Next
        Application.DisplayAlerts = False '警告を非表示
        '結合する
        A.Merge
        A.VerticalAlignment = xlCenter '上下中央揃え
        A.HorizontalAlignment = xlCenter '左右中央揃え
        Application.DisplayAlerts = True '警告を表示
    Next
    
    '作業列をクリア
    Range("C2:C9").Clear
    
End Sub

同じ値を入力した表を用意しておきます。

同じ値を入力した表を用意

同じ値を入力した表を用意しておきます

実行してみます。

同じ値をセル結合できた

同じ値をセル結合できました

同じ値をセル結合できました。

同じ値をセル結合する方法について、詳細はこちらでまとめています。

結合セルを正しくフィルタする

結合セルを正しくフィルタできるようにしてみます。

手順は、

  • IF関数で同じ値を作成
  • 作成したリストをコピー
  • 「数式」を「PasteSpecial」で結合セルに貼り付け
  • 作成したリストをクリア

という感じです。

Sub TEST21()
    
    'IF関数で同じ値を作成
    Range("C2:C9") = "=IF(A2<>"""",A2,C1)"
    Range("C2:C9").Value = Range("C2:C9").Value '値に変換
    
    '作成したリストをコピー
    Range("C2:C9").Copy
    
    Application.DisplayAlerts = False '警告を非表示
    '数式の貼り付けをする
    Range("A2").PasteSpecial Paste:=xlPasteFormulas
    Application.DisplayAlerts = True '警告を表示
    
    '作成したリストをクリア
    Range("C2:C9").Clear
    
End Sub

VBAコードを実行して、結合セルにPasteSpecialで数式の貼付けをします。

結合セルにPasteSpecialで数式の貼付け

結合セルにPasteSpecialで数式の貼付けをしました

では、結合セルをフィルタしてみます。

結合セルも正しくフィルタできた

結合セルも正しくフィルタすることができました

結合セルも正しくフィルタすることができました。

結合したセルを正しくフィルタする方法について、詳細はこちらでまとめています。

おわりに

この記事では、セルの結合や、結合セルの解除、判定、範囲の取得について、ご紹介しました。

セルの結合に関係するVBAコードは、「Merge」と「UnMerge」、「MergeCells」、「MergeArea」があります。

セル結合は、資料の見た目を整えることのできる便利な機能です。

結合する必要のある値が大量にある場合は、VBAで自動化して楽していきましょう。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す