• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CSVからテーブルへ追加)

CSVからテーブルへの時価追加方法

このQ&Aのポイント
  • CSVからテーブルに時価を追加する方法を教えてください。
  • 商品TBLの時価に取り込みCSVの情報を追加する仕組みを作りたいです。具体的な方法をご教示ください。
  • 商品TBLと取り込みCSVの商品IDを比較して、同じであれば取り込みCSVの時価の値を商品TBLの時価列に追加する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

データの並びを見落としていました。 CSV側のデータがID通りに並んでいる ものと思っていました。 少し変更します。 Private Sub コマンド0_Click() Dim db As Database Dim rs As Recordset Dim rst As Recordset Dim strSQL As String strSQL = "SELECT 取り込みCSV.ID, 取り込みCSV.時価 FROM 取り込みCSV" Set db = CurrentDb Set rs = db.OpenRecordset("取り込みCSV") Set rst = db.OpenRecordset("商品TBL", dbOpenDynaset) rs.MoveFirst Do Until rs.EOF On Error Resume Next rst.FindFirst "ID = " & rs!ID If rst.NoMatch Then Else rst.Edit rst!時価 = rs!時価 rst.Update End If rs.MoveNext Loop rs.Close Set rs = Nothing rst.Close Set rst = Nothing db.Close Set db = Nothing End Sub

matupo
質問者

お礼

piroin654様 出来ました!! 長時間お付き合い頂き有難う御座います、 大変感謝いたします。 少し図々しい質問なのですが 商品TBLに無い商品IDが取り込みCSVに あったばあい商品TBLに追加させる事は 出来ますでしょうか? もしお時間が無いのなら別スレを立てて質問を 行いたいと思います。 とりあえずやりたい事を教えて頂き 有難う御座いました。

その他の回答 (8)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

コード中の On Error Resume Next はコメントアウトしておいてもいいです。 フィールドの設定など間違った場合に 「このコレクションには項目がありません」 というようなエラーを出すので、エラーが 出ずに何も起こらないということが防げます。 動きは正常であるが、どうしてもエラー メッセージが出るという場合 などに使います。滅多にありませんが。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.8

>商品TBLに無い商品IDが取り込みCSVに >あったばあい商品TBLに追加させる事は >出来ますでしょうか? タッチの差で出しておきました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.7

いらないものが入っていました。 Dim strSQL As String strSQL = "SELECT 取り込みCSV.ID, 取り込みCSV.時価 FROM 取り込みCSV" 使っていないのでコメントアウトか削除してください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

またまた、商品IDがIDになっていました。 変更しておいてください。 ところで、CSVファイルにはテーブルにない マグロが入っていますが、テーブルに追加 もしておきたい、というのであれば、 Private Sub コマンド0_Click() Dim db As Database Dim rs As Recordset Dim rst As Recordset Dim strSQL As String strSQL = "SELECT 取り込みCSV.ID, 取り込みCSV.時価 FROM 取り込みCSV" Set db = CurrentDb Set rs = db.OpenRecordset("取り込みCSV") Set rst = db.OpenRecordset("商品TBL", dbOpenDynaset) rs.MoveFirst Do Until rs.EOF On Error Resume Next rst.FindFirst "商品ID = " & rs!商品ID If rst.NoMatch Then '新規追加 rst.AddNew rst!商品ID = rs!商品ID rst!商品名 = rs!商品名 rst!単価 = rs!単価 rst!時価 = rs!時価 rst.Update '時価変更 Else rst.Edit rst!時価 = rs!時価 rst.Update End If rs.MoveNext Loop rs.Close Set rs = Nothing rst.Close Set rst = Nothing db.Close Set db = Nothing End Sub のようなこともできます。 この場合、商品IDはオートナンバー ではないとしています。オートナンバー ならば、商品IDの部分はコメントアウト するか削除してください。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

コードの中で商品IDをIDとしています。 取り込みCSVや商品TBLでは商品IDに なっていると思いますので、 >rst.FindFirst "ID = " & rs!ID としていますが、 IDを商品IDとしてください。 >rst.FindFirst "商品ID = " & rs!商品ID

matupo
質問者

お礼

お付き合い頂き誠に有難う御座います 下記変更いたしました rst.FindFirst "商品ID = " & rs!商品ID しかしながら、こちらの環境では コマンドボタンをクリックした結果として 商品TBLが以下のように時価がすべて25になります 商品ID 商品名 単価 時価 1 さば 50 25 2 あじ 100 25 3 いわし 30 25 4 鯛 70 25 5 いか 20 25 取り込む参照元の取り込みCSVは以下になります 商品ID 商品名 単価 時価 5 いか 20 25 2 あじ 100 98 3 いわし 30 40 1 さば 50 55 6 マグロ 200 210 商品IDがしっかり認識されていないようです ためしに 商品TBL 取り込みCSV の商品IDと時価のデータ型を整数や文字列に 変えても旨く行きませんでした。 なんとか成し遂げたいのですが、自分で調べても なかなか旨く行きません、 なにか方法はありますか?

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

