Excel VBA で必要列だけを任意順に転記する AdvancedFilter 活用術

目次

概要

AdvancedFilter の CopyToRange を利用すると、元データから必要な列だけを抽出し、任意の列順で別シートへ転記できます。転記先の見出し行に「ほしい列名を希望順で並べておく」だけで実現できるため、ピボットや Power Query を使わずに手軽なレイアウト変更が可能です。


前提条件

項目内容
対応 ExcelMicrosoft 365 / 2016 以降
元データシート Sales の B3:F200(見出し行を含む)
転記先シート Export
転記したい列Date, Amount, Customer の 3 列
マクロ設置先標準モジュール

転記先シートの準備手順

  1. シート Export の A1:C1 に、上記 3 列の見出しを 希望の順序で 入力します。 A1B1C1DateAmountCustomer
  2. 見出しセル以外は空欄のままにしておきます。AdvancedFilter が転記先の見出しを認識し、対応する列データのみを順番どおりに書き込みます。

VBA サンプルコード

Sub CopySelectedFieldsInOrder()

    Dim rngSource As Range      ' 元データ範囲
    Dim rngDest   As Range      ' 転記先見出しセル
    
    '--- 範囲設定 ---
    Set rngSource = Worksheets("Sales").Range("B3").CurrentRegion   ' B3:F200
    Set rngDest   = Worksheets("Export").Range("A1:C1")             ' 見出しのみ
    
    '--- AdvancedFilter で転記 ---
    rngSource.AdvancedFilter _
        Action:=xlFilterCopy, _
        CriteriaRange:=Empty,    ' 条件なしで全行対象
        CopyToRange:=rngDest, _
        Unique:=False            ' 重複行を削除したい場合は True に変更します

    MsgBox "必要列を希望順で Export シートへ転記しました。", vbInformation

End Sub

コード解説

説明
7–8CurrentRegion で見出し行を含む Sales シートの表全体を取得しています。
13CriteriaRange を省略(Empty)すると条件指定なしで全レコードが対象になります。
14CopyToRange に転記先見出しセル範囲 A1:C1 を指定し、並び順を制御しています。
15Unique:=FalseTrue に変更すると、同一行を除外して転記できます。

応用ポイント

目的実装方法
先頭にシリアル番号列を追加したい転記後に With Worksheets("Export").Range("D2").Resize(recordNum): .Formula = "=ROW()-1": End With のように追記します。
特定条件で転記したいCriteriaRange に条件範囲を設定し、OR/AND 条件を自由に組み合わせます。
月ごとにシートを分けて転記ループで年月ごとに CopyToRange の先頭セルをずらし、シートを自動生成すると効率的です。

よくある質問

質問回答
見出しセルを誤ってスペル違いで入力したところ空欄になりました。元データの見出しと完全一致していないと転記されません。コピー&ペーストで作成ください。
転記先に既存データがあると上書きされますか。既存セルがある場合、その下へは追記されず上書きになります。追記する場合は rngDest を空セルに変更してください。

まとめ

AdvancedFilter の CopyToRange に転記先見出しを用意し、Unique パラメータを必要に応じて設定するだけで、必要列を好きな順序で簡単に転記できます。データレイアウトを手早く整えたい場面でぜひご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次