【AIマクロ探究シリーズ#5】集めたデータを分析シートへ!特定列だけ自動転記マクロ

AI

皆さん、こんにちは!下町AI探究者のガジュマロです。
すがすがしい日が続いていますね! (2025/4/17現在)

さて、「AIマクロ探究シリーズ」第5弾です!前回(#4)は、AIの力を借りて、複数のExcelファイルから特定のシート(例//:「サマリー」シート)を一つのブックに自動で集めてくるマクロに挑戦しました。これで、あちこちに散らばっていた情報が一箇所にまとまり、いよいよデータを分析する本来の仕事の準備が整いつつありますね。

でも、ここで更に一つの課題が湧き上がってきませんか? 「シートは集まったけど、このたくさんのシートから、分析に必要なデータだけを抽出しなければならないんだよね…」

そう、せっかくシートを集めても、その中のデータを活用するために、また手作業でのコピー&ペーストが発生する可能性があります。これでは、自動化の効果も半減ですよね。特に、各シートの特定の列のデータだけを、しかも飛び飛びの列から抜き出して、分析用のシートに転記したい場合…これは新たな永遠作業の始まりかもしれません。

今回のテーマは、まさにこの「集めた複数シートから、必要な列データだけを抜き出して、分析用シートに一括で転記(追記)する」マクロです!#4で集めたデータを活用するための、重要な”橋渡し”の自動化に挑戦しましょう。

集めたシートから、さらに”いいとこ取り”でコピペ…大変ですよね

具体的に想像してみましょう。

#4のマクロなどで、たくさんの「サマリー_〇〇支店」シートが集まったブックがあります。そして、別シートとして「分析シート」があり、ここには既に計算式やグラフ、そしてヘッダー(項目名)が準備されています。この「分析シート」の特定の列に、各「サマリー」シートからデータを転記すれば、分析結果が自動で更新される、そんな便利な仕組みです。

しかし、必要なデータは各「サマリー」シートの例えば…

  • B列にある「商品コード」
  • D列にある「販売数量」
  • G列にある「売上金額」 の3列だけだとします。そして、これらを「分析シート」のA列、B列、C列の既存データの続きに追加していきたい、と考えます。

これを手作業でやるとなると…

  1. 「サマリー_A支店」シートを開く。
  2. B列のデータをコピー → 「分析シート」のA列末尾にペースト。
  3. D列のデータをコピー → 「分析シート」のB列末尾にペースト。
  4. G列のデータをコピー → 「分析シート」のC列末尾にペースト。
  5. 次の「サマリー_B支店」シートを開いて、上記2~4を繰り返す…

…シートの数だけこの作業を繰り返すのは、なかなかの忍耐力を必要としますよね。列が飛び飛びだったり、貼り付け先の最終行を探したりする手間も加われば、もはやこれは精神修行といっても過言ではないかもしれません。

AIに”必要なデータだけ転記(追記)”をお願い! ついでに設定項目整理も依頼!

「この転記作業を、もっとスマートにしたい!」

そこで、今回もAIにマクロ作成をお願いします。今回は、これまでの経験を踏まえ、後で自分でもカスタマイズしやすいように、設定項目をコードの冒頭にまとめてもらうよう、そして一度に分析ができるようにデータは既存のものを消さずに追記するよう、具体的にお願いしてみましょう。

【AIへのお願い(プロンプト)例】

Excel VBA マクロを作成してください。
現在開いているExcelブック内で、以下の処理を実行します。

1. 「分析シート」という名前のシートを除き、「サマリー」で始まる名前の全てのシート(データシート)を処理対象とします。
2. 各データシートの2行目から最終行までを読み取ります。
3. データシートの B列、D列、G列 の値をそれぞれ取得します。
4. 取得した値を、「分析シート」の A列、B列、C列 にそれぞれ転記します。
5. 「分析シート」には、データが見つかるたびに、A列からC列の最終入力行の次に追加していく形式で転記してください。(既存データはクリアしません)
6. マクロのコード内で、ユーザーが変更する可能性のある設定項目(シート名、列指定など)は、コードの冒頭にまとめて記述してください。

※ポイント:今回はデータクリアは依頼せず、「追記」形式であることをお願いしました。もし追記でなく、データクリアの方が良ければ、プロンプトを変更すればAIは答えてくれます。

AIの回答はこちら!設定項目もまとまってる!

AIはこの注文の多い?お願いに応えて、設定箇所が分かりやすく整理され、データを追記する仕組を持った、次のようなコードを生成してくれました。

Sub TransferSpecificColumns_Append_Configurable()
    ' 説明: 「分析シート」を除く指定パターンシートから、指定した複数列のデータを
    '       「分析シート」の対応する列の最終行の下に追加します。(ヘッダーは事前設定前提)

    ' --- ★★★ 設定項目 (ここをご自身の状況に合わせて変更してください) ★★★ ---
    Const AnalysisSheetName As String = "分析シート"     ' 転記先のシート名
    Const SourceSheetPattern As String = "サマリー"       ' 転記元のシート名のパターン (前方一致)
    ' Const HeaderRowNum As Long = 1 ' ヘッダー行番号 (転記開始行判定に利用。今回は使用せず)
    Const StartDataRow As Long = 2                     ' 転記元データの開始行番号 (通常は2)
    
    ' --- ↓↓↓ 転記する列の対応を設定 ↓↓↓ ---
    Dim SourceColumns() As Variant ' コピー元の列文字 (配列) - 下で設定
    Dim DestColumns() As Variant   ' コピー先の列文字 (配列) - 下で設定
    
    ' ★コピー元列を指定 (例: B列, D列, G列)
    SourceColumns = Array("B", "D", "G")
    ' ★コピー先列を指定 (SourceColumnsの順番に対応させる。例: A列, B列, C列へ)
    DestColumns = Array("A", "B", "C")
    ' ★ヘッダーは分析シートに事前に用意しておいてください (このマクロでは設定しません)
    ' --- ★★★ 設定項目ここまで ★★★ ---

    ' --- 変数宣言 (マクロ内部用) ---
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim analysisWS As Worksheet
    Dim lastRowSource As Long
    Dim nextPasteRow As Long
    Dim i As Long, c As Long ' ループカウンタ
    Dim sourceColNum As Long
    Dim destColNum As Long
    Dim firstDestColNum As Long ' 最初の転記先列番号 (最終行判定用)

    ' --- 初期設定とチェック ---
    Set wb = ThisWorkbook
    
    ' 配列の要素数が一致するかチェック (Source と Dest)
    If UBound(SourceColumns) <> UBound(DestColumns) Then
        MsgBox "設定エラー: SourceColumns と DestColumns の要素数が一致しません。" & vbCrLf & _
               "コード冒頭の「設定項目」を確認してください。", vbCritical
        Exit Sub
    End If

    ' 分析シートの存在チェックと設定
    On Error Resume Next
    Set analysisWS = wb.Sheets(AnalysisSheetName)
    On Error GoTo 0
    If analysisWS Is Nothing Then
        MsgBox "シート名「" & AnalysisSheetName & "」が見つかりません。先に作成してください。", vbCritical
        Exit Sub
    End If

    ' --- 処理開始 ---
    Application.ScreenUpdating = False ' 画面描画停止

    ' 分析シートの次の空行を取得 (最初の転記先列で判定)
    On Error Resume Next ' 無効な列文字の場合のエラー回避
    firstDestColNum = analysisWS.Range(DestColumns(LBound(DestColumns)) & 1).Column
    If Err.Number <> 0 Then GoTo InvalidColumnError ' 列指定エラー処理へ
    On Error GoTo 0
    nextPasteRow = analysisWS.Cells(analysisWS.Rows.Count, firstDestColNum).End(xlUp).Row + 1
    ' もしシートが完全に空(ヘッダーのみ等)でEnd(xlUp)がヘッダー行を返した場合、データ開始行から開始するように調整
    If nextPasteRow <= HeaderRowNum Then nextPasteRow = StartDataRow ' StartDataRowを使うよりHeaderRowNum+1の方が良いかも?今回はStartDataRowを採用
    ' 注: 上記は分析シートのヘッダーが必ず1行目にある前提。より厳密にはヘッダー行番号(HeaderRowNum)を使うべきかもしれませんが、
    '     StartDataRow(=通常2)を使うことで、万一ヘッダー行以下が完全に空でも2行目から書き始める動作になります。

    ' --- 各シートをループ処理 ---
    For Each ws In wb.Worksheets
        ' 分析シート自身と、名簿パターンに合わないシートは処理対象外
        If ws.Name <> AnalysisSheetName And ws.Name Like SourceSheetPattern & "*" Then
            
            ' データ最終行を取得 (対象シートの最初のコピー元列で判定)
             On Error Resume Next ' 無効な列文字の場合のエラー回避
             sourceColNum = ws.Range(SourceColumns(LBound(SourceColumns)) & 1).Column
             If Err.Number <> 0 Then GoTo InvalidColumnError ' 列指定エラー処理へ
             On Error GoTo 0
            lastRowSource = ws.Cells(ws.Rows.Count, sourceColNum).End(xlUp).Row
            
            ' データ行が存在すればループ
            If lastRowSource >= StartDataRow Then
                ' 各行のデータを処理
                For i = StartDataRow To lastRowSource
                    ' 指定された列のデータを転記
                    For c = LBound(SourceColumns) To UBound(SourceColumns)
                         ' コピー元列文字から列番号取得
                         On Error Resume Next
                         sourceColNum = ws.Range(SourceColumns(c) & 1).Column
                         If Err.Number <> 0 Then GoTo InvalidColumnError ' 列指定エラー処理へ
                         ' コピー先列文字から列番号取得
                         destColNum = analysisWS.Range(DestColumns(c) & 1).Column
                         If Err.Number <> 0 Then GoTo InvalidColumnError ' 列指定エラー処理へ
                         On Error GoTo 0
                         
                         ' 値をコピー (値のみ転記)
                         analysisWS.Cells(nextPasteRow, destColNum).Value = ws.Cells(i, sourceColNum).Value
                    Next c
                    nextPasteRow = nextPasteRow + 1 ' 次の貼り付け行へ
                Next i
            End If
        End If
    Next ws

    ' --- 終了処理 ---
    analysisWS.Activate ' 分析シートを表示
    ' 処理完了後、転記が始まったあたりを選択状態にする(任意)
    If nextPasteRow > StartDataRow Then
       analysisWS.Cells(StartDataRow, firstDestColNum).Select
    Else
       analysisWS.Cells(1, 1).Select ' データがなければA1
    End If
    Application.ScreenUpdating = True  ' 画面描画再開
    
    MsgBox "データの転記(追記)が完了しました。", vbInformation, "処理完了"
    GoTo Cleanup ' 正常終了時のクリーンアップへ

InvalidColumnError: ' 列文字エラー発生時の処理
    Application.ScreenUpdating = True
    MsgBox "設定項目にある列文字指定を確認してください。" & vbCrLf & _
           "エラー箇所: " & SourceColumns(c) & " または " & DestColumns(c), vbCritical, "設定エラー"
    
Cleanup: ' オブジェクト解放
    Set ws = Nothing
    Set analysisWS = Nothing
    Set wb = Nothing

End Sub

プロンプト通り、ユーザーが変更する設定(シート名、列の対応など)がコード冒頭の「★★★ 設定項目 ★★★」セクションに分かりやすくまとめられています。そして、分析シートの既存データをクリアせず、最終行の下にデータを追加していく動作になっています。

このマクロのポイント(設定の分かりやすさと列マッピング)

このマクロの使いやすさの鍵は、コード冒頭にまとめられた「設定項目」です。

    ' --- ★★★ 設定項目 (ここをご自身の状況に合わせて変更してください) ★★★ ---
    Const AnalysisSheetName As String = "分析シート"     ' 転記先のシート名
    Const SourceSheetPattern As String = "サマリー"       ' 転記元のシート名のパターン (前方一致)
    ' Const HeaderRowNum As Long = 1 ' ヘッダー行番号 (転記開始行判定に利用。今回は使用せず)
    Const StartDataRow As Long = 2                     ' 転記元データの開始行番号 (通常は2)
    
    ' --- ↓↓↓ 転記する列の対応を設定 ↓↓↓ ---
    Dim SourceColumns() As Variant ' コピー元の列文字 (配列) - 下で設定
    Dim DestColumns() As Variant   ' コピー先の列文字 (配列) - 下で設定
    
    ' ★コピー元列を指定 (例: B列, D列, G列)
    SourceColumns = Array("B", "D", "G")
    ' ★コピー先列を指定 (SourceColumnsの順番に対応させる。例: A列, B列, C列へ)
    DestColumns = Array("A", "B", "C")
    ' ★ヘッダーは分析シートに事前に用意しておいてください (このマクロでは設定しません)
    ' --- ★★★ 設定項目ここまで ★★★ ---

ここで皆さんの作業に合わせて変更するのは主に以下の点です。

  • AnalysisSheetName, SourceSheetPattern: どのシート間でデータを動かすか
  • StartDataRow: 元データの開始行
  • SourceColumns = Array(…): どの列からデータをコピーするか、順番に指定。
  • DestColumns = Array(…): SourceColumnsの各列を、どの列へ転記するか、順番を対応させて指定

SourceColumnsとDestColumnsは追加や削減が可能なので、コピーする列が3から増減する場合でも対応可能です。ただしその場合は、要素の「数」と「順番」を正確に対応させないと、正確に転記されません。

また、このコードは analysisWS.Cells(analysisWS.Rows.Count, firstDestColNum).End(xlUp).Row + 1 という部分で、分析シートの最終行の次を自動で見つけて、そこからデータを追記するようになっています。これにより、実行するたびに前のデータが消えることなく、新しいデータをどんどん追加していくことができます。

このマクロの使い方と注意点(列の対応を正確に!)

このマクロを正しく動かすには、シートの準備と、特に「列のマッピング設定」の確認が重要です。

使う前の準備:

  1. 安全な作業用フォルダで実行: 必ずコピーしたファイルで試しましょう。(作業用フォルダの作成方法は#4の記事を参考にしてください)
  2. 「分析シート」を準備: データを転記し、分析を行うためのシートをブック内に用意し、ヘッダー行(項目名)を事前に設定しておきます。(このマクロはヘッダーを自動作成せず、既存データに追記します)
  3. 「データシート」を確認: 転記元となるシート(例: “サマリー”で始まるシート)が存在し、コピーしたい列が存在するか確認します。

マクロの実行手順:いつもの

  1. VBEを開きコードを貼り付け: 分析用ブックで Alt + F11 → 「挿入」→「標準モジュール」→ 上記コードを貼り付け。
  2. コードの「設定項目」を修正: 貼り付けたコード冒頭の**「★★★ 設定項目 ★★★」**セクションを、ご自身の実際のシート名、列構成に合わせて書き換えます。特に SourceColumns, DestColumns の設定と対応関係は入念に!
  3. マクロを実行: コード内にカーソルを置いて F5 キーなどで実行します。
  4. 完了確認: 完了メッセージを確認後、「分析シート」の既存データの下に、データシートから転記された情報が追加されているか、計算結果などが更新されているか確認しましょう。
  5. マクロを眺めてみる: どのようなコードで成り立っているか、見て学んでみましょう。

まとめ:データ収集から分析への”橋渡し”も自動化!

今回は、「AIマクロ探究シリーズ」の第五弾として、複数シートから分析に必要な特定列のデータだけを抜き出して分析シートへ自動転記(追記)するマクロに挑戦しました。今回は最初からAIに「設定項目をまとめてほしい」とお願いしたので、カスタマイズもしやすくなったかと思います。

#4のシート収集マクロと今回の列転記マクロを組み合わせれば、「複数ファイルからシートを集め」→「集めたシートから必要なデータを転記」という、データ活用の一連の流れを大きく自動化できますね!

これまで多くの時間と手間を要していた転記作業から解放され、ボタン一つで分析用データが準備できれば、本来注力すべき「データを見て考える」時間をもっと増やせるのではないでしょうか。

ぜひ、皆さんの定型的なデータ転記作業も、AIマクロで効率化してみてください。

それでは、また次回の「AIマクロ探究シリーズ」でお会いしましょう!

コメント

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