VBAでエクセル自動化|フォルダ内のファイルリスト化&データ転記の手順

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

「複数ある別ファイルのデータをVBAを使用して自動取得したい。どうすればいいんだろう…」
このように悩んでいませんか?


指定したフォルダ内のファイル名を自動でリスト化したい

別のエクセルファイルからデータを1つのシートにまとめたい

今回は私が使用している
VBAコードを紹介しますね。


業務でエクセルを使っていると、毎回同じ作業を繰り返すことが多く、ファイル管理やデータ転記に手間取ってしまうことも少なくありませんよね。
そんな時、「もっと効率的に作業を進められたら…」と感じることはありませんか?

今回ご紹介するのは、私が実際に業務で使っている「VBAコードを使ったデータ取得と転記のテンプレート」です。
このコードを使うと、フォルダ内のファイル名をエクセルに自動でリスト化し、リンク設定から別のブックへのデータ転記まで、一気に自動化できます。

さらに、別のエクセルファイルから複数のデータを1つのエクセルに集約することも簡単です。
加えて、このVBAコードはカスタマイズ可能で、あなたの業務に合わせて機能を追加することもできます。
たとえば、定期的なデータ更新作業の効率化や、複数のファイルから必要なデータを短時間で転記することができます。

この記事では、初心者にも分かりやすいサンプルコードとともに、実装手順を丁寧に解説していますので、安心してご覧ください。
ぜひ最後までお読みいただき、日々の作業を効率化する一歩を踏み出してみましょう!

【 この記事の概要 】

難しさ
時短効果度
作業効果度
目次

この記事を見て「できるようになる」こと

この記事を読むことで、以下のことができるようになります。

スポンサーリンク

このエクセルで出来ること。VBAでエクセルファイルを自動取得・転記する | フォルダ内のファイルを一括処理する

今回ご紹介するエクセルは、次のような見た目になっています。

このVBAコードを使うと、フォルダ内のエクセルファイルを自動的に取得し、複数のファイルを1つのエクセルシートにまとめることができます。
これにより、手動で行っていた転記作業を一括で自動化でき、業務効率が大幅に向上します。

エクセルの外観

このエクセルのボタンを解説 | 簡単な動作で自動化

操作ボタンは2つあり、このような動作を行います。

  1. ファイル取得ボタン
    • 指定したフォルダ内のすべてのエクセルファイルを取得し、セルにファイル名とハイパーリンクをリスト化します。
  2. データ転記ボタン
    • チェックマークをつけたファイルのデータを自動的に別のシートに転記し、1つのエクセルファイルに集約します。

このVBAコードの主な機能

このエクセルの主な機能
  1. 指定したフォルダ内のファイルを自動的にリスト化
  2. ハイパーリンクを設定して、クリックでファイルを開けるように
  3. 別ブックのデータを簡単に転記して、1つのファイルにまとめる

それでは、次にこのエクセルの細かい動作について、具体的な手順とコードを使って解説していきます。


VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

詳細動作を解説 | VBAでフォルダ内のファイルをリスト化し、ハイパーリンクを自動設定する方法

VBAを使用してフォルダ内のエクセルファイルをリスト化し、ハイパーリンクを自動的に設定する手順を解説します。

このエクセルシートは「管理シート」のみで構成されています。
ここで、ファイル取得ボタンとデータ転記ボタンを使用して、ファイルの自動管理とデータの自動転記を行います。

エクセルの外観

「ファイル取得ボタン」の動作

ファイル取得ボタンの動作内容
  1. 「ファイル取得ボタン」を押すと、指定したフォルダ内のすべてのエクセルファイルが、自動的にセルに転記されます。
    例えば、フォルダ内に「サンプル1.xlsx」〜「サンプル5.xls」があれば、それらがエクセルシートのセルに転記されます。

    フォルダ内のファイルを出力する
     
  2. さらに、ハイパーリンクが自動的に設定されるため、取得された「フォルダパス」や「ファイルパス」をクリックするだけで、対象のエクセルファイルを即座に開くことが可能です。これにより、手動でファイルを探す手間が省けます。

    フォルダ・ファイルをハイパーリンクで開くことができます

