今回は選択した範囲のセルの中身を全部結合して、一番右の列に出力するマクロを作成しました。
イメージは下記の画像のような感じです。
ファイルをいかに添付しておきますので、実際にやってみたい方はダウンロードして使ってみてください。
以下からコードの解説をしていきます。
解説するコード
Sub Merge_cells()
'変数の宣言
Dim merge_value As String
Dim right_column As Integer
Dim select_range As Range
'キャンセルを押したときの行き先
On Error GoTo Cancel
'範囲の選択
Set select_range = Application.InputBox("セルを選択してください。", Type:=8)
'繰り返し
For Each r In select_range
'セルの列番号が小さくなった時の処理
If right_column > r.Column Then
Cells(r.Row - 1, right_column + 1).Value = merge_value
merge_value = ""
'セルが一番最後に到達した時の処理
ElseIf r.Address = select_range.Item(select_range.Count).Address Then
merge_value = merge_value & r.Value
r.Offset(0, 1).Value = merge_value
End If
'セルの文字列を変数merge_valueに追加
merge_value = merge_value & r
right_column = r.Column
Next r
'エラーの時にする処理
Cancel:
Exit Sub
End Sub
結構長くなってしまいましたが、やってることは大したことないです。笑
On Error Go To 〇〇
この部分はエラーが発生した場合の行き先を設定しています。
〇〇と記述のあるコードの行に移動します。
今回のマクロでエラーがあれば「Cancel:」という行に移動します。
セルの範囲を選択する過程で、キャンセルを押すとエラーが出てマクロが停止してしまうので、エラーを起こさず、マクロを終了するようにEnd Subを記述しています。
注意点
このエラー処理はコードが完成してから最後に書くようにしましょう。
その理由は実行中のエラーはすべて拾ってしまうので、デバッグがしづらいためです。
Application.InputBox()でセルの範囲を選択できるようにする。
通常のInputBoxでは文字列が基本になってしまいます。
ApplicationオブジェクトのInputBox(type:=8)はセルを選択することができるInputBoxになっています。
InputBox(“セルの範囲を選択してください”) ← エラー
Application.InputBox(“セルの範囲を選択してください”,type:=8) ← RangeをSetできる。
typeとは?
typeは受け取る値を指定することができます。
下記にリストを作成しておきますので参考にしてください。
値 | 説明 |
---|---|
0 | 数式 |
1 | 数値 |
2 | 文字列 (テキスト) |
4 | 論理値 (True または False) |
8 | セル参照 (Range オブジェクト) |
16 | #N/A などのエラー値 |
64 | 値の配列 |
For Each文ですべてのセルを一つずつ文字列を結合していく。
変数rに選択した範囲のセルを一つずつ代入していき、その値を取得して変数merge_valueに格納していく処理を作成しています。
この時、行が変わるタイミングと最後のセルに到達した場合の条件処理をIf文で記述しています。
セルの列番号が小さくなった時の処理
この説明だけだとよくわからないと思います。
選択した範囲の一番左上から繰り返し処理をしていきますが、一番右の列まで行った後に次のセルは1つ下の行の一番左のセルになります。
この段階で一行すべてのセルの文字列の結合が終了したと判断します。
この時、前回の列番号と今回の列番号を比較すると今回の列番号が小さくなります。この時に前回の列番号の右側のセルに結合した文字列を反映していくという処理を作成しています。
セルが一番最後に到達した時の処理
今回のプログラムは最後の行だけセルを結合することができません。
その原因は最後の行が終了した後は下の行に行かない為、結合した文字列を反映する処理を実行せずにFor Each文を終了してしまいます。
そのために一番最後だけ特別に文字列を反映する処理を記述しています。
まとめ
マクロを作成せずとも、セルに直接&結合して作成することもできますが、結合する列が多くなってくると見づらくて仕方ないので、作成しました。
関数がたくさん入ったセルを見るのが嫌ですよね笑
もし作ってみてほしいマクロがあればコメントいただければ作成してみます!
コメント