
フォルダ内に格納されているExcelファイル(400ファイル)からデータを抽出したいです。
ファイルのsheet2に以下が記載されております。
<記載>
A1セル:名前(父) B1:年齢 C1:生年月日 D1:住所
A2セル:名前(母) B2:年齢 C2:生年月日 D2:住所
※A2~以降も同様ですが、家族の人数によって行数が可変となります。
上記をVBAにて複数ファイルから抽出して1シートに纏めたいです。
<抽出後>
またA列には一組目:1、二組目:2と家族番号が知れるように数字を入力したい
A1:1(1家族ごと) B1セル:名前(A父) C1:年齢 D1:生年月日 E1:住所
A2:1(1家族ごと) B2セル:名前(A母) C2:年齢 D2:生年月日 E2:住所
A3:2(1家族ごと) B3セル:名前(B父) C3:年齢 D3:生年月日 E3:住所
A4:2(1家族ごと) B4セル:名前(B母) C4:年齢 D4:生年月日 E4:住所
A5:2(1家族ごと) B5セル:名前(B弟) C5:年齢 D5:生年月日 E5:住所
どなたか上記抽出方法についてご教授いただけますでしょうか。
No.13ベストアンサー
- 回答日時:
No.11 の改善案です。
改善点① 「社員ID」の部分に数に変換できない文字が有ってもエラーにならないようにしました。
改善点② 「Sheet2」にデータが無い場合はそのファイルをスキップするようにしました。
※ No.12 に対する回答が無いので、根本の対応には成っていないと思います。
Const 纒シート名 As String = "Sheet1" ' 纏めるシート名に変更して下さい。
Dim フォルダー名 As String
Dim ファイル名 As String
Dim コピー先 As Long
Dim 終 As Long
Dim 通番 As Integer
Sheets(纒シート名).Select
Cells.ClearContents
フォルダー名 = ThisWorkbook.Path & "\"
コピー先 = 1
ファイル名 = Dir(フォルダー名 & "家族構成_????.xls")
Do While ファイル名 <> ""
Workbooks.Open Filename:=フォルダー名 & ファイル名
Sheets("Sheet2").Select
If Range("A1").Value <> "" Then
終 = Cells(Rows.Count, 1).End(xlUp).Row
通番 = 通番 + 1
Range(Cells(1, 1), Cells(終, 4)).Copy ThisWorkbook.Worksheets(纒シート名).Cells(コピー先, 2)
ActiveWorkbook.Close False
Range(Cells(コピー先, 1), Cells(コピー先 + 終 - 1, 1)).Value = 通番
Range(Cells(コピー先, 6), Cells(コピー先 + 終 - 1, 6)).Value = Mid(ファイル名, 6, 4)
コピー先 = コピー先 + 終
Else
ActiveWorkbook.Close False
End If
ファイル名 = Dir()
Loop
End Sub
No.15
- 回答日時:
No.9です。
回答されているコード的には、私は元のデータブックの列が提示されている物とは違うのかな?って感じます。
特にA列をチェック欄扱いにしてて例えば同居している人なら”〇”がついているとか。
この場合は確実にその列に最終行までデータのある場所(列)を提示されるのが宜しいかも。
データで歯抜けがあっても1行目と最終行までを範囲としてコピペするので、出来上がりは歯抜けのまま纏まるかと。
しかし火狐では補足がキチンと表示しきれないのは気になる・・・(個人的且つ回答等ではないけど)
No.12
- 回答日時:
こちらでは「左記を想定」のようになりましたが、どんな時に「実行結果」のようになるかも考えてみました。
図の左のようなデータの場合は「実行結果」のようになり、図の右のようなデータの場合は「左記を想定」のようになります。
元のデータはどうなっていますか?ご提示ください。

