毎月末、フォルダに溜まった何十個かのExcelファイルを1つの集計ブックにまとめる。
よくある作業ですが、Workbooks.Open や Dir関数、SaveAs を毎回ゼロから書いていると、地味にバグります。
私自身、最初に組んだときは「元ファイルを上書きしてしまって戻せない」「フォルダ末尾の \ 抜けでファイルが見つからない」といった事故を何度かやらかしました。
そこでこの記事では、ファイル処理を部品(テンプレート)に分けて貼るだけで動く形にまとめ直しました。
標準モジュールに丸ごと貼り、最後に RunFileProcessingTemplate を実行すれば、フォルダ選択から集計、保存までが一気に流れます。

Workbooks.Open するときは ReadOnly:=True で開き、Close SaveChanges:=False で閉じる。
この2つを守るだけで、「集計してたら元ファイル上書きしちゃった…」という事故はゼロになります。
配布するテンプレートは、コピペで持ち帰って使い回せる関数が5つ、そして動かすための呼び出し側Subが2つ、合計7つです。
最初に覚えるのは1〜5の関数だけでOKです。
6・7は、この5つを「業務でどう呼び出すか」のサンプル実装と思ってください。
| No | Function関数名 | 役割 |
|---|---|---|
| 1 | AddTrailingBackslash | フォルダパス末尾の \ を整える |
| 2 | PickFolder | フォルダ選択ダイアログを出す |
| 3 | GetExcelFiles | フォルダ内のExcelファイル一覧を作る |
| 4 | OpenExcelWorkbook | 読み取り専用で安全に開く |
| 5 | BuildSavePath | 日付付きの保存先パスを作る |
| No | 呼び出しSub名 | 役割 |
|---|---|---|
| 6 | ImportExcelFilesToSummary | 上の5関数を組み合わせて、複数ファイルを集計シートへ取り込む本体 |
| 7 | RunFileProcessingTemplate | すべてのマクロを呼び出す入り口 |
この記事のゴールは「Excelファイルを開くコードを暗記すること」ではなく、フォルダを選び、ファイルを探し、読み取り専用で開き、元ファイルを保存せずに閉じ、結果だけを別名で保存する一連の流れを、テンプレートとして使い回せるようにすることです。
【 この記事の概要 】
| よく使う度 | |
| 難しさ | |
| 覚えておくと安心度 |
VBAコードを始める前の3ステップ準備
VBAが初めての方は、コードを貼る前に次の3つだけ済ませておくとスムーズです。
すでにマクロ有効ブックを作ったことがある方は、読み飛ばしてOKです。
① マクロ有効ブック(.xlsm)として保存する
- 新規Excelブックを開く
Ctrl + Sを押し、ファイルの種類で「Excel マクロ有効ブック (*.xlsm)」を選択- 任意の名前で保存
.xlsxのまま保存するとマクロが消えるので、必ず.xlsmを選んでください。
② 標準モジュールを用意する
Alt + F11でVBE(Visual Basic Editor)を開く- 上部メニュー ⇒ 挿入 ⇒ 標準モジュール をクリック
- 左側のプロジェクト一覧に
Module1が追加され、右側に白い編集画面が出ればOKです
このModule1の中に、後ほど完成コードを丸ごと貼り付けます

③ 集計用のシートを2枚作っておく
貼り付け先のブックには、あらかじめ次の2つのシートを作っておきます。
| シート名 | 役割 |
|---|---|
| 集計 | 複数ファイルの明細をまとめる先 |
| 処理ログ | 処理結果(時刻・ファイル名・取り込み行数)を残す |

シート名は半角・全角・前後スペースまで完全一致が必要です。
違っていると Subscript out of rangeエラーで止まります。
取り込み元の各ファイルは、「明細」 というシート名に 「A1:E1」の見出しと2行目以降のデータが入っている前提で動きます。

