実務でExcelを使っていると、複数の列に入力されているデータを1列にまとめたいということが、結構あります。
そんなとき、ひたすらコピー・アンド・ペーストを繰り返したり、ドラッグ・アンド・ドロップを繰り返すといった操作をしている方が少なくないと思います。
データ量がそれほどなければ、手作業でもいいのでしょうが、データが多いときに手作業で複数の列を一つにまとめるというのは、かなり面倒な作業です。
VBA(Visual Basic for Applications)でマクロを作成すると、そんな作業も簡単になります。
Sub AlignDataTo1Col()
Dim lngRow As Long
Dim lngCol As Long
Dim strData As String
Dim varData As Variant
Dim lngLop As Long
Dim rngOutPut As Range
For lngCol = Selection(1).Column To Selection(Selection.Count).Column
For lngRow = Selection(1).Row To Selection(Selection.Count).Row
If Not IsEmpty(Cells(lngRow, lngCol).Value) Then
strData = strData & vbTab & Cells(lngRow, lngCol).Value
End If
Next lngRow
Next lngCol
varData = Split(strData, vbTab)
On Error Resume Next
Set rngOutPut = Application.InputBox(Prompt:="出力先セルを指定してください。", Type:=8)
For lngLop = 1 To UBound(varData)
rngOutPut.Offset(lngLop - 1, 0).Value = varData(lngLop)
Next
一列にまとめたいセル範囲を選択しておいてから上記のマクロを実行すると、
「出力先セルを指定してください。」
というダイアログボックスが表示され、セルを指定すると指定されたセルを起点に、選択されていた範囲のデータが一列に並べられます。
その際、選択範囲に空白セルが含まれていた場合、空白セルを取り除いてデータだけを並べます。
▼サンプルファイル(003710.xls 24KByte)ダウンロード
どんな動きをするのかは、サンプルファイルで試してみていただくほうが早いでしょう。
サンプルファイルで、B2:D17セルを選択しておいて上記のマクロを実行し、出力先セルとしてお好きなセルを指定してみてください。
やっていることは以下のようなことです。
まず、変数・strDataにvbTabで区切りながら、選択されていたセル範囲のデータを入れます。
それが、
For lngCol = Selection(1).Column To Selection(Selection.Count).Column
For lngRow = Selection(1).Row To Selection(Selection.Count).Row
If Not IsEmpty(Cells(lngRow, lngCol).Value) Then
strData = strData & vbTab & Cells(lngRow, lngCol).Value
End If
Next lngRow
Next lngCol
の中の
strData = strData & vbTab & Cells(lngRow, lngCol).Value
の部分です。
次に、
varData = Split(strData, vbTab)
で変数・strDataに一旦入れた値を配列・varDataにします。
最後に、
For lngLop = 1 To UBound(varData)
rngOutPut.Offset(lngLop - 1, 0).Value = varData(lngLop)
Next
で、配列になった値を、出力先として指定されたセルから下に向かって書き出していく、というのが大きな流れです。
もう少し細かく見ていくと、最初の
For lngCol = Selection(1).Column To Selection(Selection.Count).Column
ではじまるループ処理は、選択範囲の先頭の列から最後の列に向かって行うことを意味しています。
上記のループ処理の中にある
For lngRow = Selection(1).Row To Selection(Selection.Count).Row
が、選択範囲の先頭の行から最後の行に向かって行うことを意味しています。
上記のループの中のループの中にあるIF文
If Not IsEmpty(Cells(lngRow, lngCol).Value) Then
で、データが空っぽでないときに変数・strDataにデータを追加していくようにしています。
変数に値を代入していく
strData = strData & vbTab & Cells(lngRow, lngCol).Value
の部分ですが、こういった処理を行うときに、区切り文字として「,」(カンマ)を使う方もいらっしゃるようですが、データとして「,」が存在することもあることを考えて、私はタブにするほうがトラブルが少ないんじゃないかと考え、vbTabを使っています。
出力先セルを指定する
Set rngOutPut = Application.InputBox(Prompt:="出力先セルを指定してください。", Type:=8)l
の部分ですが、ダイアログボックスで[キャンセル]ボタンをクリックしたときにエラーとなるとを回避するために、その前に
On Error Resume Next
をいれてあります。
データを出力する
For lngLop = 1 To UBound(varData)
rngOutPut.Offset(lngLop - 1, 0).Value = varData(lngLop)
Next
の部分ですが、配列を作るための
strData = strData & vbTab & Cells(lngRow, lngCol).Value
という処理によって、先頭に実際にはデータがなくいきなりvbTabがきてしまうのでループ処理を「1」オリジンにして、Offset関数の第1引数を「-1」しています。
データによっては、表示形式の関係で、上記マクロを実行すると妙な表示になって並べられてしまう場合もあるでしょう。例えば、「12:00」というデータなら「0.5」になってしまうはずです。
そのような場合、マクロ実行後に書式設定をしたり、そもそもそういったデータで上記マクロをよく使うのなら書式設定処理をマクロに組み込んだりするのがいいと思います。
- Newer:円マーク・通貨記号を全角で表示する−!¥
- Older:n週間前の日付を求める関数は?−引き算・減算
Home » エクセルマクロ・Excel VBAの使い方 » マクロのサンプル » データを一列に並べるExcelマクロ