他の人の作成したExcelファイルを扱っていると、いろいろな要望が出てきます。
このデータがなぜ同じセルに入っているのかと思うことがあれば、なぜこれらのデータが別々のセルに入っているのかと思うこともあります。
私が最近、扱わせていただいているExcelでは、別のセルになっているけれども、後の処理を考えると同じセルになっているほうがありがたいデータがあります。
そんなデータをまとめるVBA(Visual Basic for Applications)マクロを作成してみました。
Sub 選択範囲の左端列にデータをまとめる()
Dim iRow As Long
Dim iCol As Long
Dim sData As String
Application.ScreenUpdating = False
For iRow = Selection(1).Row To Selection(Selection.Count).Row
sData = ""
For iCol = Selection(1).Column To Selection(Selection.Count).Column
sData = sData & Cells(iRow, iCol).Text & vbLf
Next iCol
Cells(iRow, Selection(1).Column).Value = Left(sData, Len(sData) - 1)
Next iRow
Application.ScreenUpdating = True
End Sub例えば、A1:E2セルを選択した状態で上記のマクロを実行すると、A1セルには元のA1:E1セルに入力されていたデータが、A2セルには元のA2:E2セルに入力されていたデータがまとめられます。
「For iRow = Selection(1).Row To Selection(Selection.Count).Row ~ Next iRow」ループが、選択されているセル範囲を行ごとになめていく部分です。
上記のループの中の「For iCol = Selection(1).Column To Selection(Selection.Count).Column ~ Next iCol」ループが、列ごとにセルをなめていく部分です。
2つのループの中では、変数「sData」にセルの文字列を格納して、改行「vbLf」をくっつけています。(sData = sData & Cells(iRow, iCol).Text & vbLf)
中側のループを抜けたところで、変数「sData」の値を、その行の左端のセルに設定しています「Cells(iRow, Selection(1).Column) = ...」。
そのとき、最後に付加された改行「vbLf」が不要なので「Left(sData, Len(sData) - 1)」としています。
Home » Excel VBA Rangeオブジェクト » 選択範囲の左端の列にデータをまとめるマクロ