VBA入門
結合セルの扱い

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013年5月以前 最終更新日: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プロパティの構文 ・Offsetの使用例 ・Offsetの注意点 ・Offsetのまとめ
Resizeプロパティは、セル結合の影響を受けません。
・Resizeプロパティの構文 ・Resizeの使用例 ・Resizeのまとめ

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のプロパティ一覧 ・・・ 詳細解説ページへのリンクあり

・Excel2010までのRangeオブジェクトのプロパティ一覧 ・Excel2016で追加されたRangeオブジェクトのプロパティ一覧 ・スピルにより追加されたRangeオブジェクトのプロパティ一覧
Rangeのメソッド一覧 ・・・ 詳細解説ページへのリンクあり
・Excel2010までのRangeオブジェクトのメソッド一覧 ・Excel2013で追加されたRangeオブジェクトのメソッド一覧 ・Excel2016で追加されたRangeオブジェクトのメソッド一覧



同じテーマ「マクロ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 ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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


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