VBAファイル処理の完成テンプレート|貼って実行するだけのコード
最初に完成形を載せます。
1行ずつ理解する必要はありません。
「この塊全部がテンプレートで、動かすのは最後の RunFileProcessingTemplate だけ」と分かれば十分です。
完成コード:標準モジュールにそのまま貼り付ける
「クリック」して、VBAコードの全体をみる
Option Explicit
Private Const DEST_SHEET_NAME As String = "集計"
Private Const LOG_SHEET_NAME As String = "処理ログ"
' フォルダパスの末尾に \ を付けて返します。
Public Function AddTrailingBackslash(ByVal folderPath As String) As String
If Len(folderPath) = 0 Then
AddTrailingBackslash = ""
ElseIf Right$(folderPath, 1) = "\" Then
AddTrailingBackslash = folderPath
Else
AddTrailingBackslash = folderPath & "\"
End If
End Function
' フォルダ選択画面を表示し、選択されたフォルダパスを返します。キャンセル時は "" を返します。
Public Function PickFolder( _
Optional ByVal dialogTitle As String = "処理するフォルダを選択してください", _
Optional ByVal initialFolder As String = "") As String
Dim fd As FileDialog
Dim selectedFolder As String
If Len(initialFolder) = 0 Then
initialFolder = ThisWorkbook.Path
End If
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.Title = dialogTitle
If Len(initialFolder) > 0 Then
.InitialFileName = AddTrailingBackslash(initialFolder)
End If
If .Show <> -1 Then
PickFolder = ""
Exit Function
End If
selectedFolder = .SelectedItems(1)
End With
PickFolder = AddTrailingBackslash(selectedFolder)
End Function
' Dir関数で対象ファイルのフルパス一覧を Collection として返します。
Public Function GetExcelFiles( _
ByVal folderPath As String, _
Optional ByVal filePattern As String = "*.xlsx") As Collection
Dim files As Collection
Dim fileName As String
Set files = New Collection
folderPath = AddTrailingBackslash(folderPath)
fileName = Dir(folderPath & filePattern)
Do While fileName <> ""
If Left$(fileName, 2) <> "~$" Then
files.Add folderPath & fileName
End If
fileName = Dir()
Loop
Set GetExcelFiles = files
End Function
' Excelブックを安全設定で開き、開いた Workbook を返します。
Public Function OpenExcelWorkbook( _
ByVal filePath As String, _
Optional ByVal readOnlyMode As Boolean = True, _
Optional ByVal updateLinksMode As Long = 0, _
Optional ByVal ignoreReadOnlyRecommendedMode As Boolean = True) As Workbook
If Len(Dir(filePath)) = 0 Then
Err.Raise vbObjectError + 1000, , "ファイルが見つかりません: " & filePath
End If
Set OpenExcelWorkbook = Workbooks.Open( _
Filename:=filePath, _
UpdateLinks:=updateLinksMode, _
ReadOnly:=readOnlyMode, _
IgnoreReadOnlyRecommended:=ignoreReadOnlyRecommendedMode, _
AddToMru:=False)
End Function
' 保存先フォルダ、基本名、拡張子から、日時付きの保存先フルパスを返します。
Public Function BuildSavePath( _
ByVal saveFolder As String, _
ByVal baseName As String, _
Optional ByVal extension As String = ".xlsx") As String
saveFolder = AddTrailingBackslash(saveFolder)
If Left$(extension, 1) <> "." Then
extension = "." & extension
End If
BuildSavePath = saveFolder & baseName & "_" & Format(Now, "yyyymmdd_hhnnss") & extension
End Function
' 複数のExcelファイルを開き、明細シートを集計シートへ追記して結果を保存します。
Public Sub ImportExcelFilesToSummary( _
ByVal sourceFolder As String, _
ByVal saveFolder As String, _
Optional ByVal filePattern As String = "*.xlsx", _
Optional ByVal sourceSheetName As String = "明細")
Dim files As Collection
Dim filePath As Variant
Dim srcWb As Workbook
Dim srcWs As Worksheet
Dim dstWs As Worksheet
Dim logWs As Worksheet
Dim srcRange As Range
Dim copyRows As Long
Dim nextRow As Long
Dim logRow As Long
Dim savePath As String
On Error GoTo ErrorHandler
Set dstWs = ThisWorkbook.Worksheets(DEST_SHEET_NAME)
Set logWs = ThisWorkbook.Worksheets(LOG_SHEET_NAME)
Set files = GetExcelFiles(sourceFolder, filePattern)
If files.Count = 0 Then
MsgBox "対象ファイルが見つかりませんでした。", vbInformation
Exit Sub
End If
dstWs.Cells.Clear
dstWs.Range("A1:F1").Value = Array("元ファイル", "日付", "拠点", "担当", "商品", "金額")
nextRow = 2
logWs.Cells.Clear
logWs.Range("A1:D1").Value = Array("時刻", "ファイル", "結果", "メモ")
logRow = 2
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Each filePath In files
Set srcWb = OpenExcelWorkbook(CStr(filePath), True, 0, True)
Set srcWs = srcWb.Worksheets(sourceSheetName)
Set srcRange = srcWs.Range("A1").CurrentRegion
If srcRange.Rows.Count > 1 Then
copyRows = srcRange.Rows.Count - 1
dstWs.Cells(nextRow, 1).Resize(copyRows, 1).Value = srcWb.Name
srcRange.Offset(1, 0).Resize(copyRows, 5).Copy Destination:=dstWs.Cells(nextRow, 2)
nextRow = nextRow + copyRows
End If
logWs.Cells(logRow, 1).Value = Now
logWs.Cells(logRow, 2).Value = srcWb.Name
logWs.Cells(logRow, 3).Value = "OK"
logWs.Cells(logRow, 4).Value = copyRows & "行を取り込み"
logRow = logRow + 1
srcWb.Close SaveChanges:=False
Set srcWb = Nothing
Next filePath
dstWs.Columns.AutoFit
logWs.Columns.AutoFit
savePath = BuildSavePath(saveFolder, "集計結果", ".xlsx")
ThisWorkbook.Worksheets(DEST_SHEET_NAME).Copy
ActiveWorkbook.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close SaveChanges:=False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox files.Count & "件のファイル処理が完了しました。" & vbCrLf & savePath, vbInformation
Exit Sub
ErrorHandler:
Application.DisplayAlerts = True
Application.ScreenUpdating = True
If Not srcWb Is Nothing Then
srcWb.Close SaveChanges:=False
End If
MsgBox "ファイル処理中にエラーが発生しました。" & vbCrLf & _
"対象: " & CStr(filePath) & vbCrLf & _
Err.Description, vbExclamation
End Sub
' マクロ一覧から実行する入口です。フォルダ選択から集計まで呼び出します。
Public Sub RunFileProcessingTemplate()
Dim sourceFolder As String
Dim saveFolder As String
sourceFolder = PickFolder("取り込み元のExcelファイルが入ったフォルダを選択してください")
If sourceFolder = "" Then Exit Sub
saveFolder = PickFolder("集計結果を保存するフォルダを選択してください")
If saveFolder = "" Then Exit Sub
ImportExcelFilesToSummary sourceFolder, saveFolder, "*.xlsx", "明細"
End Sub実行する:マクロ一覧から RunFileProcessingTemplate を選ぶ
貼り付けたら、Excel側で Alt + F8 を押してマクロ一覧を開き、RunFileProcessingTemplate を選んで「実行」。
これだけで全て実行することができます。

