指定した条件で、必要なデータを複数のファイルから順番に取得するエクセルVBAコードを作成します。
色々なエクセルから資料数値を拾ってくる作業に役立ちます。
こんにちは、じゅんぱ店長(@junpa33)です。
今回は、
作成した「取り出し条件設定シート」に入力された内容で、資料となる複数のエクセルファイルからデータを取得するVBAを組み立てます。
設定シートに表示された「取り出し条件設定」で
「シート名」項目で、データ抽出を行う「〇」マークがチェックされているシートを対象に
「抽出データ」で指定した項目とセル番号に対して値を取り出します。
先回の記事をチェックされるのは、こちら↓になります。
エクセルファイルからのデータ収集。取り出し条件設定シート作成複数ファイルデータ収集VBAの記事編成
- 複数ファイルデータ収集VBAの使い方とダウンロード
コンテンツ
指定条件でデータ取得するコードの作り方
データを取得するためのVBAコードはこのような内容で組み立てて行きます。
- データを収集するエクセルファイルのあるフォルダーを選択指定します。
- 「抽出シート」にデータ収集するエクセルファイルのファイル名をリスト化し一覧表示します。
- 「設定」シートで抽出マークを付けたシート名を、配列を使って要素化します。項目名とセル番号を変数化します。
- それぞれのエクセルファイル毎に、抽出マークされたシートの指定されたセル位置のデータを、取得していきます。
- VBAマクロ起動ボタンを「設定」シートに設置します。
順番に取得したデータは「抽出シート」に一覧表形式で表示されていきます。
VBAコードを手順に沿って作成
今回の作業は、「設定」シートの「抽出実行」ボタンで操作するプロシージャーを作成し完成させます。
VBAコードは、先回作成したモジュール(Module1)の続きに記述します。
ファイル名をリスト化します
データを収集するファイルの保存先フォルダーを指定して、その中にあるファイル名をリスト化します。
リストは、「抽出リスト」シートに作成します。
まずは、データを収集するエクセルファイルの置いてあるフォルダーを選択指定するVBAです。
プロシージャー名を「フォルダー選定()」としています。
VBA 保存先フォルダをダイアログ指定で変数化Sub フォルダー選定()
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
Path = .SelectedItems(1)
Else
Exit Sub
End If
End With
End Sub
ファイル名を取り出すコードの作成を行います。
このコードの中で、「フォルダー選定」プロシージャーを呼び出します。
プロシージャー名を「データ抽出()」としています。
部品化プロシージャーでCallステートメントは必須 ワークシートを変数化する3つの手法 オブジェクト変数など 要らないファイルを自動削除するコードの作成 VBA 回数不定のループ処理はDo LoopとFor EachSub データ抽出()
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コード
「設定」シートのシートリストでチェック欄に「〇」を付けたシートを変数として扱えるようにコード化します。
プロシージャー名を「シート選択()」としています。
データ入力済セルの最終行番号を取得する With~End Withの使い方。VBAコードを簡潔に記述する 1次元配列とは。静的配列と動的配列 エクセルVBAこのVBAソフトを、いったん終了せずに連続して使用する場合があります。
ここで使用している配列(Sna)には順に値(ここではシート名)が当てられますが、ソフトを終了しないとその値が残されたままになります。
なので、コード作成においては以下のプロシージャー「シート選択」が呼び出されるたびに、配列を初期化するコードを記述しておく必要があります。
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コードの中で、「フォルダー選定()」と「データ抽出()」プロシージャーを呼び出します。
プロシージャー名を「各数値取出し()」としています。
For~Nextのループと入れ子構造をVBA最速理解 If条件文のVBAコードの組み方。条件の絞り方を最速理解 VBA 回数不定のループ処理はDo LoopとFor Each Offsetプロパティは指定範囲を移動させる ChDirステートメントでカレントフォルダを簡単に変更する 部品化プロシージャーでCallステートメントは必須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」を記述しています。
抽出マークを付けたシートが資料となるすべてのエクセルファイルに存在するとは限らないと思います。
もしそのシート名がない場合は、抽出データなしとして通出データ一覧表には「空欄」として表示されます。
プロシージャー起動ボタンを設置
「設定」シートに「抽出実行」ボタンを設置します。
このボタンに紐づけるプロシージャーは「各数値取出し()」になります。
設置方法については、前回の記事を参考にして下さい。
コマンドボタンをユーザーフォームに設置するここまでのまとめ
ここまでで、データの抽出取得は完了です。
一度に大量に処理を行うと処理作業に少々時間がかかることがあるかもしれません。
データ抽出には、各資料ファイルを開いて、データを取得して、ファイルを閉じてとなります。
パソコンスペックに対して処理数を調節しながら使用されることをお勧めします。
次の記事は、データ取得・一覧表作成後の、次の使用のためのリセット(データクリア)についてのVBAコードです。
短期間でエクセルVBAの独学習得を目指したいなら
エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。
けれども、
出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。
独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。
先人が行った勉強方法をあなたがそのまま利用すればよいということです。
エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します独習のための大切な7つのポイントは、上記記事にて解説しています。
正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。
ハッキリ言って、
本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、
手っ取り早く短期間習得できるというのは間違いないでしょう。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。