- ベストアンサー
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を抜けるときなどのヘルプを読み、エラーハンドラーに飛ばすとか、同じようなコードを書いてみたのですが、エラーで止まってしまいます。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
[イミディエイト] ? 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()があれば、全体は簡潔に書けるでしょう。 で、これは、頑張って挑戦されてください。
その他の回答 (2)
- onlyrom
- ベストアンサー率59% (228/384)
普通は回答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)
存在するファイルを処理したいのであれば 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 といった具合にしましょう
お礼
質問した以上に、以前からやってみたいと思っていたことまで含まれた回答をいただきました! 本当にありがとうございます。 書いていただいたコードは、読めるけど自力では書けないというレベルでした。今回を機会に、理解を深められると思います。 ありがとうございました!