- ベストアンサー
CSVからテーブルへの時価追加方法
- CSVからテーブルに時価を追加する方法を教えてください。
- 商品TBLの時価に取り込みCSVの情報を追加する仕組みを作りたいです。具体的な方法をご教示ください。
- 商品TBLと取り込みCSVの商品IDを比較して、同じであれば取り込みCSVの時価の値を商品TBLの時価列に追加する方法を教えてください。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
データの並びを見落としていました。 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
その他の回答 (8)
- piroin654
- ベストアンサー率75% (692/917)
コード中の On Error Resume Next はコメントアウトしておいてもいいです。 フィールドの設定など間違った場合に 「このコレクションには項目がありません」 というようなエラーを出すので、エラーが 出ずに何も起こらないということが防げます。 動きは正常であるが、どうしてもエラー メッセージが出るという場合 などに使います。滅多にありませんが。
- piroin654
- ベストアンサー率75% (692/917)
>商品TBLに無い商品IDが取り込みCSVに >あったばあい商品TBLに追加させる事は >出来ますでしょうか? タッチの差で出しておきました。
- piroin654
- ベストアンサー率75% (692/917)
いらないものが入っていました。 Dim strSQL As String strSQL = "SELECT 取り込みCSV.ID, 取り込みCSV.時価 FROM 取り込みCSV" 使っていないのでコメントアウトか削除してください。
- piroin654
- ベストアンサー率75% (692/917)
またまた、商品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)
コードの中で商品IDをIDとしています。 取り込みCSVや商品TBLでは商品IDに なっていると思いますので、 >rst.FindFirst "ID = " & rs!ID としていますが、 IDを商品IDとしてください。 >rst.FindFirst "商品ID = " & rs!商品ID
お礼
お付き合い頂き誠に有難う御座います 下記変更いたしました 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)
説明と訂正が前後してすみません。 提案したコードは取り込み.CSVを テーブルとしてリンクして行う 方法です。 したがって、 >Set rs = db.OpenRecordset("C:\test\取り込み.CSV") ではなく、こちらで提示したコードのままで 実行してください。 リンクの仕方は、データベースウインドウ を表示したままで、 (1)ツールバーのファイルから、 外部データの取り込み→テーブルのリンク (2)取り込み.CSVが置いてあるフォルダを 表示。 (3)ファイルの種類はテキストを選択。 (4)取り込み.CSVをクリック (5)テキストリンクウィザードが起動 (6)区切り記号つきを選択 (6)カンマ選択 先頭行をフィールド名として使う にチェック (7)次に進みIDの選択確認 (8)リンク終了のメッセージ確認 以上で取り込み.CSVがテーブルとして リンクされます。 このりんくされた取り込み.CSV を使用します。 もちろん、こんほかにも方法が ありますが、この方法で一度 確認してください。
お礼
ご返信有難う御座います。 取り込み.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)
訂正です。 コードの最初の、 Dim strSQL As String strSQL = "SELECT 取り込みCSV.ID, 取り込みCSV.時価 FROM 取り込みCSV" の二行は使用していないのでコメントアウトするか、 削除してください。
お礼
piroin654様 アドバイス有難う御座います、 書き込み頂いたように行っているのですが旨く行きません。 こちらで行った事を書きます "c:\test"フォルダに 取り込み.CSV 時価取り込み.mdb があります、 時価取り込み.mdbの中でフォームを作り コマンドボタンを作成して 掲載して頂いたコードを入力しました Microsoft DAO3.6 Objectにはチェックは入っています。 しかしコマンドボタンを押しても何も反応はありません、 取り込み.CSVのパス指定が旨く行っていないのでしょうか? なにかエラーを追いかける方法はありますか? お忙しいとは存じますが いま少しお付き合いを頂ければ幸いです。
補足
念のため エラー内容とコードを書いておきます。 実行時エラー'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)
いろいろな方法がありますが、一つの案として 以下のような方法があります。 対象となっている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
お礼
piroin654様 出来ました!! 長時間お付き合い頂き有難う御座います、 大変感謝いたします。 少し図々しい質問なのですが 商品TBLに無い商品IDが取り込みCSVに あったばあい商品TBLに追加させる事は 出来ますでしょうか? もしお時間が無いのなら別スレを立てて質問を 行いたいと思います。 とりあえずやりたい事を教えて頂き 有難う御座いました。