実行すると、以下のような順で動作します。
- 取り込み元フォルダの選択ダイアログが出る
- 続いて保存先フォルダの選択ダイアログが出る
- 取り込み元フォルダ内の
.xlsxを1つずつ読み取り専用で開き、明細シートを集計シートへ追記する - 元ファイルは保存せずに閉じる
集計シートだけを集計結果_yyyymmdd.xlsxとして別名保存する
実行結果:3ファイルが1つの集計シートにまとまる
検証では、同じ列構成のExcelファイルを3つ用意しました。
下の画像は、そのうち東京ファイルをExcelで開いた実際の画面です。

そのまま実行すると、集計 シートに3ファイル分のデータが順番にまとまります。

ポイントは1列目に 元ファイル 名を残していることです。
あとから「この行はどのファイルから来たのか」を追えるようにしておくと、差し戻しや修正依頼が来たときの調査が一気に楽になります。
処理ログはこんな具合です。

時刻・ファイル名・結果・メモの4列。最初はこれで十分です。
失敗したときに「何時に・どのファイルで・何が起きたか」が残っていれば、原因に辿り着けます。
完成コード全体を部品ごとに分解すると、次のような構造になっています。

ここから先は、この7つの部品を構築順に1つずつ開いていきます。
FileDialogとDir関数でファイルを選ぶ・探す部品
最初の3つはすべて Function(関数)です。
この関数は、Workbooks.Openを呼ぶ前の下ごしらえに使う、再利用しやすいパーツです。
いきなり Workbooks.Open を書くより、まず「フォルダ末尾を整える」「フォルダを選ぶ」「対象ファイルを集める」を関数にしておくと、本体側のループがすっきりします。
テンプレート1:AddTrailingBackslash でパスを整える
Public Function AddTrailingBackslash(ByVal folderPath As String) As String
If Len(folderPath) = 0 Then
AddTrailingBackslash = ""
ElseIf Right$(folderPath, 1) = "\" Then
AddTrailingBackslash = folderPath
Else
AddTrailingBackslash = folderPath & "\"
End If
End Function地味すぎて存在意義が薄く見える関数ですが、これを通さないと、たとえばフォルダパスが C:\Users\sample\売上 のときにファイル名を結合した瞬間、
C:\Users\sample\売上売上_2026-04_東京.xlsxという壊れたパスができあがります。
取得したフォルダパス「C:\Users\sample\売上」と、ファイルパス「売上2026-04東京.xlsx」の間に「\」が付いていないことにより、パスが不良と判定されエラーが発生してしまいます。
パスを整える関数AddTrailingBackslash(folderPath) を1回通すことで、
C:\Users\sample\売上\売上_2026-04_東京.xlsxとファイルパスが整います。Dir も SaveAs も裏で何度も呼ぶので、ここで吸収しておくのが楽です。
テンプレート2:PickFolder でフォルダを選ぶ
この関数はApplication.FileDialog(msoFileDialogFolderPicker) をラップした関数です。
キャンセル時は空文字列 "" を返します。
Public Function PickFolder( _
Optional ByVal dialogTitle As String = "処理するフォルダを選択してください", _
Optional ByVal initialFolder As String = "") As String
Dim fd As FileDialog
Dim selectedFolder As String
If Len(initialFolder) = 0 Then
initialFolder = ThisWorkbook.Path
End If
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
With fd
.Title = dialogTitle
If Len(initialFolder) > 0 Then
.InitialFileName = AddTrailingBackslash(initialFolder)
End If
If .Show <> -1 Then
PickFolder = ""
Exit Function
End If
selectedFolder = .SelectedItems(1)
End With
PickFolder = AddTrailingBackslash(selectedFolder)
End Function
呼び出し側はキャンセル判定をワンセットで書きます。
sourceFolder = PickFolder("取り込み元フォルダを選択してください")
If sourceFolder = "" Then Exit Subこれを忘れると、空のフォルダパスのまま Dir や SaveAs まで進んでしまい、エラーで止まります。
私は最初これが原因不明で30分ほど溶かしてしまいました。
FileDialogについて学びたい方には以下もおすすめです
テンプレート3:GetExcelFiles で対象ファイルを集める
Dir関数を回して、フォルダ内のExcelファイルを Collection で返します。
Public Function GetExcelFiles( _
ByVal folderPath As String, _
Optional ByVal filePattern As String = "*.xlsx") As Collection
Dim files As Collection
Dim fileName As String
Set files = New Collection
folderPath = AddTrailingBackslash(folderPath)
fileName = Dir(folderPath & filePattern)
Do While fileName <> ""
If Left$(fileName, 2) <> "~$" Then
files.Add folderPath & fileName
End If
fileName = Dir()
Loop
Set GetExcelFiles = files
End Functionこの関数を呼び出す際は、次のように1行で呼び出すことができます。
Set files = GetExcelFiles(sourceFolder, "*.xlsx").xlsm も拾いたいときは "*.xls*" に変えるだけです。
ワイルドカード「*」を使用することで、どちらも呼び出すことができるようになります。
地味に効くのが If Left$(fileName, 2) <> "~$" Then の一行で、誰かがExcelファイルを開きっぱなしにしているときにできる一時ファイル(~$ で始まるやつ)を弾いています。
これがないと、開きっぱなしのファイルがあるたびにエラーで落ちます。

