セル結合を効率的に行う手順を検証します。また、複数範囲のセル結合を一括で処理するマクロを作成します。
セルの結合の作業コスト
セルの結合を駆使した美しいレイアウトの Excel 文書を見ると、その作成と運用にかかったコストを想像して軽く目眩がします。
セルを結合すること自体は簡単なのですが、複数個所にもなると1個ずつコツコツと手間と時間のかかる作業になります。
できればセル結合自体を止めたいのですが、現実的にセル結合を駆使した Excel 文書を編集しなければならない状況はよくあります。
セルの結合の操作がもう少し効率よくできる方法があればいいのですが。
手作業で複数範囲のセルを結合するには
【追記】
手作業で効率よくセル結合をする手順について以下の記事で再度調査し、まとめました。
こちらもご参考にしてください。
www.shegolab.jp
結合領域の指定と[セルの結合]コマンドの実行の繰り返しどうすれば素早くできるを考えてみます。
まず[セルの結合]のショートカットですが、Excel には標準で用意されていないようです。
ネットを検索すると、すでに多くのサイトで Excel をカスタマイズして「セルの結合」にショートカットを割り当てる方法が紹介されています。
ここではあえてカスタマイズなしで、単純にコマンドの再実行(Redo)の繰り返しで済ませる方向で考えます。
Excel で使えるコマンド再実行のショートカットにはF4
、Ctrl + Y
、Alt
+ Enter
などがあります。
この3つの中ではAlt
+ Enter
が一番「指回り」がいい感じです。
「セルの結合」コマンドにもいくつか種類がありますが、やりたいコマンドを空実行しておけば、あとはAlt
+ Enter
で繰り返せます。
次に複数範囲の選択ですが、マウス操作ならCtrl
キーを押しながらセル範囲をドラッグしていけばいいです。
これと同じことをキー操作でやるには、Shift
+ F8
を使います。
キー操作のセル移動が得意な人はこちらの方が速いかもしれません。
範囲選択しては結合を繰り返すのか、それとも複数範囲を選択後一括で結合するのか、どちらが速いかはパターンによるのでやってみるしかありません。
【手順例】
- あらかじめ、行いたい[セルの結合]のタイプを空実行しておきます
- キー操作:
Alt
⇒H
⇒M
⇒C
orA
orM
- キー操作:
- 結合範囲を選択します
- 複数領域を選択したい場合
- マウス操作:
Ctrl
を押しながら、セル範囲をドラッグします - キー操作:
Shift
+ 矢印 でセル範囲を選択後、Shift
+F8
で選択領域を追加します
- マウス操作:
- 複数領域を選択したい場合
- [セルの結合]を実行します
- キー操作:
Alt
+Enter
- キー操作:
- 指定した領域ごとにセルが結合されます
- 2.と3.を繰り返します
セル移動が得意で、手が慣れれば少しは高速に操作できるかもしれません。
空白セルを結合するマクロ
複数個所のセル結合を一括で行うマクロを作成してみました。
結合するセル範囲を選択する代わりに、セルの内容で自動的に判断させたいと思います。
下記の VBA プログラムは基本的に選択範囲にある連続する空白セルをまとめて結合しますが、見出しの空白でないセルの位置を結合範囲の基準として判断します。
言葉で説明するより下図を見たほうが早いでしょう。
ヨコ結合とタテヨコ結合の2パターンのマクロを用意しました。
そのほかの複雑なパターンへの対応は避けたいところですが、いつか遭遇したらその時にまた別の課題とします。
空白セルの結合_ヨコ
「空白セルの結合_ヨコ」マクロは選択範囲を[横方向に結合]します。
選択範囲の1行目のセルに飛び飛びで値(見出し)があると、右側にある空白セルを結合し、2行目以降は1行目に合わせてヨコ結合されます。
空白セルの結合_タテヨコ
「空白セルの結合_タテヨコ」マクロは、選択範囲の1行目と1列目の値(見出し)のあるセルを基準にしてタテヨコに区切られたセル結合をします。
Option Explicit Sub 空白セルの結合_ヨコ() Selection.Cells.UnMerge mergeRightBlankCells Selection.Cells End Sub Sub 空白セルの結合_タテヨコ() Selection.Cells.UnMerge mergeBlankCells Selection.Cells End Sub Private Sub mergeRightBlankCells(rng As Range, Optional isAcross As Boolean = True) If rng.Columns.Count = 1 Then Exit Sub Dim blanks As Range Set blanks = rng.Rows(1).SpecialCells(xlCellTypeBlanks) blanks.Merge Dim leftOffset As Integer Dim bottomOffset As Integer bottomOffset = rng.Rows.Count - 1 Dim mrg As Range For Each mrg In blanks.Areas leftOffset = IIf(mrg.Column > rng.Column, -1, 0) On Error Resume Next Range(mrg.Offset(bottomOffset, leftOffset), mrg).Merge isAcross On Error GoTo 0 Next End Sub Private Sub mergeDownBlankCells(rng As Range) If rng.Rows.Count = 1 Then Exit Sub Dim blanks As Range Set blanks = rng.Columns(1).SpecialCells(xlCellTypeBlanks) blanks.Merge Dim rightOffset As Integer Dim topOffset As Integer rightOffset = rng.Columns.Count - 1 Dim mrg As Range For Each mrg In blanks.Areas topOffset = IIf(mrg.Row > rng.Row, -1, 0) On Error Resume Next Range(mrg.Offset(topOffset, rightOffset), mrg).Merge On Error GoTo 0 Next End Sub Private Sub mergeBlankCells(rng As Range) If rng.Cells.Count = 1 Then Exit Sub mergeRightBlankCells rng.Rows(1) mergeDownBlankCells rng.Columns(1) Dim cx As Range Dim cy As Range For Each cx In rng.Rows(1).Cells If cx.Row = cx.MergeArea.Row Then For Each cy In rng.Columns(1).Cells If cy.Column = cy.MergeArea.Column Then On Error Resume Next Intersect(cx.MergeArea.EntireColumn, cy.MergeArea.EntireRow).Merge On Error GoTo 0 End If Next End If Next End Sub
【使い方】
- 上記 VBA プログラムを標準モジュールにコピー&ペーストします
- 結合範囲を選択します
- あらかじめ、1行目や1列目に結合範囲の位置を示すセル値を入力しておきます
- マクロを実行します
- 複数領域のセルが結合されます。
【注意】 操作の取り消し(Undo)はできません
【注意】 結合範囲の複数のセルに値があると、そのデータが失われます。 その場合、警告ダイアログが表示されますので、「キャンセル」を押して、データの様子を確認してください。
万一データが失われても、当方の責任は負いかねます。
Windows 10 の Excel 2013 で動作確認しました。