- ベストアンサー
エクセル:フォルダ内のファイル数を数える
1つのファイルを選択後、 そのファイルを開いてある操作をし、閉じる。 その後自動的に、同一フォルダ内のファイルを開いて同様の操作をし、閉じる。 これをフォルダ内のファイル全てに対して行う、 というマクロを組みたいです。 例えば、 フォルダAに、File1.csv, File2.csv, File3.csv, File4.csv の4ファイルがある時、 File3.csvを選んで操作を実行(csvファイル内のセルA4の値を、マクロを実行したExcelファイルにコピー)。 実行完了後、File3.csvは閉じる。 続けて、File1,File2,File4についても、 開く→コピーする→閉じる、を繰り返す。 フォルダ内全てのファイルに対して実行したら終了。 ファイル名は、常にFile+数字.csvではありませんが、拡張子は常にCSVです。 素人考えでは、フォルダ内のファイルの数と名前を取得し、ループで回せばいいと思うのですが、 「フォルダ内のファイルの数と名前を取得」する関数でもあるのでしょうか? 他に何か楽な方法でもあれば、教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Dir関数でやってみました。 このマクロを記述したエクセルのBOOKと同じフォルダ内のすべてのcsvファイルを開き、A4の値を取得します。 Sub test01() Dim MyFile As String, MyPath As String Dim i As Long Dim wb As Object MyPath = ThisWorkbook.Path & "\" '自分のパスを取得 MyFile = Dir(MyPath & "*.csv", vbNormal) 'パス内のcsvファイル Do Until MyFile = "" '対象ファイルがなくなるまで Set wb = Workbooks.Open(MyPath & "\" & MyFile) '選択したファイルを開く i = i + 1 ThisWorkbook.Sheets("Sheet1").Cells(i, 1).Value = wb.Sheets(1).Range("A4").Value '転記 wb.Close (False) '選択したファイルを閉じる MyFile = Dir '次のファイルを検索 Set wb = Nothing Loop '繰り返し End Sub
その他の回答 (2)
- Kazamin
- ベストアンサー率30% (17/56)
FileSystemObjectを使うのであれば、こんな感じかな。 Microsoft Scripting Runtime を参照設定してください。 Public Sub Proc1() Dim fso As New FileSystemObject Dim fo As Folder Dim fi As File Dim wbk As Workbook Set fo = fso.GetFolder("~フォルダ名~") For Each fi In fo.Files Set wbk = Workbooks.Open(fi.Name) (中のロジックはご自分で組み立ててください) Set wbk = Nothing Next fi Set fi = Nothing Set fo = Nothing Set fso = Nothing End Sub お役に立てれば幸いです。
お礼
回答ありがとうございます。 無事動作しました。 しましたが、挙げていただいたコードにはまだ私にはわからない部分もあるので、 今後調べていこうと思います。
- bin-chan
- ベストアンサー率33% (1403/4213)
DIR関数やFileSystemObjectなどいろいろありますが。 ブックマークしておくと良いサイトがあります。 いつも利用させてもらってる「OfficeTANAKA」さんのページ。サンプル満載です。 リンクフリーの記述があるので、リンク貼ります。 http://www.officetanaka.net/ ここらあたりか? http://www.officetanaka.net/excel/vba/file/file07.htm
お礼
回答ありがとうござます。 サンプルや解説のページはいくつかブックマークしておりましたが、 こちらは知りませんでした。 参考にさせていただきます。
お礼
回答ありがとうございます。 >Workbooks.Open(MyPath & "\" & MyFile) など、今まで知らなかった書き方を見ることができ、大変参考になります。 目的のマクロは、無事組むことができました。