Workbooks.Open・SaveAs・Closeで開く・保存・閉じる部品
ここから本体側です。
VBAのファイル処理で事故が起きるのは、ほぼこの周辺となります。「読み取り専用で開き、保存せずに閉じる」という大原則さえ守れば、最悪のケース(取り込み元データの破壊)は避けられます。
テンプレート4:OpenExcelWorkbook で安全にワークブックを開く
次のコードを実施することで、安全に参照したいデータがあるExcelブックを開き、オブジェクト変数に入れることができます。
Public Function OpenExcelWorkbook( _
ByVal filePath As String, _
Optional ByVal readOnlyMode As Boolean = True, _
Optional ByVal updateLinksMode As Long = 0, _
Optional ByVal ignoreReadOnlyRecommendedMode As Boolean = True) As Workbook
If Len(Dir(filePath)) = 0 Then
Err.Raise vbObjectError + 1000, , "ファイルが見つかりません: " & filePath
End If
Set OpenExcelWorkbook = Workbooks.Open( _
Filename:=filePath, _
UpdateLinks:=updateLinksMode, _
ReadOnly:=readOnlyMode, _
IgnoreReadOnlyRecommended:=ignoreReadOnlyRecommendedMode, _
AddToMru:=False)
End Function引数のデフォルト値を ReadOnly:=True / UpdateLinks:=0 にしているのがポイントです。
集計目的でファイルを開くだけなら、書き込みも外部リンク更新もいりません。
何も指定せず OpenExcelWorkbook(filePath) と呼ぶだけで、デフォルトで一番安全な状態になります。
Set srcWb = OpenExcelWorkbook(filePath)開いたブックは必ず srcWb のようなオブジェクト変数に入れる、という習慣も大事です。ActiveWorkbook だけで処理を書くと、別のブックをクリックした瞬間に処理対象がズレることがあります。

