VBA入門
結合セルの扱い

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
最終更新日:2020-10-24

第85回.結合セルの扱い


セルが結合されていると、マクロでは時に扱いづらい事があります、
セル結合されている場合に、VBAでどのように取り扱うかを解説します。


そもそも、やたらにセル結合すべきではないのですが、
見た目重視で作られたシートでは、セル結合が頻繁に使用されているものです。
セル結合の是非についてはひとまず置いて、ここではマクロVBAでの扱い方を解説します。

セル結合に関する、メソッド・プロパティ

Mergeメソッド
UnMergeメソッド
MergeCellsプロパティ
MergeAreaプロパティ


Merge

Rangeオブジェクト内のセルを結合して1つのセルにします。
構文:式.Merge(Across)
引数にTrueを指定すると「横方向に結合」、行ごとに別のセル結合になります。

UnMerge 結合された領域をそれぞれのセルに分割します。
MergeArea

指定されたセルがある結合セル範囲を表すRangeオブジェクトを返します。
指定されたセルが結合セル範囲にない場合、このプロパティは指定されたセルを返します。
値の取得のみ可能です。

MergeCells セル範囲またはスタイルに結合されたセルが含まれているかどうかを調べます。
値の取得および設定が可能です。

MergeCellsの値について

説明
True 値の設定:指定したセル範囲が結合されます。
値の取得:指定したセル範囲が、結合したセル、または、結合したセルの一部である場合。別のセル結合範囲にまたがる場合はNullになります。
False 値の設定:指定したセル範囲を含むすべてのセル結合が解除されます。
値の取得:指定したセル範囲の全てのセルが結合されていない場合。
Null 値の設定:セル結合に何も影響を与えません。
値の取得:指定したセル範囲が、結合したセルと結合されていないセルの両方を含む場合。

セル結合のマクロVBA使用例

Range("A1:B3").Merge
A1:B3セル範囲をセル結合します。
結合範囲内の複数セルに値が入っている場合、以下のメッセージが表示されます。

マクロ VBA セル結合

このメッセージ表示を止めるには、
Application.DisplayAlerts = False
これをMergeより前に実行して警告表示を止めてください。

Range("A1:B3").Merge Across:=True
A1:B3セル範囲を横方向にセル結合します。

マクロ VBA セル結合

行ごとに別々のセル結合になります。

マクロ VBA セル結合

同一行の複数セルに値が入っている場合、警告メッセージが表示されます。
このメッセージ表示を止めるには、
Application.DisplayAlerts = False
これをMergeより前に実行して警告表示を止めてください。

Range("A1:B3").UnMerge
A1:B3セル範囲の結合を解除し単体セルに分割します。
セル結合されている範囲全てを指定する必要はありません。
結合範囲内のセルであればどのセルを指定しても良く、
Range("A2").UnMerge
これだけでもセル結合解除できます。

Range("A1:B3").MergeCells = True
A1:B3セル範囲をセル結合します。
結合範囲内の複数セルのセルに値が入っている場合は警告メッセージが表示されます。
このメッセージ表示を止めるには、
Application.DisplayAlerts = False
これをMergeCellsより前に実行して警告表示を止めてください。

Trueを設定する場合、
その範囲が既存のセル結合範囲に重なっている場合は、全てを含んだ矩形のセル範囲が結合されます。

Range("A1:B3").MergeCells = False
A1:B3セル範囲の結合を解除し単体セルに分割します。
セル結合されている範囲全てを指定する必要はありません。
結合範囲内のセルであればどのセルを指定しても良く、
Range("A2").MergeCells = False
これだけでセル結合解除できます。

MsgBox Range("A1").MergeArea.Address
A1:B3がセル結合されている場合、「$A$1:$B$3」と表示されます。
セル結合されていない場合は、「$A$1」と表示されます。

MsgBox Range("A1").MergeArea.Rows.Count
セル結合されている行数を表示します。
A1:B3がセル結合されている場合、「3」と表示されます。

MsgBox Range("A1").MergeArea.Columns.Count
セル結合されている列数を表示します。
A1:B3がセル結合されている場合、「2」と表示されます。

セル結合時の値消去

A1:B3セル範囲が結合されている場合、
Range("A1").ClearContents
これは、エラーとなります。
Clearメソッドでも同様にエラーとなります。
※Clearメソッドの場合はセル結合も解除されます。
このような結合セルの値を消去する場合は、
Range("A1").MergeArea.ClearContents
とする必要があります。

しかし、実務としては、
Range("A1").Value = ""
もしくは、
Range("A1:B3").Value = ""
この方が簡単な場合が多いでしょう。
ただし、この方法の場合は指定のセルが結合範囲の先頭セルを含んでいる必要があります。

もし、セル結合されているかどうか不明な時は、
Range("A1").MergeArea.ClearContents
Range("A1").MergeArea = ""
このように、MergeAreaを使って書いておいた方が無難でしょう。

指定セル範囲に結合セルが存在するか判定するマクロVBA

