dポイントプレゼントキャンペーン実施中!

AccessのVBAで質問です。
(今はテキストファイルの操作のみですが、使ったデータを後でAccessで使用したいこともあり、Accessにモジュールを書いています。)

【前提】
あるフォルダ内に、250個のテキストファイルがあります。
For ~ Nextで、ファイルがあれば開いて読み込み、別ファイルに書き出し、ファイルを閉じる。ファイルがなければ次のファイルに進む。
という処理をしたいです。
ファイルネームのルールは、AAAA.nnnで、拡張子nnnが3けたの数字になっています。(中身は必ずテキストファイルです。)
ファイル数は250ですが、nnnは欠番があるため、最終値は981です。

【質問したいこと】
で、Open pathname ~で開こうとすると、当然ながら、nnnが存在しないファイルの番号になってしまうとエラー(番号53)が出ます。
このエラーを無視して次のファイルの作業に進みたいとき、どのようにエラー処理をすればよいのでしょうか?

あるいは、Openする前に、ファイルの存在の有無を確認してから次の処理に飛ばす、ということはVBAからできるようでしたら、教えてください。

【現状・・・トホホ】
On errorやFor Nextを抜けるときなどのヘルプを読み、エラーハンドラーに飛ばすとか、同じようなコードを書いてみたのですが、エラーで止まってしまいます。

よろしくお願いします。

A 回答 (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()があれば、全体は簡潔に書けるでしょう。
で、これは、頑張って挑戦されてください。
    • good
    • 0
この回答へのお礼

質問した以上に、以前からやってみたいと思っていたことまで含まれた回答をいただきました!
本当にありがとうございます。

書いていただいたコードは、読めるけど自力では書けないというレベルでした。今回を機会に、理解を深められると思います。
ありがとうございました!

お礼日時:2008/10/23 12:50

普通は回答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
'--------------------------------

外しましたらご容赦!
 
    • good
    • 1

存在するファイルを処理したいのであれば 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
といった具合にしましょう
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!