Microsoft Access 掲示板

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

21 コメント
views
4 フォロー
8
hiroton 2023/01/10 (火) 14:04:17 29a0e@f966d

インポートできたファイルのみ別フォルダへ移動する

インポートがファイル個別にできているのでそこに処理を追加すればいいですね

本当はアクセス側でファイル名の取得を行いたいのですが、うまくいかず、

これも同じタイミング(ファイルごとにインポートできたタイミング)でやればいいと思います

Dim dname As String
Dim fname As String
Dim tblname As String
Dim sname As String
Dim destinationFolder As String

dname = "C:\アクセス\エクセル\"
tblname = "テーブル名"
fname = Dir(dname & "*.xlsx")
sname = "sheet3!"
destinationFolder = "C:\アクセス\エクセル\処理済\"

Do While fname <> ""
  DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, tblname, 
  dname & fname, True, sname

'//ここにファイル毎の処理を追加する
  FileCopy dname & fname, destinationFolder & fname
  Kill dname & fname
  '//インポートしたファイル名を書き込む処理

  fname = Dir()
Loop

ステートメントによるファイル処理には「ファイルの移動」がないので「コピー&削除」で対応します
ファイル名を書き込む処理は主題からずれているので、とりあえず、「ここでやればいいよ」とだけにしておきます。具体的にはインポートファイル名が未記入のレコードに対して更新クエリを発行すればいいでしょう(別な方法でうまくいっているのであればそれでもいいと思います)

同様に、FileSystemObjectを使うかどうかもひとまず置いておきます


エラー処理について
「エラー処理をする」のと「エラーを無視して処理をする」は似ているようで異なります(テクニックのテンプレートが)

Dim dname As String
Dim fname As String
Dim tblname As String
Dim sname As String
Dim destinationFolder As String

Dim インポート成功 As Boolean

dname = "C:\アクセス\エクセル\"
tblname = "テーブル名"
fname = Dir(dname & "*.xlsx")
sname = "sheet3!"
destinationFolder = "C:\アクセス\エクセル\処理済\"

Do While fname <> ""
  On Error Resume Next
  DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, tblname, 
  dname & fname, True, sname
  インポート成功 = Err.Number = 0
  On Error Goto 0

'//ここにファイル毎の処理を追加する
  If インポート成功 Then
    FileCopy dname & fname, destinationFolder & fname
    Kill dname & fname
    '//インポートしたファイル名を書き込む処理
  End If

  fname = Dir()
Loop

インポートできたかどうかの確認

インポートできたファイルはそのフォルダからなくなっているので、「インポートできなかったファイルがある=フォルダにファイルが残っている」ことで判断できます

'//(略)
Loop

fname = Dir(dname & "*.xlsx")
If fname <> "" Then MsgBox("インポートできなかったファイルがありました")

ファイル毎に処理をしているのでそこで記録を取ってもいいですね

'//(略)
  Dim エラーカウント As Long
  If インポート成功 Then
    FileCopy dname & fname, destinationFolder & fname
    Kill dname & fname
    '//インポートしたファイル名を書き込む処理
  Else
    エラーカウント = エラーカウント + 1
  End If

  fname = Dir()
Loop
If エラーカウント <> 0 Then MsgBox(エラーカウント & "個のファイルがインポートできませんでした")
通報 ...