Close SaveChanges:=False で保存せずに閉じる(元ファイルを守る)
開いたブックは必ず srcWb のような変数に入れる、という習慣も大事です。ActiveWorkbook だけで処理を書くと、別のブックをクリックした瞬間に処理対象がズレることがあります。
閉じるときは必ず Close SaveChanges:=False をセットで実行しましょう。
srcWb.Close SaveChanges:=False
Set srcWb = NothingSaveChanges:=False を付けるだけで、「元ファイルに何か変更が入っていたとしても保存せずに閉じる」になります。 ReadOnly:=True と組み合わせれば二重の安全策です。
エラー処理側でも、開きっぱなしのブックは必ず閉じます。
ErrorHandler:
If Not srcWb Is Nothing Then
srcWb.Close SaveChanges:=False
End Ifここをサボると、エラー後に元ブックが開いたまま残り、次の実行でファイルロックがかかって地獄を見ます。

テンプレート5:BuildSavePath と SaveAs で上書きせず別名保存する
集計結果は、元ファイルとは別のブックに SaveAs で保存します。
日付付きのファイル名は、BuildSavePath関数で組み立てます。
Public Function BuildSavePath( _
ByVal saveFolder As String, _
ByVal baseName As String, _
Optional ByVal extension As String = ".xlsx") As String
saveFolder = AddTrailingBackslash(saveFolder)
If Left$(extension, 1) <> "." Then
extension = "." & extension
End If
BuildSavePath = saveFolder & baseName & "_" & Format(Now, "yyyymmdd_hhnnss") & extension
End FunctionsaveFolder が C:\sample\output\ のとき、以下の結果が返ります。
C:\sample\output\集計結果_20260510_153012.xlsxBuildSavePath関数は、保存先のファイルパスを作るための関数です。
この関数だけでは、Excelファイルは保存されません。
実際に保存する処理は、次の SaveAs の部分で行います。
保存処理は、集計 シートだけを新しいブックにコピーしてから書き出します。
ThisWorkbook.Worksheets(DEST_SHEET_NAME).Copy
ActiveWorkbook.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close SaveChanges:=FalseFileFormat は出したい形式に応じて変えます。 よく使うものはこのくらいです。
| 拡張子 | FileFormat | 主な用途 |
|---|---|---|
.xlsx | xlOpenXMLWorkbook | 普通のExcelブック(マクロは消える) |
.xlsm | xlOpenXMLWorkbookMacroEnabled | マクロも残したいとき |
.csv | xlCSVUTF8 | 他システムへ流すとき |
.xlsx で保存するとマクロは消えます。
マクロ込みで配布したい場合は .xlsm を選んでください。