「ファイル取得ボタン」の動作

「ファイル取得ボタン」の動作内容
  • 条件
    • 「サンプル1.xlsx」~「サンプル5.xls」は、以下の表でデータが保管されているとします。
      ※表であれば、何行・何列あっても、どのような形式でも問題ありません。
       表は「A1」セルから始まることを想定しています。

      サンプル1エクセルとサンプル2エクセルのデータ
       
  • 「データ転記ボタン」を押すと、指定されたエクセルファイルからデータを自動的に取得し、1つのシートに転記します。
    「レ」を指定しているエクセルのみ取得することができます。
    このボタンを使うことで、複数のエクセルファイルからデータを簡単に集約することができます。

    新しいシートが作成されます
  • また、「サンプル1」シートや「サンプル2」シートの中身は、元データの表が転記されます。

    転記先のシートデータ

以上が、このエクセルの詳細動作説明です。
このVBAコードを使用することで、複数ファイルの管理が大幅に効率化され、データ転記作業も自動化できるため、業務の生産性が向上します。

VBAでファイル取得を実現するためのエクセル初期設定方法

VBAコードを使用してフォルダ内のエクセルファイルを自動取得し、データを転記するためには、まずエクセルのセルに初期設定を行う必要があります。

以下の手順に従って、エクセルのセルに正しい表記を設定してください。

セルに表記する内容について

このエクセルの各セルの表記内容は、下記の通りとしてください。

エクセルの初期設定
セルに表記する内容について
  1. A1」セルに「ファイル選択」と入力
  2. 「A2」セルに「フォルダパス」と入力
  3. 「A4」セルに「指定フォルダ内に保管されているファイル名」と入力
  4. シート名を「管理シート」と変更
    ※その他のシートがある場合は、削除してください。

セルの表記内容は、各自変更してもらっても構いません。
※ シート名は変更したらコードの変更が必要です。
セルの場所だけ変更しないようにしてください。

ファイル取得ボタンの動作を実現するVBAコード

以下では、エクセルの「ファイル取得ボタン」を押した際に、指定したフォルダ内のファイルをリスト化し、自動でハイパーリンクを設定するVBAコードを解説します。
※「ファイル取得ボタン」コードのみ実装するだけであれば、エクセルから指定したフォルダのファイルを開くこともできます。

このコードを標準モジュールに転記ください。
※「Module1」や「Module2」どこに保存しても問題ありません。

コードの記載箇所

コード詳細 | ファイル取得ボタンの動作を実現

Option Explicit

'//■ Enum設定
Public Enum 行
    パス記載 = 2
    ファイル転記説明 = 4
    ファイル名開始
End Enum

Public Enum 列
    附番 = 1
    ファイル名記載
    パス記載
    レ点 = 6
End Enum

