• ベストアンサー

DIR関数

VB6で、あるフォルダ(A)に存在するCSVファイル(複数ファイル)が、別のフォルダ(B)に存在しているかチェックを行いたいのでうが、DIR関数を2重に使用すると、フォルダAの次への読み込み時にエラーになってしまいます。 何か別の方法はあるのでしょうか?

noname#31345
noname#31345

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

  • ベストアンサー
noname#140971
noname#140971
回答No.4

Q、何か別の方法はあるのでしょうか? A、あります。 DIR関数を使わないとすれば、FileSystemObject になります。 Microsoft Scripting Runtime を参照させる必要があります。 Private Sub コマンド0_Click()   Dim I  As Integer   Dim N  As Integer   Dim F() As String      F() = GetFileList("C:\Temp")   N = UBound(F())   For I = 1 To N     Debug.Print F(I)   Next I End Sub [イミディエイト] Test.txt TestII.txt TestNew.txt Text.ini Text.txt 取引先マスター.csv 夫婦.txt このように GetFileList 関数を作成すれば一発で Dir 結果を取得できます。 [イミディエイト] ? FileExists("C:\Temp\Test.txt") True このように FileExists 関数を作成すれば一発で有り・無しも調べることが可能です。 Public Function GetFileList(ByVal strDir As String, _               Optional strName As String = "*") As String() On Error GoTo Err_GetFileList    Dim strFiles As String    Dim fso   As FileSystemObject    Dim fol   As Folder    Dim fil   As File    Dim fils   As Files       Set fso = New FileSystemObject    Set fol = fso.GetFolder(strDir)    Set fils = fol.Files    For Each fil In fils      If fil.Name Like strName And fil.Attributes = Archive Then        strFiles = strFiles & "," & fil.Name      End If    Next Exit_GetFileList: On Error Resume Next   GetFileList = Split(Mid(strFiles, 2), ",")   Exit Function Err_GetFileList:   strFiles = ""   MsgBox Err.Description & "(GetFileList)", vbExclamation, " 関数エラーメッセージ"   Resume Exit_GetFileList End Function Public Function FileExists(ByVal FileName As String) As Boolean   Dim fso As FileSystemObject      Set fso = New FileSystemObject   FileExists = fso.FileExists(FileName) End Function

noname#31345
質問者

お礼

ありがとうございました。 FileExists 関数を使用して無事に解決しました。 とっても役立ちました。

その他の回答 (4)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.5

B側を調べる際に、以下のHPの「VB [VB6]」の所の例を参考に、Dirを使わずにFileExistsを使用して下さい。 http://jeanne.wankuma.com/tips/file/exists.html FileExistsであれば、A側をDir関数でループしている最中でも使えます。 なお、Dir関数の使用はあまり推奨されていないので、出来れば、A側のループもFSOを使用した方が良いです。2重ループならFSOを2つ、3重ループならFSOを3つ、と、必要なだけFSOを宣言すれば良いだけなので。

回答No.3

Dirを使わない別の方法をお探しなら Scripting.FileSystemObjectが、それにあたります。 Scripting.FileSystemObjectで検索すると、たくさんでてきますが http://www2.moug.net/bbs/exvba/20070411000054.htm などが、サンプルがあって、試しやすいかもしれないです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

