Microsoft Access 掲示板

VBAでインポート処理ができたエクセルファイルのみ別フォルダへ移動したい / 9

21 コメント
views
4 フォロー
9
初心者 2023/01/10 (火) 20:09:50 ddef7@7bb1a

私が悩んでいる間にいろいろと考えていただきありがとうございます。
なんとなく同じようになりましたが、拡張子を限定するやり方は勉強になりました。ありがとうございます。
今日作ったものに追加してみます。
ここで取得したファイル名を保存してみましたが、うまく保存できませんでした。SQLで追加してみましたが、インポートしたレコードではなく、別のレコードとして保存されてしまいました。

Set fso = New FileSystemObject ' インスタンス化

Dim fl As Folder
Set fl = fso.GetFolder("C:\アクセス\エクセル\") ' フォルダを取得

Dim f As File
    For Each f In fl.Files ' フォルダ内のファイルを取得
    Debug.Print (f.Name) ' ファイルの名前 (Tips.txt) など
    Debug.Print (f.Path) ' ファイルのパス (D:\Tips.txt) など
    
Dim dname As String
Dim fname As String
Dim tblname As String
Dim sname As String

dname = "C:\アクセス\エクセル\" 'エクセルファイルの保存フォルダ、適宜変更する。
tblname = "テーブル名" '取り込み先テーブル名、適宜変更する。
fname = f.Path 'エクセルファイル名を指定する場合*で挟む、適宜変更する。
sname = "sheet3!"

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, tblname, fname, True, sname
    
DoCmd.RunSQL "insert into T3(ファイル名) VALUES('" & f.Name & "');"
    
    
  Dim sourceFile  As String
  Dim destinationFolder As String
 
  sourceFile = f.Path
  destinationFolder = "C:\アクセス\エクセル\処理済\"
 
 
  fso.MoveFile sourceFile, destinationFolder
      
Next

' 後始末
Set fso = Nothing

DoCmd.SetWarnings False

hirotonさんエラー処理のことを考えていただいてありがとうございます。
難しいので、教えていただいたことをよく読んで試してみます。
よくわかっていないのですが、教えていただいたコードの中で

インポート成功 = Err.Number = 0

というのは正常に処理ができた(0はエラーが発生していない)ということなのでしょうか?
初歩的な質問ですいません。
よろしくお願いします。

こんなにいろいろ教えていただけるとは思っていなかったので、本当にうれしいです。ありがとうございます。

通報 ...
  • 13
    hiroton 2023/01/11 (水) 08:47:43 d204b@f966d >> 9

    Err オブジェクト

    Err.Numberは「リセット時に0」になります。その後、「エラーの発生がなければ0のまま」です。ただし、エラーが複数回発生した場合は「最後のエラー」情報になっていることに注意が必要です
    On Error Resume Nextを使ったエラー対策は、

    1. エラートラップを行う範囲の設定
    2. エラーが発生する可能性のある処理
    3. Errの確認タイミングが適切か
    4. Errの適切なリセット

    これらをしっかりと把握している必要があるということです。提示したコードはサンプルの為、できるかぎりエラートラップに焦点を絞って記述しています

      On Error Resume Next            '//エラートラップ開始(Errリセット)
    
      DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, tblname, dname & fname, True, sname
    
      インポート成功 = Err.Number = 0  '//エラー判定
      On Error Goto 0                 '//エラートラップ終了
    

    エラーの結果を変数(インポート成功)に取っているのもエラートラップに焦点を絞るためで、適切に処理できているならば

      On Error Resume Next
    
      DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, tblname, dname & fname, True, sname
    
      If Err Then
        '//エラー発生時の処理
      Else
        '//エラーがなかった時の処理
      End If
      On Error Goto 0
    

    のように、エラートラップ内で処理すればいいでしょう