Public Sub ファイル名を取得()
    Dim folderPath As String
    Dim filePath As String
    Dim fileName As String
    Dim i As Long
    Dim lastRow As Long
    Dim MyRange As Range  '//セルの罫線に使用

    '// 初期設定
    '※ファイルダイアログの初期で表示すされるパス
    Const initPath As String = "C:\サンプル"
    
    '// エラー処理
    On Error GoTo ErrLabel
    
    '// ダイアログでフォルダパス取得
    folderPath = get_folderPath(initPath)
    
    '//最終行取得
    lastRow = Cells(Rows.Count, 列.附番).End(xlUp).Row
    
    '// データ削除
    Call delete_Data(lastRow)

    '// 指定フォルダー内のファイルを取得
    filePath = folderPath & "\*.xls*"
    fileName = Dir(filePath, vbHidden Or vbReadOnly)
    
    i = 0
    Do While fileName <> ""
            Cells(行.ファイル名開始 + i, 列.附番) = i + 1 '//附番を記載
            'Cells(行.ファイル名開始 + i, 列.ファイル名記載) = fileName '//ファイル名を記載
            Cells(行.ファイル名開始 + i, 列.レ点) = "レ" '//「レ」を記載

            Set MyRange = Cells(行.ファイル名開始 + i, 列.レ点) '//「レ」を記載するセルの情報を変更
                    MyRange.HorizontalAlignment = xlCenter
                    MyRange.BorderAround LineStyle:=xlContinuous
                    MyRange.Borders.Weight = xlMedium
                    MyRange.Borders.Color = RGB(255, 192, 0)  '//罫線の色
                    MyRange.Interior.Color = RGB(255, 255, 204)  '//セルの色

            ActiveSheet.Hyperlinks.Add anchor:=Cells(行.ファイル名開始 + i, 列.ファイル名記載), _
                                                         Address:=folderPath & "\" & fileName, _
                                                         TextToDisplay:=fileName  '//ハイパーリンク設定
            i = i + 1
            fileName = Dir()
    Loop

    '//再度、最終行取得
    lastRow = Cells(Rows.Count, 列.附番).End(xlUp).Row
    
    '//抜き出したエクセルを並び替え
    Range(Cells(行.ファイル名開始, 列.ファイル名記載), Cells(lastRow, 列.レ点)) _
            .Sort key1:=Cells(行.ファイル名開始, 列.ファイル名記載), order1:=xlAscending

    '// 検索用の「レ」をドロップダウンにする
    Range(Cells(行.ファイル名開始, 列.レ点), Cells(lastRow, 列.レ点)) _
            .Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="レ"
    
    Exit Sub

ErrLabel:
        Dim msg As String
        msg = "エラー発生: " & Err.Source & vbCrLf & _
                    "エラー番号: " & Err.Number & vbCrLf & _
                    "エラー内容: " & Err.Description & vbCrLf
        MsgBox (msg)

End Sub

Private Sub delete_Data(ByVal lastRow As Long)
    
    If lastRow <> Cells(行.ファイル転記説明, 列.附番).Row Then
            Range(Cells(行.ファイル名開始, 列.附番), Cells(lastRow, 列.レ点)).Clear
    Else
            Columns(Cells(行.ファイル名開始, 列.レ点).Column).Clear
    End If
    
End Sub

Private Function get_folderPath(ByVal initPath As String) As String
    
    With Application.FileDialog(msoFileDialogFolderPicker)
                .InitialFileName = initPath
                .AllowMultiSelect = False

                .Title = "フォルダの選択"
        If .Show = True Then
                'Cells(行.パス記載, 列.パス記載) = .SelectedItems(1) '//ファイル転記箇所が変更となった際はこちらも変更をすること
                ActiveSheet.Hyperlinks.Add anchor:=Cells(行.パス記載, 列.パス記載), _
                                                         Address:=.SelectedItems(1), _
                                                         TextToDisplay:=.SelectedItems(1)
                
                get_folderPath = .SelectedItems(1)
        End If
    End With
End Function

コードの動作概要

STEP
フォルダパスの取得

最初に、ユーザーがフォルダを指定するために「ファイルダイアログ」が表示されます。
get_folderPath関数がその役割を担い、初期フォルダパス(initPath)を基点に、ユーザーが選択したフォルダのパスを取得します。

STEP
フォルダ内のファイルを取得しリスト化

次に、指定されたフォルダ内の全てのエクセルファイル(拡張子が .xls* のファイル)を対象に、Dir関数を使用してファイル名を1つずつ取得します。
ファイル名が取得されるたびに、指定したセル範囲にファイル名をリスト化していきます。

STEP
ハイパーリンクの設定

ファイル名がリスト化されると同時に、セルに自動でハイパーリンクが設定されます。
これにより、ユーザーはクリックするだけで対象のファイルを開くことができます。

