VBAでExcelファイルを処理するテンプレート集|開く・保存・閉じる

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
VBAでExcelファイルを処理するテンプレート集|開く・保存・閉じる

毎月末、フォルダに溜まった何十個かのExcelファイルを1つの集計ブックにまとめる。 
よくある作業ですが、Workbooks.OpenDir関数SaveAs を毎回ゼロから書いていると、地味にバグります。

私自身、最初に組んだときは「元ファイルを上書きしてしまって戻せない」「フォルダ末尾の \ 抜けでファイルが見つからない」といった事故を何度かやらかしました。

そこでこの記事では、ファイル処理を部品(テンプレート)に分けて貼るだけで動く形にまとめ直しました。
標準モジュールに丸ごと貼り、最後に RunFileProcessingTemplate を実行すれば、フォルダ選択から集計、保存までが一気に流れます。

VBAファイル処理テンプレートの全体像
この記事から1つだけ持ち帰るなら

Workbooks.Open するときは ReadOnly:=True で開き、Close SaveChanges:=False で閉じる。
この2つを守るだけで、「集計してたら元ファイル上書きしちゃった…」という事故はゼロになります。

配布するテンプレートは、コピペで持ち帰って使い回せる関数が5つ、そして動かすための呼び出し側Subが2つ、合計7つです。

最初に覚えるのは1〜5の関数だけでOKです。
6・7は、この5つを「業務でどう呼び出すか」のサンプル実装と思ってください。

急ぎの人は、今すぐテンプレート完全版をみる

スクロールできます
NoFunction関数名役割
1AddTrailingBackslashフォルダパス末尾の \ を整える
2PickFolderフォルダ選択ダイアログを出す
3GetExcelFilesフォルダ内のExcelファイル一覧を作る
4OpenExcelWorkbook読み取り専用で安全に開く
5BuildSavePath日付付きの保存先パスを作る
スクロールできます
No呼び出しSub名役割
6ImportExcelFilesToSummary上の5関数を組み合わせて、複数ファイルを集計シートへ取り込む本体
7RunFileProcessingTemplateすべてのマクロを呼び出す入り口

この記事のゴールは「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つのシートを作っておきます。

スクロールできます
シート名役割
集計複数ファイルの明細をまとめる先
処理ログ処理結果(時刻・ファイル名・取り込み行数)を残す
初期Excel
ポイント

シート名は半角・全角・前後スペースまで完全一致が必要です。

違っていると Subscript out of rangeエラーで止まります。

取り込み元の各ファイルは、「明細」 というシート名に 「A1:E1」の見出しと2行目以降のデータが入っている前提で動きます。

VBAの始め方について学びたい方には以下もおすすめです

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 を選んで「実行」。
これだけで全て実行することができます。

マクロ一覧からRunFileProcessingTemplateを実行

実行すると、以下のような順で動作します。

  • 取り込み元フォルダの選択ダイアログが出る
  • 続いて保存先フォルダの選択ダイアログが出る
  • 取り込み元フォルダ内の .xlsx を1つずつ読み取り専用で開き、明細 シートを 集計 シートへ追記する
  • 元ファイルは保存せずに閉じる
  • 集計 シートだけを 集計結果_yyyymmdd.xlsx として別名保存する

実行結果:3ファイルが1つの集計シートにまとまる

検証では、同じ列構成のExcelファイルを3つ用意しました。
下の画像は、そのうち東京ファイルをExcelで開いた実際の画面です。

処理前のExcelファイルサンプル(東京ファイル)

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

Excel上で複数ファイルの集計結果を確認している画面

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

処理ログはこんな具合です。

Excel上でVBAファイル処理の処理ログを確認している画面

時刻・ファイル名・結果・メモの4列。最初はこれで十分です。
失敗したときに「何時に・どのファイルで・何が起きたか」が残っていれば、原因に辿り着けます。

完成コード全体を部品ごとに分解すると、次のような構造になっています。

関数化したVBAテンプレートのコード概要

ここから先は、この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

とファイルパスが整います。
DirSaveAs も裏で何度も呼ぶので、ここで吸収しておくのが楽です。

テンプレート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
PickFolder でフォルダを選ぶ

呼び出し側はキャンセル判定をワンセットで書きます。

sourceFolder = PickFolder("取り込み元フォルダを選択してください")
If sourceFolder = "" Then Exit Sub

これを忘れると、空のフォルダパスのまま DirSaveAs まで進んでしまい、エラーで止まります。
私は最初これが原因不明で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ファイルを開きっぱなしにしているときにできる一時ファイル(~$ で始まるやつ)を弾いています。
これがないと、開きっぱなしのファイルがあるたびにエラーで落ちます。

Dir関数について学びたい方には以下もおすすめです

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 = Nothing

SaveChanges:=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 Function

saveFolderC:\sample\output\ のとき、以下の結果が返ります。

C:\sample\output\集計結果_20260510_153012.xlsx

BuildSavePath関数は、保存先のファイルパスを作るための関数です。
この関数だけでは、Excelファイルは保存されません。

実際に保存する処理は、次の SaveAs の部分で行います。
保存処理は、集計 シートだけを新しいブックにコピーしてから書き出します。

ThisWorkbook.Worksheets(DEST_SHEET_NAME).Copy
ActiveWorkbook.SaveAs Filename:=savePath, FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close SaveChanges:=False

FileFormat は出したい形式に応じて変えます。 よく使うものはこのくらいです。

スクロールできます
拡張子FileFormat主な用途
.xlsxxlOpenXMLWorkbook普通のExcelブック(マクロは消える)
.xlsmxlOpenXMLWorkbookMacroEnabledマクロも残したいとき
.csvxlCSVUTF8他システムへ流すとき

.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 Sub

GetExcelFiles関数で集めた一覧を 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 = FalseDisplayAlerts = 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への質問もしやすくなります。

対象ファイルが見つかりません。

filePattern のミスの可能性があります。*.xlsx か *.xls* を確認してください。

シートが見つかりません。(Subscript out of range

sourceSheetName と実ファイルのシート名がズレている可能性があります。

上書き確認ダイアログが出ます。

DisplayAlerts = False を設定する前に SaveAs している可能性があります。

確認ダイアログが二度と出なくなりました。

DisplayAlerts = True に戻し忘れです。エラー処理側にも True を書きましょう。

元ファイルが保存されてしまいました。

SaveChanges:=False を True にしています。または書き忘れの可能性があります。

マクロが消えました。

.xlsx で保存しています。マクロを残すなら .xlsm + xlOpenXMLWorkbookMacroEnabledを使用しましょう。

特にハマりやすいのが、Application.DisplayAlerts = False の戻し忘れです。

Excel全体で確認ダイアログが出なくなり、「今日Excelおかしい…」と勘違いします。
エラーハンドラ側にも True に戻す行を必ず入れてください。

さらに掘り下げたい部分はここから

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「共通」を見る 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」...
スポンサーリンク

このテンプレートを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 の中で、
変えるべき場所だけ最小の差分で示してください。

「全部書き直して」と頼むより、変える場所だけ最小の差分で」と指定すると、テンプレートの構造を崩されずに済みます。

スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次