質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

15906閲覧

Accessでテーブルのレコードを参照し、レコードが存在したら上書き、なければ追加したい。

toshi-104

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/03/10 06:52

編集2020/03/10 08:50

**「出庫データ」というテーブルをもとに、「納品データ」**というテーブルに出たを書き込みたいと思っています。

現在はキーが重複するレコードがあればエラーになります。
これを以下のキーで照合し、重複する場合は上書きし、なければ追加するようにしたいです。

出庫日・販売先ID・商品ID・取引形態ID

また、納品番号については、追加の際はキーが同じほかのレコードと同一のものにしたいと思っております。

現在、キーが重複しているレコードが上書きできず、「.Update」のところで躓きます。

現在の処理(コード)

VBA

1 2 On Error GoTo 納品データ作成_Click_Err 3 4 Dim dNumber As Integer 5 Dim oDate As Integer 6 Dim strSQL As String 7 Dim Rs As Recordset 8 Dim Rst As DAO.Recordset 9 Set Rst = CurrentDb.OpenRecordset("50_納品データ", dbOpenTable) 10 Set Rsd = CurrentDb.OpenRecordset("50_納品データ", dbOpenDynaset) 11 Set Fms = Me.Form.Recordset 12 13 oDate = Format(Me!出庫日, "yymm") 14 15 strSQL = "SELECT * FROM 50_納品データ WHERE 年月 LIKE " & oDate & ";" 16 Set Rs = CurrentDb.OpenRecordset(strSQL) 17 If DCount("納品番号", "50_納品データ") = 0 Then 18 dNumber = "1" 19 Else 20 If Rs.BOF = True And Rs.EOF = True Then 21 dNumber = "1" 22 Else 23 dNumber = Format(DMax("納品番号", "50_納品データ") + 1) 24 End If 25 End If 26 27 If IsNull(Me.[商品ID]) Then 28 DoCmd.RunCommand acCmdUndo 29 End If 30 DoCmd.GoToRecord , , acFirst 31 countRst = 0 32 Do Until Fms.EOF 33 With Rst 34 Rsd.FindFirst "[商品ID] like '" & Me.[商品ID] & "*' and [販売先ID] like '" & Me.[販売先ID] & "*' and [出庫日] like '" & Me.[出庫日] & "*' and [取引形態ID] like '" & Me.[取引形態ID] & "*'" 35 If Rst.NoMatch = False Then 36 .AddNew 37 Else 38 .Edit 39 End If 40 .Fields("納品番号") = dNumber 41 .Fields("出庫日") = Me!出庫日 42 .Fields("年月") = Format(Me!出庫日, "yymm") 43 .Fields("販売先ID") = Me!販売先ID 44 .Fields("販売先名") = Me!販売先呼称 45 .Fields("商品ID") = Me!商品ID 46 .Fields("商品名") = Me!商品名 47 .Fields("規格") = Me!量目 & Me!単位 48 .Fields("出庫数量") = Me!出庫数量 49 .Fields("取引形態ID") = Me!取引形態ID 50 .Fields("取引形態名") = Me!形態名称 51 .Fields("販売単価") = Me!販売単価 52 .Fields("販売手数料") = Me!販売手数料 53 .Fields("小計") = Me!式1 54 .Fields("備考") = Me!備考 55 .Fields("請求FLG") = Me!請求FLG 56 .Update 57 End With 58 countRst = countRst + 1 59 Me.Recordset.MoveNext 60 Loop 61 Rst.Close 62 Set Rst = Nothing 63 If countRst = 0 Then 64 MsgBox "対象の納品データがありません" 65 Else 66 MsgBox "納品データを作成しました" 67 Me.Recalc 68 End If 69 70納品データ作成_Click_Exit: 71 Exit Sub 72 73納品データ作成_Click_Err: 74 75 MsgBox "作成しようとしている納品データは既に存在します", vbOKOnly + vbExclamation 76 Resume 納品データ作成_Click_Exit 77 78End Sub 79

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/03/10 07:46 編集

今のコードと要件だけ出すというのは、コードを代わりに作成してという事ですか? もしそうなら、好まれない質問ですから、 ご自身が行われてどのようなところで躓いているのかを示した方が良いですね。
toshi-104

2020/03/10 08:53

申し訳ございませんでした。 ご指摘ありがとうございます。 躓いた部分を削除してしまっていたので、もう一度再現し、その部分を追加しました。 Set Rsd = CurrentDb.OpenRecordset("50_納品データ", dbOpenDynaset) ・ ・ With Rst Rsd.FindFirst "[商品ID] like '" & Me.[商品ID] & "*' and [販売先ID] like '" & Me.[販売先ID] & "*' and [出庫日] like '" & Me.[出庫日] & "*' and [取引形態ID] like '" & Me.[取引形態ID] & "*'" If Rst.NoMatch = False Then .AddNew Else .Edit End If ・ ・ 以後気を付けます。 何とか自力解決できるよう頑張ってみます。
guest

回答1

0

ベストアンサー

ざっと見た感じでは、下記があきらかな間違いですね。

vba

1 With Rst 2 Rsd.FindFirst "・・・" 3 If Rst.NoMatch = False Then 4 .AddNew 5 Else 6 .Edit 7 End If

正しくは、

vba

1 With Rst 2 Rsd.FindFirst "・・・" 3 If Rsd.NoMatch = True Then 4 .AddNew 5 Else 6 .Edit 7 End If

Rsd.FindFirst で検索したのなら、Rsd.NoMatch で存在チェックしないとダメです。
また、Rsd.NoMatch = True で存在しないということなので、このときに .AddNew しないとダメです。

変数宣言が抜けていたり、非常に読みづらいコードなので精査はしてません。
自分なら、下記の方法で、SQL一発で更新追加します。

クエリで2つのテーブルを同期させる - hatena chips

投稿2020/03/10 12:51

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshi-104

2020/03/11 00:34

更新クエリの利用で完成に近づきました!! あとは退避してないれーコードの削除・・・の実現に向けて頑張ってみます。 読みづらいコード・・・改善に向けて頑張ります♪ ありがとうございましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問