STEP
リストの整列と「レ」設定

取得されたファイルリストは、自動的にソートされます。
また、隣接するセルには「レ」というチェックマークが追加され、ファイルの管理がしやすくなります。

STEP
エラーハンドリング

万が一エラーが発生した場合、このコードにはエラー処理が組み込まれており、適切なメッセージを表示してユーザーに通知します。

使用の際に変更が必要なコード

使用する際に、下記箇所を適宜設定してください。

行番号と列番号の設定

コード内で使用されている行番号と列番号の設定は、以下のEnumで定義されています。

ここに表記されている数値は、セルの行番号・列番号になります。
エクセルの構成で、セルの記述位置を変更した場合は、こちらも合わせて変更してください。
※数値が記載されていない箇所は、「上記の数値+1」となります。

Public Enum 行
    パス記載 = 2
    ファイル転記説明 = 4
    ファイル名開始
End Enum

Public Enum 列
    附番 = 1
    ファイル名記載
    パス記載
    レ点 = 6
End Enum

フォルダパスの初期設定

このフォルダパスは、ファイルを選択するダイアログが表示される際の初期画面になります。
必要に応じて、このパスを変更してください。

Const initPath As String = "C:\サンプル"

VBAを起動させるボタンの設置方法

起動ボタンの設置方法は以下の通りです。

ボタンの設置方法
ボタンの設置方法
  1. 開発タブをクリック
  2. 「挿入」から「ボタン(フォームコントロール)」を選択
  3. 空白部をクリック
  4. 「マクロの登録」から、「ファイル名を取得」をクリック
  5. 「OK」をクリック
スポンサーリンク

データ取得ボタンの動作を実現するVBAコード

次に、データ取得ボタンを押したときの動作を実現するコードを紹介します。
このコードでは、「レ」を付けたファイルを対象にデータを取得し、管理エクセルに新しいシートとして追加します。

このコードを標準モジュールに転記ください。
※「Module1」や「Module2」どこに保存しても問題ありません。
  私はこのようなとき、あとから見て分かるようにモジュールを分けて保存します。

コードの記載箇所

コード詳細 | データ取得ボタンの動作を実現する

Option Explicit

Public Sub 別エクセルのデータ取得()
    Dim Ws As Worksheet
    Dim Arr
    Dim folderPath As String
    Dim filePath As String
    Dim fileName As String
    Dim firstRow As Long, lastRow As Long
    Dim i As Long, j As Long
    
    '//初期設定
    Const init_fileName = "管理シート"
    
    With Sheets(init_fileName)
            
            If .Cells(行.ファイル名開始, 列.附番) = "" Then
                    MsgBox ("データがありません。" & vbCrLf & "ファイルを取得して下さい。")
                    Exit Sub
            End If
            
            firstRow = .Cells(行.ファイル名開始, 列.レ点).Row
            lastRow = .Cells(Rows.Count, 列.レ点).End(xlUp).Row
            folderPath = .Cells(行.パス記載, 列.パス記載) & "\"
            
            Call delete_Sheet(init_fileName)  '//シートを消す
            
            j = 0
            For i = firstRow To lastRow
                    If .Cells(i, 列.レ点) <> "レ" Then GoTo Continue
                    
                    fileName = .Cells(i, 列.ファイル名記載)
                    filePath = folderPath & fileName
                    
                    Arr = get_Arr(filePath)  '// 配列にファイル情報を取得
                    
                    Call create_Sheet(init_fileName, fileName)
                    
                    With Sheets(Sheets.Count)
                            Range(.Cells(1, 1), .Cells(UBound(Arr, 1), UBound(Arr, 2))) = Arr
                    End With
Continue:
            Next i
            .Select
    End With
End Sub

Private Sub delete_Sheet(ByVal init_fileName As String)
    Dim Ws As Worksheet
    
    Application.DisplayAlerts = False
    
    For Each Ws In ThisWorkbook.Sheets
            If Ws.Name <> init_fileName Then
                    Ws.Delete
            End If
    Next Ws

    Application.DisplayAlerts = True