No.11
- 回答日時:
No.10 の修正版(不要な処理を省いて変数名を最適化してみました)
Sub Sample()
Const 纒シート名 As String = "Sheet1" ' 纏めるシート名に変更して下さい。
Dim フォルダー名 As String
Dim ファイル名 As String
Dim コピー先 As Long
Dim 終 As Long
Dim 通番 As Integer
Dim 社員ID As Integer
Sheets(纒シート名).Select
Cells.ClearContents
フォルダー名 = ThisWorkbook.Path & "\"
コピー先 = 1
ファイル名 = Dir(フォルダー名 & "家族構成_????.xls")
Do While ファイル名 <> ""
通番 = 通番 + 1
Workbooks.Open Filename:=フォルダー名 & ファイル名
社員ID = Mid(ファイル名, 6, 4)
Sheets("Sheet2").Select
終 = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(終, 4)).Copy ThisWorkbook.Worksheets(纒シート名).Cells(コピー先, 2)
ActiveWorkbook.Close False
Range(Cells(コピー先, 1), Cells(コピー先 + 終 - 1, 1)).Value = 通番
Range(Cells(コピー先, 6), Cells(コピー先 + 終 - 1, 6)).Value = 社員ID
コピー先 = コピー先 + 終
ファイル名 = Dir()
Loop
End Sub
No.10
- 回答日時:
それではこちらではどうでしょうか?
Sub Sample()
Const 纒シート名 As String = "Sheet1" ' 纏めるシート名に変更して下さい。
Dim フォルダー名 As String
Dim ファイル名 As String
Dim フルパス As String
Dim コピー先 As Long
Dim 終 As Long
Dim 通番 As Integer
Dim 社員ID As Integer
Sheets(纒シート名).Select
Cells.ClearContents
フォルダー名 = ThisWorkbook.Path & "\"
コピー先 = 1
フルパス = Dir(フォルダー名 & "家族構成_????.xls")
Do While フルパス <> ""
通番 = 通番 + 1
Workbooks.Open Filename:=フォルダー名 & フルパス
ファイル名 = Right(フルパス, 13)
社員ID = Mid(ファイル名, 6, 4)
Sheets("Sheet2").Select
終 = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(終, 4)).Copy ThisWorkbook.Worksheets(纒シート名).Cells(コピー先, 2)
ActiveWorkbook.Close False
Range(Cells(コピー先, 1), Cells(コピー先 + 終 - 1, 1)).Value = 通番
Range(Cells(コピー先, 6), Cells(コピー先 + 終 - 1, 6)).Value = 社員ID
コピー先 = コピー先 + 終
フルパス = Dir()
Loop
End Sub
No.9
- 回答日時:
No.7です。
更にちょっと疑問。
https://www.google.com/search?client=firefox-b-d …
また使えるようになったのでしょうか?(2019が最新でしたっけ?)
エラーは使用しているExcelのバージョンが双方で違うからでは?
めぐみん_様
適切なコメントとありがとうございます。
補足など私でできないことから非常に勉強させていただいております。
補足回数の限度が近いためこちらでのお礼とさせていいただいております。
よろしくお願い致します。
No.8
- 回答日時:
ファイル名は本当に「家族構成_xxxx.xls」ですか?「家族構成_xxxx.xlsx」ではありませんか?
それでしたら
①「.Filename = "家族構成_????.xls"」⇒「Filename = "家族構成_????.xlsx"」
②「ファイル名 = Right(.FoundFiles(ファイル仮番), 13)」⇒「ファイル名 = Right(.FoundFiles(ファイル仮番), 14)」
にしてみて下さい。
No.7
- 回答日時:
ちょっとした疑問です。
社員IDってどのように付けているのでしょうか?(0012 みたいに先頭に"0"があるとかないとか)
そしてIDを有効活用するならID順に並べた方が良いと言えるのか、気にしないのか。
でしょうかね。
社員IDと言って実際は従業員で”正社員・契約社員・パート・・・”で付け方(頭数字)が変わってるなんてのが昔の会社のシステムではあったもので。
No.6
- 回答日時:
それではこんなものはいかがでしょうか?
Sub Sample()
Const 纒シート名 As String = "Sheet1" ' 纏めるシート名に変更して下さい。
Dim フォルダー名 As String
Dim ファイル名 As String
Dim ファイル仮番 As Integer
Dim 社員ID As Integer
Dim 終 As Long
Dim コピー先 As Long
Dim 通番 As Integer
Sheets(纒シート名).Select ' まとめるシート名に変更して下さい。
Cells.ClearContents
コピー先 = 1
フォルダー名 = ThisWorkbook.Path & "\"
With Application.FileSearch
.LookIn = フォルダー名
.Filename = "家族構成_????.xls"
If .Execute > 0 Then
For ファイル仮番 = 1 To .FoundFiles.Count
Workbooks.Open Filename:=.FoundFiles(ファイル仮番)
ファイル名 = Right(.FoundFiles(ファイル仮番), 13)
通番 = 通番 + 1
社員ID = Mid(ファイル名, 6, 4)
Sheets("Sheet2").Select
終 = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(1, 1), Cells(終, 4)).Copy ThisWorkbook.Worksheets(纒シート名).Cells(コピー先, 2)
ActiveWorkbook.Close False
Range(Cells(コピー先, 1), Cells(コピー先 + 終 - 1, 1)).Value = 通番
Range(Cells(コピー先, 6), Cells(コピー先 + 終 - 1, 6)).Value = 社員ID
コピー先 = コピー先 + 終
Next
End If
End With
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- Excel(エクセル) マクロか関数で処理したいのですが、教えて頂けませんか。 8 2022/10/31 15:18
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Excel(エクセル) 複数セルデータを別シートの単一セルにコピーしたい。(詳細をご参照ください) 1 2022/12/14 15:08
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) Excelの関数 5 2023/07/07 05:26
- 賃貸マンション・賃貸アパート 賃貸の緊急連絡先について。 緊急連絡先になってくれる家族がいないので、私の祖母の名前を勝手に書こうと 5 2022/09/16 16:48
- Excel(エクセル) 現時点の年齢を算出して、その年齢と一致したセルを色付けしたい。 4 2022/06/23 17:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PDFファイルについて
-
エクセルで複数のコメントのサ...
-
同じファイル名 上書きしないフ...
-
C# でファイルのタイムスタンプ...
-
excel vba で複数ファイルの表...
-
バッチファイル XCOPYで上書き...
-
ファイルサーバ上のファイルが...
-
エクセルのハイパーリンクがコ...
-
サーバへファイルコピーについて
-
ExcelシートをコピーするとA4用...
-
frxファイルの役目
-
リモートデスクトップとVB.NET
-
Accessファイルをコピーすると...
-
開いている別のファイルにExcel...
-
ファイルをコピーできない
-
Vba初心者です。下記のコード助...
-
bat 同名ファイルコピー時にリ...
-
[エクセル]コピーするとオブジ...
-
エクセル2010、図が大きすぎま...
-
エクセル ファイルをコピー出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで複数のコメントのサ...
-
ファイルサーバ上のファイルが...
-
Vba初心者です。下記のコード助...
-
MSオフィス2013にMS365が上書き...
-
同じファイル名 上書きしないフ...
-
バッチファイル XCOPYで上書き...
-
エクセルのハイパーリンクがコ...
-
frxファイルの役目
-
[エクセル]コピーするとオブジ...
-
xcopyでのバッチコピー方法でコ...
-
バッチファイル 別ファイルにリ...
-
bat 同名ファイルコピー時にリ...
-
バッチファイルのコピーで
-
アクセス クエリを別のファイ...
-
vbsでファイルやフォルダのコピ...
-
マインクラフトPCをプレイしよ...
-
エクセル2010、図が大きすぎま...
-
現在のブックを閉じないで、マ...
-
開いている別のファイルにExcel...
-
FTPとファイルコピーの違いにつ...
おすすめ情報
コメントありがとうございます。
以下にコメント致します。※先程は誤ったところに記載しておりました。
①
元ファイルは1家族1ファイルの認識で問題ございません。
ファイル内で姓が違っていてもファイル内なので1家族としたいです。
②
フォルダ内に他のマクロブックはございません。
ご教授宜しくお願い致します。
コメントありがとうございます。
以下にコメント致します。※先程は誤ったところに記載しておりました。
フォルダ内のファイルは以下で統一されております。
家族構成_xxxx.xls
※xxxxは社員ID
ご教授宜しくお願い致します。
コメントありがとうございます。
年齢についても纏め抽出出来ればと思います。
宜しくお願い致します。
コメントありがとうございます。
仰る通りIDについてあると助かります。
ですが一覧で参照した時、A列で何家族か分かりやすくしたいこともあります。
※退職職員分のIDが飛んでいたりするので。
確かにコメントいただいたIDについては是非あると助かる、今後活用もう可能ですので
当該IDはE列に入ってもらうと非常に助かります。
ご確認宜しくお願い致します。
丁寧な回答ありがとうございます。
実行してみたのですがExcel2016を使用しており、『FileSearch』で引っ掛かているようです。
度々で申し訳ございませんが、ご教授いただければと思います。
宜しくお願い致します。
度々のコメントで申し訳ございません
ファイル名は『家族構成_xxxx.xls』で問題ございません。
当該コードを実行すると
「 実行エラー'445'オブジェクトはこの動作をサポートしていません」
となってしまいます。
長々とお付き合いありがとうございます。
当該コードを実行した結果添付のように想定と異なっております。
実行結果を添付いたします。
※想定はあくまでセルをずらして記載しており、スタートはA1からとなります。
大変申し訳ございませんが、ご教授いただけますでしょうか。
返事が遅くなり大変申し訳ございません。
GooUserラックにいただいたコード、皆さんのご助言のおかげで無事意図する動作と
なることができました。
長々と対応いただきほんとに感謝しております。
ありがとうございました。