2011-12-06 11 views
0

ドライブC:の1つのマスターフォルダ内に複数のフォルダに複数のcsvファイルがあります。一部のファイルは毎日更新されます。ファイルに更新がある場合は、ファイル名を含むアクセステーブルに新しい日次データを読み込む必要があります。ここまでのスクリプトは、すべてのcsvファイルからすべてのデータをインポートします。次に、新しいレコードにファイル名を追加します。すべてのレコードにファイル名を追加する必要があります。csvファイルをインポート中にアクセステーブルにファイル名を追加

ご協力いただければ幸いです。

スクリプト:

サブImport_multiple_csv_files()

Const strPath As String = "C:\text1\" 'Directory Path 
Dim strFile As String 'Filename 
Dim strFileList() As String 'File Array 
Dim intFile As Integer 'File Number 
Dim rs As DAO.Recordset 
'Loop through the folder & build file list 
strFile = Dir(strPath & "*.csv") 
While strFile <> "" 
    'add files to the list 
    intFile = intFile + 1 
    ReDim Preserve strFileList(1 To intFile) 
    strFileList(intFile) = strFile 
    strFile = Dir() 
Wend 
'see if any files were found 
If intFile = 0 Then 
    MsgBox "No files found" 
    Exit Sub 
End If 
'cycle through the list of files & import to Access 
'creating a new table called MyTable 

For intFile = 1 To UBound(strFileList) 

DoCmd.TransferText acImportDelimi, , _ 
    "Test", strPath & strFileList(intFile) 
    ‘add file name to record 
    Set rs = CurrentDb.OpenRecordset("Test") 
    rs.AddNew 
    rs.Fields("Com").Value = Dir(strPath & "*") 
    rs.Update 
    rs.Close 
    Set rs = Nothing 


Next 

MsgBox UBound(strFileList) & " Files were Imported" 

End Subの

答えて

2

私は質問が何であるかを100%わからないんだけど、あなたはファイル名を更新しようとしている場合インポートしたばかりのレコードは、単純な更新ステートメントで行うことができます。

UPDATE Test SET Com='MyFileName' WHERE Com IS NULL OR Com='' 

ここでは、フィールドがnullまたは空の文字列であると仮定していますが、これが正しくない場合は、これを独自の基準に置き換えることができます。これを行うにはDoCmd.RunSQLを使用できます。

問題を誤解している場合は、質問を更新して明確にしてください。

+0

こんにちは、Tksあなたの助言のために。それぞれのレコードがアクセステーブルに置かれるときに 'For intFile = 1 To UBound(strFileList)'を開始するフロチャートでは、ファイル名をテーブルの列 'com'に配置します。あなたの提案はこのループの中で機能しますか? –

+0

はい、インポートしたレコードごとにファイル名を保存します。 TransferTextは、ファイル全体(複数のレコード)を一度に読み込みます。これらのレコードをファイル名で更新する必要があります。ループ内のUPDATEステートメントを呼び出して、WHERE句が最新のレコードのみをピックアップすることを確認します。そうしないと、以前のレコードも更新されます。使用したレコードセットコードでは、別の新しいレコードを追加して、既存のレコードを更新しません。レコードセットで必要なことをすることはできますが、1行のDoCmd.RunSQLステートメントはより簡単になります。 – Simon

+0

'CurrentDB.Execute SQLString、dbFailOnError'は、' DoCmd.RunSQL'で取得した警告をスキップし、データベースオブジェクトにCurrentDBを割り当てて、それを使用すると、 'RecordsAffected、有益かもしれません。 – Fionnuala

関連する問題