- 締切済み
FileDialogでのファイル選択
はじめまして。VBA初心者です。 FileDialogを使って複数のcsvファイルを選択し、 Open ~ For Input As #1 でcsvの中身を取り出し、必要なデータだけエクセル上にコピーするという方法を使っていたのですが、csvファイルが膨大になるとファイルをすべて同時に選ぶと固まってしまいます。 200個くらいのcsvファイルを同時に選んで「開く」ボタンで読み込んでいたときは大丈夫だったのですが、2000個とかになると固まってしまいます。(あたりまえといえば当たり前ですが・・) なんとかして同時に大量のファイルをFileDialogで選択しても固まらない方法はないでしょうか? もし何か良い方法があったら教えていただけると幸いです。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ham_kamo
- ベストアンサー率55% (659/1197)
No.1です。一番簡単なのはDir関数を使用することですね。 一番最初に FName = Dir("C:\xxx\*.csv") とすると、C:\xxxにある*.csvのファイル名が1つ取得できます。 その次は、FName= Dir() とすると、同じ条件でファイル検索の続きができ、次のCSVファイル名が取得できます。条件に一致するファイル名がなければ""となります。 一般的な書き方は、 FName = Dir("C:\xxx\*.csv") Do While FName <> "" Open "C:\xxx\" & FName For Input As #1 '←FNameはフルパスでなくファイル名だけなので注意が必要 '処理 Close #1 FName = Dir() '←次のファイルを検索してループの先頭に戻る Loop という感じです。 すべてのCSVファイルでなく、ABCで始まるファイルなどの場合は、最初のDir関数を FName = Dir("C:\xxx\ABC*.csv") などとして絞り込むとよいでしょう。絞り込む条件はInputBoxでマクロ実行時に入力してもいいし、特定のセルにABC*.csvなどと書いて、その値を利用しても可能です。 これはあくまでもプログラム内でオープンするファイル名に規則性がある場合なので、規則性がない場合は少し工夫が必要です。(たとえば、とりあえず全てのCSVファイル名を別シートに書き出し、読み込むファイルだけ残して不要なファイル名を削除してから、そのシートからファイル名を読み込んで処理する、など)
- ham_kamo
- ベストアンサー率55% (659/1197)
選択するファイルはFileDialogから選択しないといけないのでしょうか。 もし特定のフォルダ内の全てのCSVファイルとか、全てでなくても、ある条件を満たすファイル名などなら、Dir関数やFileSystemObjectなどを使ってファイル名を取得し、ループでまわせばいいと思うのですが、そのような開くファイルを特定する条件などはありませんか?
お礼
さっそくのご回答ありがとうございます。 FileDailogをどうしても使わないといけないわけではないのですが、便利だと思って使用していました。(毎回開くファイルを指定できるので。) ファイル名を取得し、ループでまわせばいいとは具体的にどういう感じでしょうか? よろしければ教えていただけると助かります。
お礼
ご丁寧な回答ありがとうございました。 私の場合、ファイル名だけは一挙に全部取得して、変数に代入していたのがいけなかったようです^^; (処理は一回ずつ分けてましたが・・) プログラム例まで書いていただいて助かりました。