エクセルで、定期的に特定の列のデータだけを抜き出したい場合、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