Dir関数は入れ子で使うことが出来ません フォルダAに対してDir関数を実行して配列などにファイル名を格納します その後でこの配列を元にして フォルダBに対してチェックを実行しましょう dim fname(200) as String dim s as string, n as integer, i as integer s = dir("フォルダA\*.csv") if s<>"" then do fname(n) = s n = n + 1 s = dir loop while s<>"" end if for i= 0 to n if dir("フォルダB\" & fname(i) )<>"" then ' 処理を記述 end if next といった具合です ...

  • unamana19
  • ベストアンサー率62% (56/89)
回答No.1

どのようなソースでしょうか?

関連するQ&A

  • 複数のパソコン間のDir関数について

    Visual Basic を用いてネットワーク上の他のパソコンのディスク上にあるファイルの有無をチェックするのにDir関数を用いています。 If Dir("\\192.168.24.50\共有データ\aaa.csv") <> "" Then 指定したIPアドレスのパソコンと繋がっていればDir関数はすぐに終了するのですが、繋がっていなければDir関数は約30秒終了しません。 指定したIPアドレスのパソコンと繋がっていなくてもDir関数をすぐに終了したいのですが、何か方法はないでしょうか。 下記方法が可能であれば、ファイルの有無チェックが即座にできそうに思えますが、小生には方法がわかりません。 ・Dir関数の前に繋がっているかを即座に判断できる方法。 ・Dir関数のタイムアウト設定を行う方法。 ・Dir関数を用いずにファイルの有無チェックが即座にできる方法(関数) 何か良い解決案があれば教えて下さい。お願いします。

  • VBのDir関数について

    VB6.0について質問です. Dir関数にてフォルダ内のファイルを参照したいのですがうまくいきません>< 最初のファイルは参照できるのですが次のファイルへの参照ができません。。。 下記のコードでおかしいところはあるでしょうか? path = "d:\ABC\data" item = Dir(path & "\*.mdb", vbDirectory) Do While item <> "" ' ループを開始します。 item = Dir ' 次のフォルダ名を返します。 Loop

  • UNIXで2つのdir内のファイルのチェック

    UNIXで2つのdir内に存在するファイルのチェックをやりたいのですが なさけないことにいい方法が思いつきません。 具体的にはDIR-A内に存在するファイルが全てDIR-B内に存在するか どうかをチェックして存在してないものを出力といったことです。 方法はUNIX上で実行できればとくに問いません。

  • DIR関数について教えてください。

    現在、テキストボックスに入力した文字が、テキストファイル等の中身に存在するかを調べるプログラムの問題を解いているのですが。 選択したフォルダの下の階層にある全てのフォルダに対しても 検索を行うプログラミングでかなり悩んでいます。 特に、Dir関数の意味が???です。 例えば現在のパスをC:\テスト01\テスト02\としたときに、 変数Mypathに Mypath=C:\テスト01\テスト02\と代入して、 変数MyNameに MyName = Dir(setPath & "*.*", vbDirectory)とすると 変数MyNameには、1回目は"."が入り、2日目は".."が入ります。 なぜ、"."や".."が入るのか分からず悩んでいます。 "."は、現在のフォルダを表して、".."は親(1つ上)のフォルダを表していると、 と言うことは、ヘルプを調べて分かったのですが。 なぜ?こういった値が入るのか理解できない状態です。 3回目は、まともなファイル名が(例えばtest.txt)などのちゃんとした ファイル名が入ってくれるのですが。 特に、".."(親フォルダ)をなぜ見に行くのか??よく分かっていません。 良かったら教えてください。 よろしくお願いします。m(__)m

  • 複数のCSVファイルを1つのファイルにまとめる方法

    EXCELで、あるフォルダ(例:Dir1)に格納されている複数のCSVファイルを読み込んで、そのファイルの1行目をコピーし、別ファイル(a.csv)にペーストしたいと思っております。 例えば、Dir1には1.csv,2.csv,3.csvの3つのCSVファイルが存在した時に、a.csvに出力されるのは、 ----------------------------------- 1.csvの1行目 2.csvの1行目 3.csvの1行目 ----------------------------------- となるのが、理想の形です。 方法を知っている方がいらっしゃったら お教えいただければと思います。

  • EXCEL VBAのDir関数について

    ファイルサーバー上にあるEXCELファイルのVBAで 新規にファイルを作成する際にDIR関数で 同名ファイルの有無チェックを作成したいと考えています。 しかし以下のような処理で行うとチェックするフォルダが My documentsになってしまいファイルの有無チェックが うまくいきません。どのように書けば良いのでしょうか? ご教授ください。よろしくお願いします。 (情報不足でしたらご指摘ください。補足いたします) ChDir "\\サーバー\フォルダ\サブフォルダ" If(""=Dir(ファイル名))then '同名ファイル無 ファイルを保存する処理 Else msgbox "同名ファイルがあります" Endif 環境: サーバー  :WinNT4.0 クライアント:Win98SE or WinNT4.0 EXCEL2000 LAN接続(同一ドメイン)

  • Access2013Dir関数について

    Access2013でフォームを開くときにDir関数を使い、リンクテーブル先(共有フォルダ)にlaccdbがないかを確認しています。 その際に誰も開いてないのにファイル存在有と出てしまうのですが、どうしてでしょうか。 また、laccdb確認をせずに意図的にリンクテーブルの元ファイルを開きlaccdbを作った状態でテーブル更新などを行いましたが、排他的エラーのメッセージが出ませんでした。ldbの時はうまくいったのですが、どうすればlaccdbを確認できますでしょうか。 何人かで共有するシステムのデータテーブルなので競合をスルーしてしまうと運用するのが怖く質問させていただきました。

  • VBAのDIR関数でファイル名「0005」などが「5」だけにならない様にするには?

    あるフォルダ内に有るファイル郡の名称をDir関数で取得してExcelのシートのA列に並べるマクロなんですが、0で始まる数字のファイル名の場合、セルには0が省かれて入ってしまいます。 0011なら0011とそのままセルに入れるには(文字列として入れるには?)、マクロはどう書けばいいんでしょうか? 

  • コマンド DIRの動作について

    バッチファイルのDIRコマンドでよく分からない事が あるので、ご存知の方、ご教授願います。 あるフォルダ(仮にC:\test\とします。)の中に1行だけ記述された CSVファイルが大量にあります。 これをCOPYコマンドで1ファイルにまとめたいと思います。 しかし、そのフォルダの中にはサブディレクトリがあり、その中にも COPYコマンドの対象としたいCSVファイルがあります。 COPYコマンドはサブディレクトリまで処理対象としてくれない ようですし、サブディレクトリの数は不特定なので、どうしょうかと 困っていたら、あるWebページを見つけました。 ttp://www.fpcu.jp/dosvcmd/bbs/log/copyxcopy/4-1567.html やりたい事はまさにドンピシャで、そのページのコマンドを 自分流に書き換えつつ、完成したのが、以下のコードです。 MKDIR "C:\test2\" XCOPY "C:\test\*.csv" "C:\test2\" /E /Y for /f %%a in ('dir "C:\test\" /b') do XCOPY "C:\test\\%%a\*.csv" "C:\test2\" /E /Y COPY "C:\test2\*.csv" "C:\test2\log.csv" ※変な所で改行が入って見難くなっていたらゴメンナサイ。 上記、コードで試してみた所、WindowsXPでは問題なく動作しました。 しかし、Windows2000で試してみた所、うまく動きませんでした。 PAUSEコマンドを入れて、どんなコマンドが吐かれているのか見たら サブディレクトリを動的に変えようとしてい%%aの中に「ドライブ」 とか「ボリューム」とか入ってくるのです。最初は意味不明でしたが DIRのbオプションを付けない時に、そういう文字がコマンドプロンプト の画面に表示され、それを取得しているんじゃないかという事に 気づきました。ちなみにWindows2000でもDIR C:\test /bとやると フォルダ名、ファイル名しかコマンドプロンプトの画面には表示されません。 気づいたはいいんですが、解決方法が分かりません。 どなたか、コマンドに詳しい方、ご教授ください。 よろしくお願いします。

  • Excel2003VBA Dir関数について

    Excel2003VBAを勉強中の者です。早速ですが質問させて頂きます。 C:\Documents and Settings\All Users\Documents\親フォルダ\の中に複数のフォルダと標準ファイルが混在しており、 フォーム上のコマンドボタンを押す事で、リストボックスにフォルダだけを表示させたく下のコードを作成しました。 動作としては一旦FileDateという配列に、取得したフォルダ名をセットし、それをリストボックスに出力する事としました。 配列FileDateはDir関数でフォルダ名をひとつ取得する度に、1つずつ要素数を増やしております。 自分のフォルダを表す記号”.”と一つ上のフォルダを表す記号”..”は省きます。 このコードを実行してみた結果、”.”と”..”は省く事ができました。 しかし次に標準のフォルダが変数bufに入った状態からエラーが発生してしまいます。 ■エラー発生■の部分で「実行エラー53 ファイルが見つかりません。」と出てしまうのです。 Dir関数が正しく使えていないのだと思います。 ローカルウィンドウで確認しましたが、変数bufにはフォルダ名がちゃんとセットされている事からファイルそのものは認識してくれている様に思えます。 自分なりにかなり調べ、色々と試してみましたがどうにも手に負えませんでした。 エラーの発生原因と対策をご教示頂きたく、どなたかご助力をお願い致します。 Private Sub CommandButton1_Click() Dim buf As String Dim i As Long i = 1 Dim FileDate() As Variant ReDim FileDate(1 To i) As Variant buf = Dir("C:\Documents and Settings\All Users\Documents\親フォルダ\", vbDirectory) Do If GetAttr(buf) And vbDirectory Then '■エラー発生■ If buf <> "" And buf <> "." And buf <> ".." Then FileDate(i) = buf i = i + 1 ReDim Preserve FileDate(1 To i) End If End If buf = Dir() Loop While buf <> "" ListBox1.List = FileDate End Sub

専門家に質問してみよう