VBA入門
第85回.結合セルの扱い

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

第85回.結合セルの扱い


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


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

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

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




Merge

Rangeオブジェクト内のセルを結合して1つのセルにします。
構文:式.Merge(Across)
行ごとに別のセルを作成する場合は True を指定します。

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

Trueの場合、セル範囲に結合セルが含まれます。
値の取得および設定が可能です。

MergeArea

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


セル結合のマクロ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より前に実行して警告表示を止めてください。
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) Then
    MsgBox "セル結合がある"
  Else
    MsgBox "セル結合はない"
  End If
End Sub

Function isMergeCells(ByVal ws As Worksheet) As Boolean
  Dim myRange As Range
  For Each myRange In ws.UsedRange
    If myRange.MergeCells Then
      isMergeCells = True
      Exit Function
    End If
  Next
  isMergeCells = False
End Function

セル結合されているだけでUsedRangeとなりますので、この範囲を確認すれば済みます。
必要に応じて適宜変更してお使いください。

セル結合時の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オブジェクトのプロパティ一覧 CommentThreaded 範囲の左上隅のセルに関連付け…
Rangeのメソッド一覧 ・・・ 詳細解説ページへのリンクあり
エクセルの基本である、Rangeオブジェクトのメソッドの一覧です。太字リンク付きは、詳細解説ページ、または、応用したVBAコードがあるページにリンクしています。Excel2010までのRangeオブジェクトのメソッド一覧 Excel2013で追加されたRangeオブジェクトのメソッド一覧 FlashFill Trueは、



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

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


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

トランザクション処理|SQL入門(12月11日)
インデックスを作成して高速化(CREATE INDEX)|SQL入門(12月9日)
他のテーブルのデータで追加/更新/削除|SQL入門(12月8日)
データの削除(DELETE)|SQL入門(12月7日)
データの更新(UPDATE)|SQL入門(12月6日)
複数のSELECT結果を統合(UNION,UNION ALL)|SQL入門(12月5日)
テーブルを結合して取得(INNER JOIN,OUTER JOIN)|SQL入門(12月4日)
データベースの正規化とマスタの作成|SQL入門(12月3日)
データベースにおけるNULLの扱い方|SQL入門(12月2日)
オブジェクト変数とは何か|VBA技術解説(12月2日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • >
  • 結合セルの扱い

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


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



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