Sub sample()
  If isMergeCells(ActiveSheet.UsedRange) Then
    MsgBox "セル結合がある"
  Else
    MsgBox "セル結合はない"
  End If
End Sub

Function isMergeCells(ByVal aRange As Range) As Boolean
  If aRange.MergeCells = False Then
    isMergeCells = False
  Else
    isMergeCells = True
  End If
End Function

MergeCellsプロパティは、
指定したセル範囲が、結合したセル、または、結合したセルの一部である場合はTrueを返します。
別のセル結合範囲にまたがる場合や、結合したセルと結合されていないセルの両方を含む場合はNullを返します。
したがって、False以外(TrueまたはNull)の場合は、結合セルを含んでいることになります。

セル結合時のOffsetとResizeの注意点

Offsetプロパティは、セル結合の影響を受けます。
Offsetプロパティは、指定されたセル範囲(Rangeオブジェクト)をオフセット(移動)します、オフセット(移動)したセル範囲を表すRangeオブジェクトを返します。Offsetとは、「差し引きする」意味ですが、Offsetプロパティで取得されるのは、元のRange範囲を、指定した行数・列数移動したRange範囲…
Resizeプロパティは、セル結合の影響を受けません。
Resizeプロパティは、指定されたセル範囲(Rangeオブジェクト)のサイズを変更します、そして、サイズが変更されたセル範囲(Rangeオブジェクト)を返します。サイズ変更は、縦方向の行数、横方向の列数の両方またはどちらか一方を指定できます。

A2セル~A4セルがセル結合されている場合、

マクロ VBA セル結合

Debug.Print Range("A2").Offset(1).Address
Debug.Print Range("A1").Offset(2).Address

この結果は、
$A$5
$A$3
Offsetプロパティでは、
セル結合内部から移動する場合は、結合範囲は一つとして数えられます。
セル結合外部から移動する場合は、セル結合は影響をうけません。

Resizeプロパティは、セル結合の影響を受けません。

Debug.Print Range("A1").Resize(3).Address
Debug.Print Range("A2").Resize(3).Address

この結果は、
$A$1:$A$3
$A$2:$A$4
となります。

※Addressはセル番地を文字列で取得するRangeのプロパティです。


Rangeのプロパティは非常に沢山あります。
マクロVBA入門で重要なメソッド・プロパティは一通り紹介していますが、他のメソッド・プロパティにも目を通しておくと良いでしょう。
Rangeのプロパティ一覧 ・・・ 詳細解説ページへのリンクあり

エクセルの基本である、Rangeオブジェクトのプロパティの一覧です。太字リンク付きは、詳細解説ページ、または、応用したVBAコードがあるページにリンクしています。Excel2010までのRangeオブジェクトのプロパティ一覧 Excel2016で追加されたRangeオブジェクトのプロパティ一覧 CommentThr…
Rangeのメソッド一覧 ・・・ 詳細解説ページへのリンクあり
エクセルの基本である、Rangeオブジェクトのメソッドの一覧です。太字リンク付きは、詳細解説ページ、または、応用したVBAコードがあるページにリンクしています。Excel2010までのRangeオブジェクトのメソッド一覧 Excel2013で追加されたRangeオブジェクトのメソッド一覧 FlashFill Tru…



同じテーマ「マクロVBA入門」の記事

第82回.RangeのResizeプロパティ
第83回.RangeのOffsetプロパティ
第84回.RangeのAddressプロパティ
第85回.結合セルの扱い
第86回.総合練習問題10
第88回.並べ替え(Sort)
第89回.オートフィルター(AutoFilter)
第90回.フィルターオプションの設定(AdvancedFilter)
第91回.条件付き書式(FormatCondition)
第126回.入力規則(Validation)
第92回.名前定義(Names)


新着記事NEW ・・・新着記事一覧を見る

ピッボットテーブルって便利だよね|還暦のVBA(2021-10-18)
還暦のVBA:VBAまでたどりつけるか… (2021-09-29)
VLOOKUPを使うことを基本としてシートを設計すべきか|エクセル雑感(2021-08-17)
コンピューターはブラックボックスで良い|エクセル雑感(2021-08-14)
小文字"abc"を大文字"ABC"に変換する方法|エクセル雑感(2021-08-13)
ADOでテキストデータを集計する|VBAサンプル集(2021-08-04)
VBA学習のお勧めコース|エクセル雑感(2021-08-01)
エクセル馬名ダービー|エクセル雑感(2021-07-21)
在庫を減らせ!毎日棚卸ししろ!|エクセル雑感(2021-07-05)
日付型と通貨型のValueとValue2について|エクセル雑感(2021-06-26)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.Excelショートカットキー一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.RangeとCellsの使い方|VBA入門
5.繰り返し処理(For Next)|VBA入門
6.マクロって何?VBAって何?|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
9.セルに文字を入れるとは(Range,Value)|VBA入門
10.並べ替え(Sort)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