【VBAリファレンス】生成AI活用研究Geminiと100本ノック 第9本目:フィルターコピーを極める

スポンサーリンク

概要:膨大なデータから「必要なものだけ」を瞬時に抽出する技術

業務効率化の現場において、Excelの「フィルター機能」は最も頻繁に使用されるツールの一つです。しかし、大量のデータから特定の条件に合致する行を抽出し、それを別のシートやブックへコピーして加工するという一連の作業を手作業で行うのは、非効率であるばかりか、ヒューマンエラーの温床となります。

本稿では、生成AI「Gemini」を活用して、VBAにおける「フィルターコピー(オートフィルターによる抽出と転記)」を自動化するノックを行います。単にコードを書くだけではなく、保守性が高く、かつ実行速度を最適化するための「プロの作法」を徹底的に解説します。VBA中級者を目指す方にとって、この「フィルター転記」のパターンを完全に習得することは、業務自動化の土台を築くことに他なりません。

詳細解説:フィルターコピーの論理構成と落とし穴

VBAでフィルターコピーを実装する際、多くの初学者が陥る罠があります。それは、「ループ処理(For Eachなど)で1行ずつ判定してコピーする」という手法です。データが100行程度なら問題ありませんが、数万行規模のデータに対してループを回すと、処理時間は数分単位にまで膨れ上がります。

プロが選択するべきは、「RangeオブジェクトのAutoFilterメソッド」と「SpecialCellsメソッド」の組み合わせです。この手法は、Excelの内部エンジンを直接操作するため、計算コストが極めて低く、一瞬で抽出が完了します。

プロセスは以下の4段階で構成されます。
1. フィルター対象の範囲を特定する。
2. AutoFilterメソッドを使用して条件を指定する。
3. SpecialCells(xlCellTypeVisible)を使用して、可視セルのみを特定する。
4. 抽出された範囲をコピーし、目的の場所へ貼り付ける。

ここで重要なのは、抽出結果が0件だった場合の例外処理です。抽出結果がない状態でSpecialCellsを実行すると、VBAはエラーを吐いて停止します。このエラーハンドリングをいかにスマートに記述するかが、AI生成コードの品質を左右するポイントとなります。

サンプルコード:安全かつ高速なフィルター転記の実装

以下に、Geminiと共に設計した「汎用性の高いフィルター転記モジュール」を提示します。このコードは、抽出対象が存在しない場合でもエラーで止まることなく、ユーザーに通知する設計になっています。


Sub ExecuteFilterCopy()
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim rngData As Range
    Dim rngVisible As Range
    
    ' 設定
    Set wsSource = ThisWorkbook.Sheets("Data")
    Set wsDest = ThisWorkbook.Sheets("Report")
    
    ' 転記先をクリア
    wsDest.Cells.Clear
    
    ' データ範囲の取得
    Set rngData = wsSource.Range("A1").CurrentRegion
    
    ' フィルター解除
    If wsSource.AutoFilterMode Then wsSource.AutoFilterMode = False
    
    ' フィルター実行(例:A列が"完了"のものを抽出)
    rngData.AutoFilter Field:=1, Criteria1:="完了"
    
    ' 抽出結果の取得(エラーハンドリング付き)
    On Error Resume Next
    Set rngVisible = rngData.SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    
    ' 抽出結果がある場合のみ処理
    If Not rngVisible Is Nothing Then
        rngVisible.Copy Destination:=wsDest.Range("A1")
        MsgBox "転記が完了しました。", vbInformation
    Else
        MsgBox "該当するデータが見つかりませんでした。", vbExclamation
    End If
    
    ' フィルター解除
    wsSource.AutoFilterMode = False
End Sub

実務アドバイス:生成AIを「コード生成のパートナー」にする方法

今回の「9本目:フィルターコピー」の実装にあたり、Geminiに単に「コードを書いて」と指示するだけでは不十分です。実務レベルまで引き上げるために、以下のプロンプト戦略を推奨します。

1. **制約条件の明確化**: 「エラーハンドリングを含めて」「処理速度を最優先して」「変数宣言を強制する(Option Explicit)」といった制約を必ず付け加えます。
2. **モジュール化の依頼**: 「この処理を他のシートでも使い回せるように、引数付きの関数として定義して」と指示し、再利用性を高めます。
3. **コードレビューの実施**: 生成されたコードをGeminiに貼り付け、「このコードに潜在的なバグや、より効率的な書き方はあるか?」と逆質問してください。AIは自分の書いたコードを客観的に評価する能力に長けており、思わぬ改善案(例えば、画面更新を停止するApplication.ScreenUpdating = Falseの挿入など)を提示してくれます。

実務においては、コードの正しさだけでなく、「誰がメンテナンスするか」が重要です。AI生成コードをそのまま貼り付けるのではなく、必ずコメントを付記し、誰が見ても処理の流れがわかる状態にしておくことが、プロとしての責任です。

まとめ:VBAとAIの融合が拓く未来

今回の「フィルターコピー100本ノック」を通じて、VBAにおけるデータ抽出がいかに標準化できるかをご理解いただけたかと思います。フィルター機能は、単なる抽出ツールではなく、巨大なデータベースをExcel上で自在に操るための「コンパス」です。

Geminiのような生成AIは、構文を暗記する作業を代替してくれます。しかし、そのコードが「なぜそのように動くのか」「どの場面でエラーが発生する可能性があるのか」を理解するのは、我々人間の役割です。

今回紹介したコードをベースに、ご自身の業務環境に合わせて条件(Criteria)を書き換えたり、複数の条件を指定する高度なフィルターに挑戦してみてください。VBAとAIを使いこなす能力は、これからの時代、事務職のみならず、あらゆるビジネスパーソンにとって最強の武器となります。

次回は「10本目:複数ブックの集約」について解説します。フィルターコピーの技術をさらに応用し、個別のブックに散らばったデータを一箇所に統合する高度な手法に踏み込みます。本日の学習を終えたら、ぜひ一度、自身の業務データでこのコードを走らせ、劇的な高速化を体感してください。技術は使ってこそ、自身の血肉となります。

タイトルとURLをコピーしました