皆さん、こんにちは!下町AI探究者のガジュマロです。
すがすがしい日が続いていますね! (2025/4/17現在)
さて、「AIマクロ探究シリーズ」第5弾です!前回(#4)は、AIの力を借りて、複数のExcelファイルから特定のシート(例//:「サマリー」シート)を一つのブックに自動で集めてくるマクロに挑戦しました。これで、あちこちに散らばっていた情報が一箇所にまとまり、いよいよデータを分析する本来の仕事の準備が整いつつありますね。
でも、ここで更に一つの課題が湧き上がってきませんか? 「シートは集まったけど、このたくさんのシートから、分析に必要なデータだけを抽出しなければならないんだよね…」
そう、せっかくシートを集めても、その中のデータを活用するために、また手作業でのコピー&ペーストが発生する可能性があります。これでは、自動化の効果も半減ですよね。特に、各シートの特定の列のデータだけを、しかも飛び飛びの列から抜き出して、分析用のシートに転記したい場合…これは新たな永遠作業の始まりかもしれません。
今回のテーマは、まさにこの「集めた複数シートから、必要な列データだけを抜き出して、分析用シートに一括で転記(追記)する」マクロです!#4で集めたデータを活用するための、重要な”橋渡し”の自動化に挑戦しましょう。
集めたシートから、さらに”いいとこ取り”でコピペ…大変ですよね
具体的に想像してみましょう。
#4のマクロなどで、たくさんの「サマリー_〇〇支店」シートが集まったブックがあります。そして、別シートとして「分析シート」があり、ここには既に計算式やグラフ、そしてヘッダー(項目名)が準備されています。この「分析シート」の特定の列に、各「サマリー」シートからデータを転記すれば、分析結果が自動で更新される、そんな便利な仕組みです。
しかし、必要なデータは各「サマリー」シートの例えば…
- B列にある「商品コード」
- D列にある「販売数量」
- G列にある「売上金額」 の3列だけだとします。そして、これらを「分析シート」のA列、B列、C列の既存データの続きに追加していきたい、と考えます。
これを手作業でやるとなると…
- 「サマリー_A支店」シートを開く。
- B列のデータをコピー → 「分析シート」のA列末尾にペースト。
- D列のデータをコピー → 「分析シート」のB列末尾にペースト。
- G列のデータをコピー → 「分析シート」のC列末尾にペースト。
- 次の「サマリー_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 という部分で、分析シートの最終行の次を自動で見つけて、そこからデータを追記するようになっています。これにより、実行するたびに前のデータが消えることなく、新しいデータをどんどん追加していくことができます。
このマクロの使い方と注意点(列の対応を正確に!)
このマクロを正しく動かすには、シートの準備と、特に「列のマッピング設定」の確認が重要です。
使う前の準備:
- 安全な作業用フォルダで実行: 必ずコピーしたファイルで試しましょう。(作業用フォルダの作成方法は#4の記事を参考にしてください)
- 「分析シート」を準備: データを転記し、分析を行うためのシートをブック内に用意し、ヘッダー行(項目名)を事前に設定しておきます。(このマクロはヘッダーを自動作成せず、既存データに追記します)
- 「データシート」を確認: 転記元となるシート(例: “サマリー”で始まるシート)が存在し、コピーしたい列が存在するか確認します。
マクロの実行手順:いつもの
- VBEを開きコードを貼り付け: 分析用ブックで Alt + F11 → 「挿入」→「標準モジュール」→ 上記コードを貼り付け。
- コードの「設定項目」を修正: 貼り付けたコード冒頭の**「★★★ 設定項目 ★★★」**セクションを、ご自身の実際のシート名、列構成に合わせて書き換えます。特に SourceColumns, DestColumns の設定と対応関係は入念に!
- マクロを実行: コード内にカーソルを置いて F5 キーなどで実行します。
- 完了確認: 完了メッセージを確認後、「分析シート」の既存データの下に、データシートから転記された情報が追加されているか、計算結果などが更新されているか確認しましょう。
- マクロを眺めてみる: どのようなコードで成り立っているか、見て学んでみましょう。
まとめ:データ収集から分析への”橋渡し”も自動化!
今回は、「AIマクロ探究シリーズ」の第五弾として、複数シートから分析に必要な特定列のデータだけを抜き出して分析シートへ自動転記(追記)するマクロに挑戦しました。今回は最初からAIに「設定項目をまとめてほしい」とお願いしたので、カスタマイズもしやすくなったかと思います。
#4のシート収集マクロと今回の列転記マクロを組み合わせれば、「複数ファイルからシートを集め」→「集めたシートから必要なデータを転記」という、データ活用の一連の流れを大きく自動化できますね!
これまで多くの時間と手間を要していた転記作業から解放され、ボタン一つで分析用データが準備できれば、本来注力すべき「データを見て考える」時間をもっと増やせるのではないでしょうか。
ぜひ、皆さんの定型的なデータ転記作業も、AIマクロで効率化してみてください。
それでは、また次回の「AIマクロ探究シリーズ」でお会いしましょう!
コメント