• ベストアンサー

VBAで特定のパス(フォルダ)内のファイルの有無を調べたい

AccessのVBAで質問です。 (今はテキストファイルの操作のみですが、使ったデータを後でAccessで使用したいこともあり、Accessにモジュールを書いています。) 【前提】 あるフォルダ内に、250個のテキストファイルがあります。 For ~ Nextで、ファイルがあれば開いて読み込み、別ファイルに書き出し、ファイルを閉じる。ファイルがなければ次のファイルに進む。 という処理をしたいです。 ファイルネームのルールは、AAAA.nnnで、拡張子nnnが3けたの数字になっています。(中身は必ずテキストファイルです。) ファイル数は250ですが、nnnは欠番があるため、最終値は981です。 【質問したいこと】 で、Open pathname ~で開こうとすると、当然ながら、nnnが存在しないファイルの番号になってしまうとエラー(番号53)が出ます。 このエラーを無視して次のファイルの作業に進みたいとき、どのようにエラー処理をすればよいのでしょうか? あるいは、Openする前に、ファイルの存在の有無を確認してから次の処理に飛ばす、ということはVBAからできるようでしたら、教えてください。 【現状・・・トホホ】 On errorやFor Nextを抜けるときなどのヘルプを読み、エラーハンドラーに飛ばすとか、同じようなコードを書いてみたのですが、エラーで止まってしまいます。 よろしくお願いします。

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

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

[イミディエイト] ? FileExists("C:\Temp\Test.txt") True ? FileWrite("C:\temp\Test1.txt", "AAAAA") True このように FileSystemObject を利用すれば割と簡単です。 Public Function FileExists(ByVal FileName As String) As Boolean   Dim fso As Object      Set fso = CreateObject("Scripting.FIleSystemObject")   FileExists = fso.FileExists(FileName) End Function Public Function FileWrite(ByVal FileName As String, _              ByVal Text As String) As Boolean On Error GoTo Err_FileWrite   Dim fso As Object   Dim txs As Object      Set fso = CreateObject("Scripting.FIleSystemObject")   Set txs = fso.CreateTextFile(FileName, True)   txs.Write Text   FileWrite = True Exit_FileWrite:   Exit Function Err_FileWrite:   MsgBox Err.Description & "(FileWrite)", vbExclamation, " 関数エラーメッセージ"   Resume Exit_FileWrite End Function [イミディエイト] ? UBound(GetFileList("C:\temp", "*.txt")) 13 このように、一気にファイルリストを取得するという手もあります。 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 Object    Dim fol   As Object    Dim fil   As Object    Dim fils   As Object       Set fso = CreateObject("Scripting.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 [イミディエイト] ? FileReadAll("C:\temp\Test1.txt") AAAAA FileReadAll()があれば、全体は簡潔に書けるでしょう。 で、これは、頑張って挑戦されてください。

Cirq1646
質問者

お礼

質問した以上に、以前からやってみたいと思っていたことまで含まれた回答をいただきました! 本当にありがとうございます。 書いていただいたコードは、読めるけど自力では書けないというレベルでした。今回を機会に、理解を深められると思います。 ありがとうございました!

その他の回答 (2)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

普通は回答1,2のようにすると思いますが、 いまのコードをあまり変えないコード。。 On Error Resume Next を使って '----------------------------------  On Error Resume Next For N = 1 To XXXXX   ●FileOpenの直後に    If Err.Number > 0 Then      Err.Clear      Exit For    End If   ◎◎通常処理◎◎ Next N '-------------------------------- 外しましたらご容赦!  

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

存在するファイルを処理したいのであれば Dir関数でファイル名を取得してみましょう dim ss as String, sDir as string, sNames() as String dim nIndex as integer ' カレントフォルダを記憶 sDir = CurDir ' ファイル名を取得 ss = Dir( "*.*", vbNormal ) do until ss = ""   ' フィル名に . があれば   if InStr( ss, "." ) then     ' . でファイル名を分割     sNames = split( ss, "." )     ' 最後の要素番号を取得     nIndex = Ubound( sNames )     ' 数字に変換できれば     if Val( sNames( nIndex ) ) and Len( sName(nINdex)) = 3 then       ' 現行の処理をここに記述     end if   end if Loop chdir sDir といった具合にして見ましょう もし AAA.000 などがあるなら     if sNames( nIndex) = "000" or ( Val( sNames( nIndex ) ) and Len( sName(nINdex)) = 3 ) then といった具合にしましょう

関連するQ&A