エクセルで、定期的に特定の列のデータだけを抜き出したい場合、VBAを使えば手作業をかなり削減できると思うけど、使いたい列数が多いと、VBAのコーディングも結構面倒。入力データ列と出力データ列を紐付けるコーディングは、列が増えるに従って繰り返し記述の面倒さ、コーディングの冗長さが増す。
入力列と出力列を結びつけるために1列ごとにコーディングするのを避ける方法はないものかと考えてみたところ、配列を使うことで簡潔に記述できそうだと考えました。今回、配列と言うよりも、なんちゃって配列と言った感じ。
入力元の列を保存する変数と出力先の列を保存する変数を定義し、1つのカウンターで
入力元の列と出力先の列を結びつけてみた。
入力元の列がA、C、E、G、出力先の列がA、B、C、D、つまりあるシートから別のシートに、A列をA列に、C列をB列に、E列をC列に、G列をD列に順番にコピぺするために、変数に保存した列表す文字を左から順にMID関数を使って読んでいく。対象が4列あるので、4回繰り返すにはfor〜nextを使う。
入力元データはシート“コピー元”のA1セルから入力されており、
出力先データは“コピー先”のA1セルから出力されるとする。
最終行は、ActiveCell.CurrentRegionで対象となるデータ範囲をrngとしてrng.Rows.Countでゲットする。
for~nextで繰り返す回数は、対象列を保存している変数をLen関数で列の個数を求めて上限として設定した。
Sub PartlyCopy()
Dim rng As Range '一括コピー範囲指定用range
Dim copy_from As String '一括コピー元の列&行
Dim copy_to As String '一括コピー先の列&行
Dim first_line As Integer: first_line = 1 '開始行
Dim last_line As Integer '終了行
Dim cnt As Integer '列のカウンター
Dim col_from As String: col_from = "ACEG"
Dim col_to As String: col_to = "ABCD"
Worksheets("コピー元").Activate
Range("A1").Select
Set rng = ActiveCell.CurrentRegion
last_line = rng.Rows.Count
For cnt = 1 To Len(col_to)
copy_from = Mid(col_from, cnt, 1) & first_line & ":" & _
Mid(col_from, cnt, 1) & last_line
copy_to = Mid(col_to, cnt, 1) & first_line & ":" & _
Mid(col_to, cnt, 1) & last_line
Range(copy_from).Copy
Worksheets("コピー先").Activate
Range(copy_to).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Worksheets("コピー元").Activate
Next
MsgBox ("終了")
End Sub