複数ファイル処理の本体・カスタマイズ・FAQ
最後に、ここまでの5つの関数を呼び出して1つの処理にまとめる、本体ループ(Sub)とエントリーポイント(Sub)です。
ここから先は「サンプルとしての呼び出し側」なので、自分の業務に合わせて中身を書き換えていく前提で読んでください。
ImportExcelFilesToSummary:複数ファイル処理の本体
ここが今回の主役のコードになります。
Public Sub RunFileProcessingTemplate()
Dim sourceFolder As String
Dim saveFolder As String
sourceFolder = PickFolder("取り込み元のExcelファイルが入ったフォルダを選択してください")
If sourceFolder = "" Then Exit Sub
saveFolder = PickFolder("集計結果を保存するフォルダを選択してください")
If saveFolder = "" Then Exit Sub
ImportExcelFilesToSummary sourceFolder, saveFolder, "*.xlsx", "明細"
End SubGetExcelFiles関数で集めた一覧を For Each で回し、OpenExcelWorkbook で開き、明細 シートを 集計 へ追記し、Close SaveChanges:=False で閉じる。
最後に結果だけを SaveAs で別名保存する、という流れが1つのSubに入っています。
引数は4つです。
ImportExcelFilesToSummary sourceFolder, saveFolder, "*.xlsx", "明細"sourceFolder… Excelファイルが入っているフォルダsaveFolder… 集計結果の保存先フォルダfilePattern…*.xlsxや*.xls*などの絞り込み(既定*.xlsx)sourceSheetName… 各ファイルから読むシート名(既定明細)
中で何をしているかを順に追うと、
集計処理ログシートを掴んで、見出しを書き直して初期化GetExcelFilesでファイル一覧を取得。0件なら通知して終了Application.ScreenUpdating = FalseとDisplayAlerts = Falseで画面チラつきと確認ダイアログを止める- ファイルを1つずつ
OpenExcelWorkbookで開き、明細シートのCurrentRegionを取得 - 見出し行を除いた本体だけを
集計シートへコピー、1列目には元ファイル名を入れる 処理ログに時刻・ファイル名・OK・取り込み行数を記録Close SaveChanges:=Falseで元ファイルを保存せずに閉じる- ループが終わったら、
集計シートだけをBuildSavePathで組み立てたパスへSaveAs - 画面更新と確認ダイアログを元に戻して完了通知
エラー処理側でも、画面設定を戻し、開きっぱなしのブックを閉じてからメッセージを出します。On Error GoTo を使うときは、設定を戻す処理を必ずエラーハンドラ側にも書くのが鉄則です。
RunFileProcessingTemplate:マクロ一覧から呼ぶ入口
ImportExcelFilesToSummary は引数を4つ取るので、マクロ一覧(Alt + F8)からは直接呼び出せません。
引数なしで呼べるラッパーを別に用意しています。
Public Sub RunFileProcessingTemplate()
Dim sourceFolder As String
Dim saveFolder As String
sourceFolder = PickFolder("取り込み元のExcelファイルが入ったフォルダを選択してください")
If sourceFolder = "" Then Exit Sub
saveFolder = PickFolder("集計結果を保存するフォルダを選択してください")
If saveFolder = "" Then Exit Sub
ImportExcelFilesToSummary sourceFolder, saveFolder, "*.xlsx", "明細"
End Sub入口を分けておくと、後から「業務Aは *.xlsm で 売上 シート」「業務Bは *.xlsx で 明細 シート」のように、Run〜 をコピーして増やしていけます。
本体(ImportExcelFilesToSummary)には触らずに済むので、メンテが楽です。
自分の業務に合わせて変える場所
5つの関数(1〜5)はそのまま使い回せます。
最初に変えるのは、呼び出し側の `RunFileProcessingTemplate` の最後の1行だけです。
ImportExcelFilesToSummary sourceFolder, saveFolder, "*.xlsx", "明細"| 変えたいこと | どこを直すか |
|---|---|
読み込むシート名が 明細 以外 | 4つ目の引数 "明細" を実際のシート名に |
.xlsm も対象にしたい | 3つ目の引数 "*.xlsx" を "*.xls*" に |
| 保存名を変えたい | ImportExcelFilesToSummary 内の BuildSavePath(... "集計結果" ...) を任意の名前に |
| 取り込む列数が違う | Resize(copyRows, 5) の 5 を実際の列数に、 Range("A1:F1") の見出し範囲も合わせる |
ほとんどの業務はこの4箇所のどれかで吸収できます。
よくあるエラーと対処
VBAのエラーは、たいてい黄色や赤色のダイアログで突然出ます。
ダイアログの「実行時エラー ‘○○’:」という番号が出てしまった場合は、慌てて閉じる前に 「エラー番号とメッセージのスクショを撮っておく」と、検索もAIへの質問もしやすくなります。
特にハマりやすいのが、Application.DisplayAlerts = False の戻し忘れです。
Excel全体で確認ダイアログが出なくなり、「今日Excelおかしい…」と勘違いします。
エラーハンドラ側にも True に戻す行を必ず入れてください。
さらに掘り下げたい部分はここから