説明と訂正が前後してすみません。 提案したコードは取り込み.CSVを テーブルとしてリンクして行う 方法です。 したがって、 >Set rs = db.OpenRecordset("C:\test\取り込み.CSV") ではなく、こちらで提示したコードのままで 実行してください。 リンクの仕方は、データベースウインドウ を表示したままで、 (1)ツールバーのファイルから、  外部データの取り込み→テーブルのリンク (2)取り込み.CSVが置いてあるフォルダを 表示。 (3)ファイルの種類はテキストを選択。 (4)取り込み.CSVをクリック (5)テキストリンクウィザードが起動 (6)区切り記号つきを選択 (6)カンマ選択 先頭行をフィールド名として使う  にチェック (7)次に進みIDの選択確認 (8)リンク終了のメッセージ確認 以上で取り込み.CSVがテーブルとして リンクされます。 このりんくされた取り込み.CSV を使用します。 もちろん、こんほかにも方法が ありますが、この方法で一度 確認してください。

matupo
質問者

お礼

ご返信有難う御座います。 取り込み.CSVをテーブルとして リンクできましたが コマンドボタンを押しても 商品TBLの時価の列に何も追加できません 下記コードを記述しています Private Sub コマンド0_Click() Dim db As Database Dim rs As Recordset Dim rst As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("取り込みCSV") Set rst = db.OpenRecordset("商品TBL", dbOpenDynaset) rs.MoveFirst Do Until rs.EOF On Error Resume Next rst.FindFirst "ID = " & rs!ID Do Until rst.EOF If rst.NoMatch Then Exit Do Else rst.Edit rst!時価 = rs!時価 rst.Update End If rst.MoveNext Loop rs.MoveNext Loop rs.Close Set rs = Nothing rst.Close Set rst = Nothing db.Close Set db = Nothing End Sub

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

訂正です。 コードの最初の、 Dim strSQL As String strSQL = "SELECT 取り込みCSV.ID, 取り込みCSV.時価 FROM 取り込みCSV" の二行は使用していないのでコメントアウトするか、 削除してください。

matupo
質問者

お礼

piroin654様 アドバイス有難う御座います、 書き込み頂いたように行っているのですが旨く行きません。 こちらで行った事を書きます "c:\test"フォルダに 取り込み.CSV 時価取り込み.mdb があります、 時価取り込み.mdbの中でフォームを作り コマンドボタンを作成して 掲載して頂いたコードを入力しました Microsoft DAO3.6 Objectにはチェックは入っています。 しかしコマンドボタンを押しても何も反応はありません、 取り込み.CSVのパス指定が旨く行っていないのでしょうか? なにかエラーを追いかける方法はありますか? お忙しいとは存じますが いま少しお付き合いを頂ければ幸いです。

matupo
質問者

補足

念のため エラー内容とコードを書いておきます。 実行時エラー'3078' 入力テーブルまたはクリエ'C:\test\取り込み.CSV'が見つかりませんでした。 Private Sub コマンド0_Click() Dim db As Database Dim rs As Recordset Dim rst As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("C:\test\取り込み.CSV") Set rst = db.OpenRecordset("商品TBL", dbOpenDynaset) rs.MoveFirst Do Until rs.EOF On Error Resume Next rst.FindFirst "ID = " & rs!ID Do Until rst.EOF If rst.NoMatch Then Exit Do Else rst.Edit rst!時価 = rs!時価 rst.Update End If rst.MoveNext Loop rs.MoveNext Loop rs.Close Set rs = Nothing rst.Close Set rst = Nothing db.Close Set db = Nothing End Sub

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

いろいろな方法がありますが、一つの案として 以下のような方法があります。 対象となっているCSVをAccessファイルにリンク させます。見出しは必要です。 以下のコードを標準モジュールに 貼り付けて確認してください。 ボタンのクリック時のイベントに 呼び出してもいいです。 DAOなので参照設定でDAOにチェックを いれてください。 Sub func時価更新() Dim db As Database Dim rs As Recordset Dim rst As Recordset Dim strSQL As String strSQL = "SELECT 取り込みCSV.ID, 取り込みCSV.時価 FROM 取り込みCSV" Set db = CurrentDb Set rs = db.OpenRecordset("取り込みCSV") Set rst = db.OpenRecordset("商品TBL", dbOpenDynaset) rs.MoveFirst Do Until rs.EOF On Error Resume Next rst.FindFirst "ID = " & rs!ID Do Until rst.EOF If rst.NoMatch Then Exit Do Else rst.Edit rst!時価 = rs!時価 rst.Update End If rst.MoveNext Loop rs.MoveNext Loop rs.Close Set rs = Nothing rst.Close Set rst = Nothing db.Close Set db = Nothing End Sub

関連するQ&A