【VBA】一行マクロ【セル結合】
以前、一行マクロでセル結合を解除するVBAについて紹介する記事を書きましたが、本日はその逆パターンを記事にしようと思います。
セル結合を解除するのではなく、セル結合する一行マクロです。
想定されるシチュエーション
こんなExcel表があったとします。
この表を上司に提出したところ、こんなこと言われました。
「同じデータが続いていて見づらいし、印刷したときに分かりづらい。前の状態に戻して」
前の状態というのは、次のような状態です。
実は、このセル結合した状態の表では業務に差しさわりが大きいので、労働生産を上げるためにわざわざセル結合した状態の表をマクロで作ったのでしたが、戻せとのお達し。
仕方がないので、元に戻しましょう。
セル結合を解除する前にデータをセーブしておいたのなら、そのセーブデータを使えばよいのですが、データをセーブし忘れたのなら、仕方がないのでセル結合をすべて解除された表をもとに、セル結合して戻していきましょう。
セル結合するマクロを記録する
最初に面接日の列から処理していこうと思います。
セルC7を選択して、マクロの記録を起動します。
上記「セルを結合して中央揃え」のボタンを押すと、次のような警告メッセージが出ると思います。
コードの編集
マクロの記録が終了したら、Alt+F11を押します(VBEが開きます)
自動記録されたコードは以下のような内容になっています。
コードの説明を少ししておきます。
With~End Withは、オブジェクトの指定を省略できるステートメントです。
詳しくは、以前の記事を参照してください。
今回は使いません。
重要なのは、Selection.Mergeです。
Mergeはセル結合するメソッドです。
セル結合を解除するメソッドはUnMergeでした。
セル結合する場合は、Unをとって、単にMergeです。
コードを次のように編集します。
Sub Macro1()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+m
'
Selection.Resize(3, 1).Merge
Selection.End(xlDown).Select
End Sub
Range(“C7:C9”).SelectとWith~End Withは全部とりました。
Mergeの前に、Resize(3,1).を入れました。
Resizeプロパティ
Resieというのは対象のセルを指定した分だけ拡大してくれるプロパティです。
今回セルC7を選択した状態でマクロはスタートしました。
セルC7を基準に、行数は3行分、列数は1列のまま、サイズ変更してくださいというのがSelection.Resize(3,1)の意味です。
コードを可変対応にする
ところで、セル結合したいセルは3行だけの場合ばかりでしたでしょうか?
データの中には、6行分を一度にセル結合したいデータもあります。
B列にある企業名っぽいところに”3期生べ男6″とか書いてありますよね。
実はこの表の場合、この最後の数字が人数と一致しているのでした。
“㈱う”という会社の”3期生”の”ベ”なる国の男性が6名というくらいの意味です(フィクションです、実在の企業名、国名とは関係ありません)。
そこで、コードを次のように修正します。
Sub Macro1()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+m
'
Selection.Resize(Right(Cells(Selection.Row, 2).Value, 1), 1).Merge
Selection.End(xlDown).Select
End Sub
順番に説明します。
Resizeの中の「3」という数字があったところに、
Right(Cells(Selection.Row, 2).Value, 1)
というコードが入りました。
この中には、Rightという関数と、Cellsというプロパティ、Selection.Rowというプロパティ、以上三つの見慣れない言葉が入っています。
Right関数
Rightというのは、文字列を指定した文字数分だけ右側から切り出してくれる関数です。
Right(”abcdefg”,1)なら「g」が取り出されます。
Right(“abcdefg”,3)なら「efg」が取り出されます。
Cellsプロパティ
Cellsというのはワークシート上のセルを参照してくれるプロパティです。第1引数には行番号を、第2引数には列番を指定します。
Cells(1,1)ならセルA1のことを指します。
Cells(2,1)ならセルA2です。
Cells(1,2)ならセルB1です。
Worksheet(1).Cells(1,1)というように、先頭にシートオブジェクトを指定し、.(ピリオド)でつなげて使うのが普通なんですが、省略した場合はアクティブなシートが省略されているものとされます。
セルには様々なプロパティが用意されており、マクロの記述で勝手に記述されてしまう、With~End Withで記述されたようなプロパティもありますが、他にもValue(セルの中にある値を参照してくれる)やFormula(数式)などあります。
今回はそのうち、Valueをとってくることにしました。
そこで、Cells(行番号,列番号).Valueとなっています。
Rowプロパティ
Selection.Rowというのは、選択されたセルの行番号を教えてくれるプロパティです。
今回、最初にセルC7を選択した状態でマクロを起動しました。
したがって、Selection.Rowには、7という数字が入ることになります。
ちなみに、選択されたセルの列番号を知りたいときは、Selection.Columnです。
DisplayAlertの制御
さらに、コードを修正します。
Application.DisplayAlertを制御するコードを入れます。
次のようになります。
Sub Macro1()
'
' Macro1 Macro
'
' Keyboard Shortcut: Ctrl+m
'
Application.DisplayAlerts = False
Selection.Resize(Right(Cells(Selection.Row, 2).Value, 1), 1).Merge
Application.DisplayAlerts = True
Selection.End(xlDown).Select
End Sub
Application.DisplayAlertというのは、
↑このような警告メッセージを出すか出さないかを制御するプロパティです。
Falseにしておくと、警告メッセージを出さなくなります。
Trueにすると、警告メッセージを出すようになります。
今回、Mergeするときにこのメッセージが出てきますが、毎回出てくるとうざいので、消します。
しかし、それ以外の動作のときにもし何らかの不具合があるのに警告メッセージが出ないと困りますから、Falseにしておいた設定をすぐTrueに戻しています。
ワークシートで実践
では、ワークシートに戻って実験してみましょう。
スタートはセルC10です。
隣のセルの値を見ると、末尾に3とありますので、3セル分結合できればいいはずです。
Ctrl+mでマクロを起動してみます。
無事3セル分だけ結合しました。
次に、今度は6セル分を結合できるか実験してみます。
現在セルC13です。
隣のセルB13の値を見ると末尾が6なので、6セル分結合できれば成功です。
Ctrl+mでマクロを実行してみます。
無事6セル分結合できました。
問題は、セルC22です。
隣のセルを見ると、末尾が1です。つまり、1人しかいないので、この行はセル結合しなくていいはずです。
しかし、うっかりCtrl+mしてしまいました。そうすると、どうなるかというと
セルC742まで一気に移動してしまいました。
これはCtrl+↓のマクロが効いたせいです。
1セルしかない場合は、Ctrl+mせず、↓(下矢印)キーを1回だけ押して避けるかする必要があります。
この点だけ理解しておけば、あとは一気にセル結合の作業をすることができると思います。
エラーが出たら
何も考えずにCtrl+mをやり続けていたら、次のようなエラーが出ました。
思わずデバッグを押すと、なにやら黄色くなっています。
こういうときは、VBEのツールバーにあるリセットを押してください。
リセットを押すとマクロの実行が強制終了されます。
ワークシートに戻ってみると、
ワークシートで最も下の行である1045876行目にセルがあります。
勢いよくCtrl+mが実行されて、表の一番下まで行ったのに、さらにCtrl+mが実行されて、Ctrl+↓の部分が実行されたのでしょう。この状態で隣のセルを見ても値がブランクですから、Right関数でエラーになってしまいます。そこで先のようなエラーメッセージが出たのでしょう。気にしなくていいです。
まとめ
以上、セル結合する一行マクロを紹介しました。
セル結合解除する場合に比べ、セル結合する場合の方が難しいですね。
できたらこんなあほみたいな仕事の指示は出してほしくないものですが(セル結合を現場から駆逐したい)。
何かのお役に立てば幸いです。
ここまでお読みくださりありがとうございました。
-
前の記事
【VBA】1行マクロ【セル結合解除】 2022.10.02
-
次の記事
【VBA】1桁の数字は全角文字に、2桁以上の数字は半角文字にする【Excel版】 2022.10.04