指定条件で複数ファイルからデータ取得。エクセルVBAコード

datasyusyueyecatch003

指定した条件で、必要なデータを複数のファイルから順番に取得するエクセルVBAコードを作成します。
色々なエクセルから資料数値を拾ってくる作業に役立ちます。

こんにちは、じゅんぱ店長(@junpa33)です。

今回は、

作成した「取り出し条件設定シート」に入力された内容で、資料となる複数のエクセルファイルからデータを取得するVBAを組み立てます。

設定シートに表示された「取り出し条件設定」で

「シート名」項目で、データ抽出を行う「〇」マークがチェックされているシートを対象に

「抽出データ」で指定した項目とセル番号に対して値を取り出します。

先回の記事をチェックされるのは、こちら↓になります。

datasyusyueyecatch002 エクセルファイルからのデータ収集。取り出し条件設定シート作成

指定条件でデータ取得するコードの作り方

detasyuutoridasip008

データを取得するためのVBAコードはこのような内容で組み立てて行きます。

  1. データを収集するエクセルファイルのあるフォルダーを選択指定します。
  2. 「抽出シート」にデータ収集するエクセルファイルのファイル名をリスト化し一覧表示します。
  3. 「設定」シートで抽出マークを付けたシート名を、配列を使って要素化します。項目名とセル番号を変数化します。
  4. それぞれのエクセルファイル毎に、抽出マークされたシートの指定されたセル位置のデータを、取得していきます。
  5. VBAマクロ起動ボタンを「設定」シートに設置します。

順番に取得したデータは「抽出シート」に一覧表形式で表示されていきます。

VBAコードを手順に沿って作成

detasyuutoridasip009

今回の作業は、「設定」シートの「抽出実行」ボタンで操作するプロシージャーを作成し完成させます。

detasyuu005aa

VBAコードは、先回作成したモジュール(Module1)の続きに記述します。

ファイル名をリスト化します

データを収集するファイルの保存先フォルダーを指定して、その中にあるファイル名をリスト化します。

リストは、「抽出リスト」シートに作成します。

フォルダーを指定するVBAコード

まずは、データを収集するエクセルファイルの置いてあるフォルダーを選択指定するVBAです。

プロシージャー名を「フォルダー選定()」としています。

vbafoldereyecatch VBA 保存先フォルダをダイアログ指定で変数化
VBA
Sub フォルダー選定()
        With Application.FileDialog(msoFileDialogFolderPicker)
            If .Show = True Then
                Path = .SelectedItems(1)
            Else
                Exit Sub
            End If
        End With
End Sub

指定したフォルダーからファイル名を抽出

ファイル名を取り出すコードの作成を行います。

このコードの中で、「フォルダー選定」プロシージャーを呼び出します。

プロシージャー名を「データ抽出()」としています。

vbacalleyecatch 部品化プロシージャーでCallステートメントは必須 vbasheetvariableeyecatch ワークシートを変数化する3つの手法 オブジェクト変数など vbadirkilleyecatch 要らないファイルを自動削除するコードの作成 vbadoloopeyecatch VBA 回数不定のループ処理はDo LoopとFor Each
VBA
Sub データ抽出()
    Dim Fn As String
    Dim mb As Workbook
        Set mb = ThisWorkbook
        Call Module1.フォルダー選定
        i = 3
        Fn = Dir(Path & "\*.xls")
        Do While Fn <> ""
            i = i + 1
            mb.Activate
            Worksheets("抽出リスト").Select
            Cells(i, 1) = Fn
            Fn = Dir()
        Loop
        Worksheets("設定").Select
        MsgBox "全部で" & i - 3 & "個ファイルがありました", _
            vbInformation, "複数エクセルファイルデータ収集"
End Sub

揃った抽出条件によるデータ取出しVBAコード

シート名を変数として扱えるようにする

「設定」シートのシートリストでチェック欄に「〇」を付けたシートを変数として扱えるようにコード化します。

プロシージャー名を「シート選択()」としています。

vbalastcelleyecatch データ入力済セルの最終行番号を取得する vbawithstateeyecatch With~End Withの使い方。VBAコードを簡潔に記述する vbahairetueyecatch 1次元配列とは。静的配列と動的配列 エクセルVBA

このVBAソフトを、いったん終了せずに連続して使用する場合があります。

ここで使用している配列(Sna)には順に値(ここではシート名)が当てられますが、ソフトを終了しないとその値が残されたままになります。

なので、コード作成においては以下のプロシージャー「シート選択」が呼び出されるたびに、配列を初期化するコードを記述しておく必要があります。

VBA
Sub シート選択()
    Dim n As Long
        Workbooks("データ収集.xlsm").Activate
        Erase Sna
        With Worksheets("設定")
            NO = 0
            Arow = .Cells(Rows.Count, 1).End(xlUp).Row
            For n = 4 To Arow
                If .Range("B" & n) = "〇" Then
                    Sna(NO) = .Range("A" & n)
                    NO = NO + 1
                End If
            Next n
            CndN = .Range("D2")
            Cnd = .Range("D3")
            CneN = .Range("E2")
            Cne = .Range("E3")
            CnfN = .Range("F2")
            Cnf = .Range("F3")
            CngN = .Range("G2")
            Cng = .Range("G3")
            CnhN = .Range("H2")
            Cnh = .Range("H3")
        End With
End Sub

変数化した抽出条件でデータを取り出すVBAコード

このVBAコードの中で、「フォルダー選定()」と「データ抽出()」プロシージャーを呼び出します。