このテンプレートをAIに改造させるときのプロンプト例
ChatGPTやClaude・Geminiに自分用への改造を頼むとき、現状と条件を分けて書くと精度が上がります。
Excel VBAで複数のExcelファイルを処理するマクロを改造したいです。
【現状のテンプレート】
- 標準モジュールに以下が貼ってあります:
- 再利用関数(5つ): AddTrailingBackslash / PickFolder / GetExcelFiles /
OpenExcelWorkbook / BuildSavePath
- 呼び出し側Sub(2つ): ImportExcelFilesToSummary / RunFileProcessingTemplate
- 取り込み元フォルダを選び、保存先フォルダを選び、各ファイルの「明細」
シートを「集計」シートへ追記し、結果を別ブックに保存しています
【今回やりたいこと】
1. 取り込むシート名を「明細」から「売上データ」に変えたい
2. 取り込む列数を5列から7列にしたい
3. 集計シートの見出しを「日付/拠点/担当/商品/数量/単価/金額」にしたい
4. 元ファイルは絶対に書き換えたくない
【環境】
- Excel for Microsoft 365 / Windows 11 / VBA初心者
ImportExcelFilesToSummary と RunFileProcessingTemplate の中で、
変えるべき場所だけ最小の差分で示してください。「全部書き直して」と頼むより、「変える場所だけ最小の差分で」と指定すると、テンプレートの構造を崩されずに済みます。

