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(エラーカウント & "個のファイルがインポートできませんでした")
通報 ...