質問: タイトル通りとなります ExcelVBAでマクロを作成中ですが、どう処理すればいいかわからなくなってきたので質問させてください ``` C:\Work ├folder1-1 |├folder1-1-1 |├folder1-1-2 |└folder1-1-3 | └text.txt1 ├folder1-2 |├folder1-2-1 |├folder1-2-2 ||├folder1-2-2-1 |||└text.txt2 ||├folder1-2-2-2 ||└folder1-2-2-3 |└folder1-2-3 ├folder1-3 |├folder1-3-1 ||└text.txt3 |├folder1-3-2 |└folder1-3-3 ... ``` という風に階層の規則性なく配置されているすべての.txtを確認し、 ``` Text.txt1 name1 ← tabindexに記述がないから取得しない ← tabindexに記述がない name2 ← tabindexに記述があるから取得する 2 ← tabindexに記述がある name3 ← tabindexに記述があるから取得する 1 ← tabindexに記述がある ``` .txt内にいくつかあるの横に数字がある場合のみの数字と、がある行の上にある横の名称と.txtファイル名とファイルのフルパスをシートに出力。 という繰り返しをフォルダ選択ダイアログで選択したフォルダ以下にある全ての.txtで実施したいのですが。 1. ダイアログでフォルダの場所を選択後、サブフォルダ内のどの階層にあるかわからない.txtを順番に見つける為のループ処理の方法 2. .txt内で値のあるを見つけた後、そのより上にあるの値の取得方法 3. サブファイル数、.txtの総数、1つの.txt内の総行数が全て10000を超える値なので、一連の処理を効率化して速度を上げる方法 の3点で特に悩んでいます。 すみませんがお力をお貸し頂けないでしょうか?
回答: > > ダイアログでフォルダの場所を選択後、サブフォルダ内のどの階層にあるかわからない.txtを順番に見つける為のループ処理の方法 > > > この手の処理は再帰呼び出しでしょうね。 ここらへん参照してみてください。 > > .txt内で値のあるを見つけた後、そのより上にあるの値の取得方法 > > > ファイルの読み込み処理は、たいてい一行ずつ読み込み処理すると思うので、 一行読み込み、nameなら値を保持 一行読み込み、tabindexなら判定、保持していたnameを使用 を繰り返せばよいでしょう。 > > サブファイル数、.txtの総数、1つの.txt内の総行数が全て10000を超える値なので、一連の処理を効率化して速度を上げる方法 > > > やることといえば、 ・ファイルの検索 ・ファイルを読み込んで調査 ・結果をシートに書き出す の3点だけだと思うので、高速化も何もないような気がします。 まずは実装してみて様子を見るべきかと思います。 書き出す量がやたら多いとそこは負荷になるので、他の回答にあるように描画を抑制したりなどは効果があると思います。 もしくはこの手の処理はVBAでやるよりもVBScriptにして、コマンドラインから実行、結果をCSVに吐き出す、の方がよっぽど速いような気もします。 追記 ファイルを抽出する処理は、コマンドを利用する手もあります。 以下はこちらのページを参考に手を加えたものです。参考まで。 と思って追記したのですが、ファイル数が多いとうまく使えなさそうなのでこれは無しということで。 一応情報としては残しておきます。 ``` Sub test() ' ファイルの一覧を取得 Dim WSH, wExec, sCmd As String, Result As String Set WSH = CreateObject("WScript.Shell") sCmd = "dir /b /s C:\hoge\*.txt" ' ここには選択した"フォルダ名+*.txt"を指定する Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) Do While wExec.Status = 0 DoEvents Loop Result = wExec.StdOut.ReadAll Set wExec = Nothing Set WSH = Nothing ' ファイル一覧文字列を改行コードで分割 Files = Split(Result, vbCrLf) ' 1ファイルずつ取り出すループ For Each f In Files ' ここでファイルごとの処理をする Debug.Print f Next End Sub ```