End Sub

Private Function get_Arr(ByVal filePath As String)
    Dim Wb As Workbook
    
    Application.ScreenUpdating = False
    
    Set Wb = Workbooks.Open(fileName:=filePath, ReadOnly:=True)  '//ファイルを開く
    get_Arr = Wb.Sheets(1).Range("A1").CurrentRegion  '//表を取得
    Wb.Close SaveChanges:=False  '//ファイルを閉じる
    
    Application.ScreenUpdating = True
End Function

Private Sub create_Sheet(ByVal init_fileName As String, ByVal fileName As String)
    Dim Ws As Worksheet
    Dim newWs As Worksheet
    Dim file As String
    
    file = Mid(fileName, 1, InStr(fileName, ".") - 1)  '//拡張子を除いたものをシート名にする
    
    Set newWs = Sheets.Add(After:=Worksheets(Worksheets.Count))
    newWs.Name = file
End Sub

コードの動作概要

STEP
対象ファイルの選別(「レ」の付いたファイルのみ)

最初に、エクセルの「管理シート」で「レ」を付けたファイルを対象に処理が行われます。If .Cells(i, 列.レ点) <> "レ" Then GoTo Continue という条件分岐により、チェックされたファイルのみが処理の対象となります。

STEP
エクセルファイルを開いてデータを取得

次に、Workbooks.Open を使用して指定されたファイルを開きます。このファイルからデータを取得するため、CurrentRegion プロパティを使用して、シート内のデータを配列に取得します。データはその後、新しいシートに転記されます。

STEP
新しいシートの作成とデータ転記

データを取得した後、管理エクセルに新しいシートを作成し、そのシートに取得したデータを転記します。create_Sheet サブルーチンで、新しいシート名はファイル名を基にして自動的に命名されます。

STEP
既存シートの削除

処理の前に、以前作成された同名のシートがあればそれを削除します。delete_Sheet サブルーチンを使用して、管理シート以外の全てのシートを削除し、新しいデータを受け入れる準備をします。

STEP
エラーハンドリング

最後に、エラーが発生した場合は On Error GoTo ErrLabel でエラーハンドリングが実行されます。エラーが発生すると、エラーメッセージをポップアップ表示し、処理を停止してユーザーに通知します。

使用の際に変更が必要なコード

使用する際に、下記箇所を適宜設定してください。

シート名の設定

Const init_fileName = "管理シート"

このコードでは、エクセルのシート名を「管理シート」と設定しています。
管理するシート名を変更した場合は、このシート名も合わせて変更してください。

VBAを起動させるボタンの設置方法

起動ボタンの設置方法は以下の通りです。

ボタンの設置方法
ボタンの設置方法
  1. 開発タブをクリック
  2. 「挿入」から「ボタン(フォームコントロール)」を選択
  3. 空白部をクリック
  4. 「マクロの登録」から、「ファイル名を取得」をクリック
  5. 「OK」をクリック
スポンサーリンク

これを実現するためにVBAで使用している機能一覧

このコードで使用している主なVBA機能を以下に一覧でまとめます。

このコードで使っている機能一覧 | クリックして解説記事を見ることができます

これらの機能を使いこなすことで、エクセルでのファイル管理やデータ処理を効率化できます。

この記事のまとめ

この記事では、VBAを使用してエクセルのフォルダ内ファイルを自動的にリスト化し、データ転記を行う方法を解説しました。

指定したフォルダのエクセルファイルをリスト化し、自動でデータを集約することで、業務の効率を大幅に向上させることができます。

ポイントのおさらい

さらに学ぶために

この記事で紹介したVBAコードを使いこなすことで、エクセル業務を効率化する基礎が身に付きました。

さらに高度なVBA機能や他の自動化手法を学ぶことで、作業の効率を飛躍的に向上させることができます。

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