Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2010)
インポート時にファイル名をフィールドに追加する方法
投稿日時: 20/07/02 13:22:38
投稿者: タルタル5050

お世話になります。
 
あるファルダ内のCSVファイルをTable_Aにインポートしたいと思っています。
Table_Aへのインポート時にTable_Aの最初の項目に元のCSVファイルのファイル名を追加してインポートを行いたいのですがどの様にすれば良いでしょうか?
元ファイルとなるCSVファイルには「ファイル名」の項目はありません。
 
CSVファイルのインポートには、下記を使用しています。
 
   Dim f As String
    
   FilePath = C:\CSV\test.csv
      DoCmd.TransferText acImportDelim, "IN_DATE", "Table_A", FilePath, False, ""
 
 
 
宜しくお願い致します。

回答
投稿日時: 20/07/02 15:34:41
投稿者: sk

引用:
Table_Aへのインポート時にTable_Aの最初の項目に
元のCSVファイルのファイル名を追加してインポートを行いたい

・csv ファイルを 1 件インポートするごとに
 [Table_A]のフィールド[ファイル名]の値を
 更新するクエリ( UPDATE 文)を実行する。
 
・[Table_A]とは別の(空の)テーブルを csv ファイルのインポート先とし、
 インポートするごとにそのテーブルの全てのレコードを
 ファイル名と共に[Table_A]に追加するクエリ( INSERT INTO 文)を
 実行する。
 
・TransferText メソッドとは別の方法で
 csv ファイルの名前とレコードを
 [Table_A]に追加する処理を実行する。
 
以上のいずれかが考えられます。

回答
投稿日時: 20/07/02 15:59:24
投稿者: Suzu

こんにちは。
 
私ならば
 インポート予定のテーブルとは別の、予め「ファイル名」フィールドを持ったテーブルにデータをインポート
 インポートが済んだあと、そのテーブルにUPDATE文でファイル名を追記
 ファイル名を含んだデータを本来のテーブルへ INSERT INTO文を発行
 
 
ファイルが固定なのであれば
  CSVをリンクテーブルとして保存
  そのリンクテーブル をソースに
  INSERT INTO 文 の中の SELECT句 の中に ファイル名を埋め込み
の様な方法も採れると思います

投稿日時: 20/07/02 17:01:49
投稿者: タルタル5050

返信ありがとうございます。
 
>ファイルが固定なのであれば
ファイル名に日付が入っているため固定ではないです。
 
>インポート予定のテーブルとは別の、予め「ファイル名」フィールドを持ったテーブルにデータをインポート
 インポートが済んだあと、そのテーブルにUPDATE文でファイル名を追記
 ファイル名を含んだデータを本来のテーブルへ INSERT INTO文を発行
 
どのような記述をすれば良いのでしょうか?
 
ご教授ください。

回答
投稿日時: 20/07/06 11:02:33
投稿者: Suzu

タルタル5050 さんの引用:
どのような記述をすれば良いのでしょうか?

 
最低限なら 下記の様な感じでしょう。
 
Sub Sumple()
 
Dim strFilPath As String
Dim strWorkTable As String
Dim strLegacyTable As String
 
Dim strSQL As String
 
strFilPath = "CSVファイルフルパス"
strWorkTable = "ワークテーブル"
strLegacyTable = "蓄積テーブル"
 
'ワークテーブルレコード削除
strSQL = "DELETE FROM " & strWorkTable & ";"
DoCmd.RunSQL strSQL
 
'CSVファイルをワークテーブルへインポート
DoCmd.TransferText acImportDelim, "CSVファイルインポート定義", strWorkTable, strFilPath, True
 
'ワークテーブルの【FileName】フィールドへ CSVファイル の フルパスを代入
strSQL = "UPDATE " & strWorkTable & " SET FileName = """ & strFilPath & """;"
DoCmd.RunSQL strSQL
 
'ワークテーブルの内容を 蓄積テーブルへ 追加
strSQL = "INSERT INTO " & strLegacyTable & " SELECT * FROM " & strWorkTable & ";"
DoCmd.RunSQL strSQL
 
End Sub
 
 
ファイル名が固定ではないなら、コード内の CSVファイルフルパスを決め打ちしている部分の対応
 
コードを複数回実施した場合、累計テーブルでレコードが重複するかもしれません。
・累計テーブルで重複させない 様、構造(主キーの採り方)を工夫する
                                 ワークテーブルのレコードと重複しない様に工夫する
                                 累計テーブルにインポート済みの日付をフォームに表示する
・累計テーブルで重複してもよいので、データを扱う際に重複しない様にデータを抽出し使用する
等の対策が必要かもしれませんね。
 
そのあたりは、ご自身で試行錯誤を行い
『具体的に』「○○を行いたいのだけれど、△△が判らない」等の表現をされる事をお勧めします。

投稿日時: 20/07/31 10:13:38
投稿者: タルタル5050

返信が遅くなり申し訳ございません。
 
何とか希望通りに処理することができました。
 
お二人様、ありがとうございました。