プロシージャー名を「各数値取出し()」としています。

fornextirekoeyecatch For~Nextのループと入れ子構造をVBA最速理解 vbaifjyokeneyecatch If条件文のVBAコードの組み方。条件の絞り方を最速理解 vbadoloopeyecatch VBA 回数不定のループ処理はDo LoopとFor Each vbaoffseteyecatch Offsetプロパティは指定範囲を移動させる vbachdireyecatch ChDirステートメントでカレントフォルダを簡単に変更する vbacalleyecatch 部品化プロシージャーでCallステートメントは必須
VBA
Sub 各数値取出し()
    Dim ws, wsh As Worksheet
    Dim flg As Boolean
    Dim m, s, k, j As Long
    Dim Fna As String
    Dim Vd, Ve, Vf, Vg, Vh As Variant
    Dim Flag As Boolean
    Application.ScreenUpdating = False
        Call Module1.データ抽出
        Call Module1.シート選択
        Result = 1
            If Sna(0) = "" Then
                Result = 0
            End If
            For m = 4 To 8
                If Cells(3, m) <> "" Then
                    Exit For
                Else
                    Result = 0
                End If
            Next m
        If Result = 0 Then
            MsgBox "抽出対象のシートまたはセルが選択されていません", _
            vbInformation, "複数エクセルファイルデータ収集"
            Exit Sub
        End If
        On Error Resume Next
        Workbooks("データ収集.xlsm").Activate
        With Worksheets("抽出リスト")
            .Range("B1") = "シート名"
            .Range("A3") = "ファイル名"
            .Range("B3") = "チェック欄"
        End With
        For s = 4 To i
            Workbooks("データ収集.xlsm").Activate
            With Worksheets("抽出リスト")
                Fna = .Range("A" & s)
            End With
            ChDir Path
            Workbooks.Open Fna
            k = 0
            Flag = False
            For j = 0 To NO - 1
                For Each wsh In Workbooks(Fna).Worksheets
                    If wsh.Name = Sna(j) Then
                        Flag = True
                        Exit For
                    End If
                    Flag = False
                Next wsh
                If Flag = True Then
                    With Worksheets(Sna(j))
                        Vd = .Range(Cnd)
                        Ve = .Range(Cne)
                        Vf = .Range(Cnf)
                        Vg = .Range(Cng)
                        Vh = .Range(Cnh)
                    End With
                    Workbooks("データ収集.xlsm").Activate
                    With Worksheets("抽出リスト")
                        .Range("C1").Offset(, 6 * k) = Sna(j)
                        .Range("C2").Offset(, 6 * k) = "項目名"
                        .Range("C3").Offset(, 6 * k) = "セル番号"
                        .Range("D2").Offset(, 6 * k) = CndN
                        .Range("E2").Offset(, 6 * k) = CneN
                        .Range("F2").Offset(, 6 * k) = CnfN
                        .Range("G2").Offset(, 6 * k) = CngN
                        .Range("H2").Offset(, 6 * k) = CnhN
                        .Range("D3").Offset(, 6 * k) = Cnd
                        .Range("E3").Offset(, 6 * k) = Cne
                        .Range("F3").Offset(, 6 * k) = Cnf
                        .Range("G3").Offset(, 6 * k) = Cng
                        .Range("H3").Offset(, 6 * k) = Cnh
                        .Range("D" & s).Offset(, 6 * k) = Vd
                        .Range("E" & s).Offset(, 6 * k) = Ve
                        .Range("F" & s).Offset(, 6 * k) = Vf
                        .Range("G" & s).Offset(, 6 * k) = Vg
                        .Range("H" & s).Offset(, 6 * k) = Vh
                    End With
                    k = k + 1
                Else
                    k = k + 1
                End If
                Workbooks(Fna).Activate
            Next j
            Workbooks(Fna).Close False
        Next s
        With Worksheets("抽出リスト")
            .Columns.AutoFit
            .Select
        End With
        Application.ScreenUpdating = True
        MsgBox "抽出リストの作成が完了しました", _
            vbInformation, "複数エクセルファイルデータ収集"
End Sub

「設定」シートで5つ設定できる「抽出データ」項目で、5つすべて指定しなかった(一部空欄のままにした)場合エラーが発生します。

そのエラーストップを回避するために「On Error Resume Next」を記述しています。

抽出マークを付けたシートが資料となるすべてのエクセルファイルに存在するとは限らないと思います。

もしそのシート名がない場合は、抽出データなしとして通出データ一覧表には「空欄」として表示されます。

プロシージャー起動ボタンを設置

「設定」シートに「抽出実行」ボタンを設置します。

このボタンに紐づけるプロシージャーは「各数値取出し()」になります。

設置方法については、前回の記事を参考にして下さい。

プロシージャー実行のボタンを設置する

userformcommdeyecatch コマンドボタンをユーザーフォームに設置する

ここまでのまとめ

detasyuutoridasip010

ここまでで、データの抽出取得は完了です。

一度に大量に処理を行うと処理作業に少々時間がかかることがあるかもしれません。

データ抽出には、各資料ファイルを開いて、データを取得して、ファイルを閉じてとなります。

パソコンスペックに対して処理数を調節しながら使用されることをお勧めします。

次の記事は、データ取得・一覧表作成後の、次の使用のためのリセット(データクリア)についてのVBAコードです。

短期間でエクセルVBAの独学習得を目指したいなら

detasyuutoridasip011

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

vbastudyeyecatch002 エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します

独習のための大切な7つのポイントは、上記記事にて解説しています。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min