• ベストアンサー

フォルダの検索2

先日質問させていただいたのですが・・・。その続きです。 今度は範囲指定でフォルダの検索をしたいのです。 例えば、下記のようなフォルダがあったとします。 No1--- 200209190951 - ファイル     |- 200209191000 - ファイル     |- 200209201000 - ファイル ←○    |- 200209211000 - ファイル ←○    |- 200209221000 - ファイル ←○ ユーザより検索したいフォルダを選択してもらうとして、 『No1』『20020920以上の全てのフォルダ』と条件を指定してもらったとして、 ○のフォルダ内のファイルを参照したいのですが・・・。 なかなか、よい方法が思いつかず、なにかあれば教えてくださいm(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

VBのDIR関数って使い辛くって・・・・ DIR関数は私の想像ですが、VBが内部でAPI関数 FindFirstFile FindNextFile FindClose を呼んでいると思えます。 これらはファイルハンドルを取得する仕様なのですが、VBはそのファイルハンドルの記憶領域を一つしか存在していないようなので、DIR関数だけでのプログラムでは面倒なような気がします。 DIR関数の仕様は 最初に「Dir(ファイル,属性)」 2回目以降「Dir」 で次々にヒットするファイル名を取得しますよね? 下のような構造のとき \Dir1  ├\Dir1_1  │ ├File1_1.txt  │ ├File1_2.txt  │ └File1_3.txt  ├\Dir1_2  │ ├File2_1.txt  │ ├File2_2.txt  │ └File2_3.txt  ├\Dir1_3  │ ├File3_1.txt  │ ├File3_2.txt  │ └File3_3.txt  ├File1.txt  ├File2.txt  └File3.txt 途中でフォルダチェンジの為にDir(ファイル,属性)を使用したら、使用する前のDir位置を記憶していません。(わかりづらい説明ですが・・・) 要は再起法が使用できないという欠点があります。 私の場合なら、 1.APIで全て組む(ファイルハンドルを独自で記憶領域を設ける) 2.VBオブジェクトのファイルリストボックス・ドライブリストボックスを使用する 3.ファイルシステムオブジェクト(FSO)を(不本意ですが)使用する という3つが思いつきます。 ちなみに3の方法は、WIN95でIE3以下の環境OSでは使用できないと思われます。 私のライブラリにFSOサンプルとして使えそうなものがあったので、改造して張っておきます。チェックロジックはもっと効率的な方法があると思いますので、独自で改造してください。 ※要「参照設定」→「Microsoft Scripting Runtime」 Private Sub Command1_Click()   List1.Clear      '検索条件をチェック(チェックロジックはもっと厳しくした方がよいですね)   If Text1.Text > Text2.Text Then     MsgBox "範囲指定が不正"     GoTo PGMERR   End If      'ファイル一覧を作成(初期検索位置を指定)   Call addFileList("C:\Program Files\Microsoft Visual Studio\VB98")    PGMEND:   Exit Sub PGMERR: End Sub Private Sub Form_Load()   With Me     .Text1.Text = ""     .Text2.Text = ""     .List1.Clear     .Command1.Caption = "検索実行"   End With End Sub 'ファイル一覧を作成 Private Sub addFileList(inDir As String)   Dim fsoObj   As FileSystemObject   Dim fsoDir   As Folder   Dim fsoDirWk  As Folder   Dim fsoFile   As File   Dim blnFlg   As Boolean      'FSOを作成   Set fsoObj = New FileSystemObject   'DIRパスをセット   On Error Resume Next   Set fsoDir = fsoObj.GetFolder(inDir)   On Error GoTo 0   'DIR取得失敗   If fsoDir Is Nothing Then     MsgBox inDir & " なんて無いYO-"     GoTo PGMEND   End If      'DIR内部のファイルを取得   For Each fsoFile In fsoDir.Files     '範囲内にあるかチェック     '範囲指定だけでなく、Like演算子を使用して、「含むチェック」をしたいならここでできる     blnFlg = True     If Text1.Text <> "" Then       If Text1.Text > fsoFile.Name Then         blnFlg = False       End If     End If     If Text2.Text <> "" Then       If Text2.Text < fsoFile.Name Then         blnFlg = False       End If     End If          '範囲チェックが正常ならリストに追加     If blnFlg Then       List1.AddItem fsoFile.Path     End If   Next fsoFile      'DIR内部のサブフォルダのファイル一覧を取得   For Each fsoDirWk In fsoDir.SubFolders     Call addFileList(fsoDirWk.Path)   Next fsoDirWk PGMEND: End Sub

snowsaab
質問者

お礼

DIR関数を使わないでFSOを使ってやってみたところ、できました!! ありがとうございましたm(__)m

その他の回答 (3)

回答No.3

>NO1というフォルダの中にサブフォルダ(この例でいうと『200209201000』など)が存在するかどうか、というのは調べられるのでしょうか? dr = dir("d:\Test\No1\20020920100",16) でフォルダがあれば、dr = "20020920100"、なければ dr = "" になりますのでそれで判断できます。

snowsaab
質問者

お礼

お礼が遅くなりましたが、無事問題解決しました。 たびたびの質問にお答えくださって感謝しております。 ありがとうございましたm(__)m

回答No.2

ちょっと考えてみたのですが・・・ フォルダはどのように作られるのでしょうか? もし、プログラムで作るようなら、フォルダを作成したときに、 DBに登録しておいて、DBを検索するというのはどうでしょう? これならNo1内のフォルダが増えてきても余計なフォルダを見なくてもよいし、 条件も~以上、~の間、など簡単に検索できると思いますが・・・ フォルダは違うアプリで作成するようでしたら、別の方法でDBに登録という形になりますが。 まだ、締め切っていなかったので参考までに・・・

snowsaab
質問者

補足

すいません。考えてくださってありがとうございます。 フォルダは既存のものなんですよ。 というよりも、たぶん、他でプログラムより作成していると思うのですが、 また、別のシステムだと思うので・・・。 たぶん、taisuke555さんのおっしゃるとおりDB登録したほうがよいと思うのですが、それも無理のようなので・・・。 いちお、~以上、~以下、~の間の条件のときも、全フォルダを検索するようにしました。 あと、追加質問なんですが、もしおわかりになる範囲で結構ですので、 教えていただけますでしょうか? NO1というフォルダの中にサブフォルダ(この例でいうと『200209201000』など)が存在するかどうか、というのは調べられるのでしょうか?

回答No.1

ちょっと難しいですね? 見たところ日付のフォルダっぽいので2003とか出てきそうですね。 test2.text = "20020920"と入力されたとして dr = dir("d:\Test" & "No1" & "\*" ,16) while dr <>"" if ( left(dr,len(text2))>= text2 ) then 'ファイル参照の処理 end if dr = dir() wend のようにNo1フォルダを全部取得して、"20020920"以上か判断するしかないのでは?

snowsaab
質問者

お礼

そうですね・・・。 いちお、そのやり方でやってみます!! ありがとうございましたm(__)m

関連するQ&A

  • フォルダの検索

    フォルダの検索を行いたいのですが・・・。 例えば、下記のようなフォルダがあったとします。 No1--- 200209190951 - ファイル ← ○    |- 200209201000 - ファイル No2--- 200209191300 - ファイル    |- 200209201700 - ファイル ユーザより検索したいフォルダを選択してもらうとして、 『No1』『20020919』と条件を指定してもらったとして、 ○のフォルダ内のファイルを参照したいのですが・・・。 なかなか、よい方法が思いつかず、なにかあれば教えてくださいm(__)m

  • 【VBA】 フォルダの全ファイルを取得したい

    あるフォルダ内のCSVファイル全てを取得してひとつのファイルにまとめようと思っています。 下記の条件が必要なのですが、どのように記述したらよいでしょうか? ・プログラム内にフォルダのファイルパスを  記述せずにユーザにフォルダを指定させたい。  (テキストボックスはエラーが起こりやすいので避けたい) ・フォルダ内のファイルをひとつずつ開いて特定のシートに合算させたい  (合算処理はわかるのですが、そのほかがわかりません・・・) お手数ですが、どなたかわかる方がいたら 教えてください

  • 圧縮フォルダーのみを検索(XP)

    お世話になります。 Win/XP 使用です。 パソコン内の圧縮フォルダーのすべてを検索したいのですが 何か方法はありますでしょうか?  スタート → 検索 の左側メニューに  画像、ミュージックまたはビデオ  ドキュメント  ファイルとフォルダすべて  コンピュータまたは人 とありますが、 ファイルとフォルダすべてを選択して キーワードを入力せずに、 すべてのファイルとフォルダーを検索して フォルダーの種類で分ける方法しか思いつきません。 すべてのファイルとフォルダーを、検索結果に出すとなると 効率が悪いと思い投稿させていただきました。 他に方法はあるのでしょうか? なお、目的は、PC内の圧縮フォルダーを全て削除したいためです。 よろしくお願いします。

  • ネットワークフォルダー検索

    ExcelVBAで教えてください。 ネットワークの共有フォルダーに多くのフォルダーがあります。 その、フォルダーの中にはEXCELファイルが入っています。 ユーザーフォームにテキストボックスとボタンを配置して テキストボックスに入力してボタンを押して、先程のネットワークの 共有フォルダーを検索し、ファイル一覧表示し、EXCELファイル を選択して表示したいのですが、書き方が分かりません。 教えてください。 宜しくお願いします。

  • ファイルのバックアップするフォルダ

    Win10です。下記の質問の続きです。 https://okwave.jp/qa/q9689604.html バックアップソフトを使ってバックアップをしてみたのですが、とりあえず対象フォルダ数を減らしたいので、"c:\users"を全てバックアップしてみました。2回目からは差分ファイルだけバックアップしてくれるはずなので速やかに済むはずです。 ところがレジストリキーみたいなものが一杯あるらしく、細かいファイルが多くてバックアップにかかる時間が大変です。appdataとかのフォルダだと思います。 そういうフォルダを避けてあちこちのフォルダを選択するのも面倒ですが、確かブラウザのedgeのお気に入りはappdataに入っていたと思います。 皆さんはどこのフォルダをバックアップしていますか。

  • 特定のフォルダー内の文書に含まれる単語を検索をしたい

    Word for Mac の中である特定のフォルダの中のファイル内から、例えば「鯉のぼり」が含まれている文書を探し出したい場合です。Folderをあけて特定ファイルをクリックしてアップル+Fで検索しようとすると、探す場所は「すべての場所」「ローカルディスク」「ホーム」「特定の場所」の4つしか選択肢がなく、「特定の場所」からでは特定のファイルを指定できません。そのため仕方なく「ホーム」を指定することになり、とても時間がかかります。上手な方法を教えてください。

    • ベストアンサー
    • Mac
  • フォルダ内の検索ができなくなった

    Windows8.1Proですが今までで出来ていた、フォルダ内の検索が出来なくなりました。 文字を入力しても一致する条件はありませんと出ます。 以前は、一部の文字を入れても全てに該当するフォルダ内フォルダが表示されていたのですが 出来なくなりました。 インターネットで検索してもわかりません。 どなたか教えてください。

  • 検索結果を最新ファイルのみ1フォルダにコピーするには?

    はずかしながら、ソフトウェア業界にいる者ですが、 検索結果のファイルを最新ファイルのみ残す( 複写)で うまくいかないので、他に方法がないか教えて頂きたいのです。 コマンドまたはユーティリティ、フリーソフトでの方法がありましたら 教えて下さい。 WINDOWS98SEにて、1998年から2005年までの1000近い仕様書ドキュメントを 検索にて検索結果を表示させて、1フォルダに最新のバックアップとして まとめコピー(複写)させようとしていますが、 ドキュメントは修正時の各フォルダに名称同一のまま格納されているため 検索結果を更新日付時刻順(昇順)で表示させた後、 全選択し、ドラッグ&ドロップで別フォルダに複写します。 (同一ファイルは「全て上書き」を指定する) しかしながら、更新日付時刻順(昇順)で複写されなく、 格納順で格納されるケースがあり、 現状では、1ヶ月単位の選択範囲を決めてコピーしています。 いい方法教えて下さい。

  • サブフォルダを含めたファイル一覧表示

    Vistaでサブフォルダを含めたファイル一覧表示をする方法を教えてください。 WindowsXPでは、検索条件を指定せずにファイル検索を実行するとサブフォルダを含めてすべてのフォルダとファイルを一覧で表示することができましたが、Vistaではできませんでした。

  • 外付けHDD内のフォルダを検索したい

    こんにちは。 外付けHDD内の 「フォルダのみ」を検索したいのですが、 作成した日付で検索したいです。 例えば、2021/08/13に作成したフォルダを探したい場合、 2021/08/13を入力して検索すると もちろん、フォルダは検索されるのですが、 2021/08/13に作成されたJPEGファイルやテキストなど 全て検索されるので、それが大量なものなので 検索が止まりません。 出来れば、2021/08/13に作成された 「フォルダだけ」を指定したいのですが、 そんな検索の仕方ありますでしょうか? 環境は、WIN10 WIN8.1 WIN7です。 3台使いしています。 通常はWIN10を使用しています。

専門家に質問してみよう