Excel VBAにてネットワーク上のファイル一覧を高速に取得する方法 ローカル環境とは異なり、一般にネットワーク上のファイル情報の一覧を取得するのには時間がかかります。

Excel VBAにてネットワーク上のファイル一覧を高速に取得する方法 ローカル環境とは異なり、一般にネットワーク上のファイル情報の一覧を取得するのには時間がかかります。 VBAの場合、FileSystemObjectやDir()関数を用いた方法が一般的となっておりますが、以下の条件において、最も早い手法が知りたいです。 【条件】 ・ネットワークドライブ上のファイル情報(ファイル名、サイズ、更新日、更新時刻)を取得 ・サブフォルダ内のファイル情報についても再帰的に取得する ・取得した一覧は同ブックのセル内に書き出す ・ファイル数は大量で、およそ10万ファイル程度 ・VBAから他言語を呼び出すのも可とする(ツールI/FがVBAなのは避けられない) 試行錯誤しておりますが困っております。 助けて下さい・・・。

プログラミング | Excel188閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

0

> ・ネットワークドライブ上のファイル情報(ファイル名、サイズ、更新日、更新時刻)を取得 > ・取得した一覧は同ブックのセル内に書き出す ちょっとこの間にたような内容で対応しましたが、前者のファイル情報を取得するところとネットワークの帯域がボトルネックになりました。 それでも ・C#を使ったコンソールプログラムにする ・ディレクトリ、ファイルはまとめて取得 (やり方はいくつかある) ・でSystem.IO.FileInfoクラスを使ってファイル情報を取得 したほうがまだましという感じでした。 VBAでWSHでコマンドの標準出力を取得してまとめて貼り付けがメモリに収まるなら検討できるかも。 Filesystemobjectの場合は試したところではどうしても再帰処理にする必要があるようです。 その際 ・Filesystemojectはメイン処理側で作成し参照 ・GetFolderとSubfolders,Filesの組合せでファイル名取得 ネットワークの帯域は環境依存でどうにもならず。 あとは一般的なVBAのパフォーマンス対策 ・余計な画面更新、再計算をしない (ただ、そのままだと処理中Excelが「応答しない」になるのでどうするかはある) ・ファイル情報を取得したたびにセルへの代入はしない。まとめて配列をシートにセット。 (動的配列にしてRedimで拡張したほうがまし) という感じでしたね。 全体百数十GBで専用回線でも数時間かかりました。ネットワーク経由の場合全ファイルのファイル情報(サイズ、作成日時、更新日時)を取得しようとすると数MB/secしか出ない。 他にもっといいやり方があるのかもしれませんが。

画面更新や配列貼付のテクニックについては対策済みです。やはり今回のポイントは「ネットワーク」ですね。。。 ご提案のありましたC#について検討して見ます。 ちなみに、DOSコマンドでforfilesがありますが、こちらについて処理速度の知見はお持ちでしょうか?(普段よく使うコマンドなので)

ThanksImg質問者からのお礼コメント

回答ありがとうございました。 あれから色々検討しましたが、結局はメンテナンス性からVBAで実装せよ、というところに落ち着いてしまいました。 また、何かありましたらその時はお力を下さい。 とても勉強になりました。

お礼日時:2019/6/1 18:48