🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

Access

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

Q&A

解決済

2回答

3661閲覧

ACCESS 条件に応じて、レコードを書き換える方法

YISS

総合スコア14

VBA

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

Access

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

0グッド

0クリップ

投稿2020/12/01 07:42

Accessにて、下記の様なデータベースへ登録するフォームを作成しています。

イメージ説明
在庫数以外は、データベースへ連結しているのですが、
在庫数だけは、非連結にしてあります。

【やりたいこと】
登録ボタンを押すと、
データベースの在庫数フィールドに対して、
《入庫》であれば、[データベースの在庫数]+[数量]
《出庫》であれば、[データベースの在庫数]-[数量]
と、レコードが更新されるようにしたいです。
下記のコードを試してみましが、下記の様なエラーメッセージが出てきました。
何が原因になりますでしょうか?

VBA

1 2Private Sub btn_inout_1_Click() 3 4 Dim Rst As DAO.Recordset 5 Set Rst = CurrentDb.OpenRecordset("PartsList", dbOpenTable) 6 7 If MetxtIn_out = "入庫" Then 8 Rst!Stock = Rst! + MetxtIn_out 9 Else 10 Rst!Stock = Rst! - MetxtIn_out 11 End If 12 13 Me.BeforeUpdate = "" 14 DoCmd.RunCommand acCmdSaveRecord 15 Me.BeforeUpdate = "[イベント プロシージャ]" 16 MsgBox "登録が完了しました" 17 18End Sub 19

エラーメッセージ

イメージ説明

ご教授よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まずは入門書で基本から学習しましょう。
テーブルの設計、フォームの使い方、レポートの使い方などの基本を習得しましょう。

連結フォームはテーブルと連結している、つまり、テーブルは既に開いています。OpenRecordsetする必要はありません。

やりたいことは、現在表示されているレコード(カレントレコード)の在庫数(Stockフィールド)を更新したいということですよね。
カレントレコードのフィールドは、Me.フィールド名で参照できます。
ご希望のことは下記のコードで可能です。

vba

1Private Sub btn_inout_1_Click() 2 3 If Me.In_out = "入庫" Then 4 Me.Stock = Me.Stock + Me.非連結テキストボックス名 5 Else 6 Me.Stock = Me.Stock - Me.非連結テキストボックス名 7 End If 8 9 DoCmd.RunCommand acCmdSaveRecord 10 MsgBox "登録が完了しました" 11 12End Sub

蛇足のアドバイス

在庫管理なら、テーブル設計としては、
入出庫履歴テーブルを作成して、入庫、出庫の履歴を逐一保存しておくという設計にすべきだと思います。
現在在庫数は、入出庫履歴テーブルより集計クエリとして計算で求めるようにするのがセオリーです。

現状の在庫数を直接加減する設計だと、入力間違いをしたとき(例えば、数量を一桁間違えた、入庫と出庫を間違えた、、、などいうことはよくありますよね。)、間違いの原因を特定して元に戻すことが困難になります。

投稿2020/12/01 10:47

hatena19

総合スコア34073

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

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

YISS

2020/12/03 07:02

やりたかったことは、まさにこれでした。  >現在表示されているレコード(カレントレコード)の在庫数(Stockフィールド)を更新したい 教えて頂いたコードで在庫数の差し引きができましたが、 アドバイス頂いた様に、集計クエリとして計算した方がよいと考え直し、そちらの方法で無事完成することができました。 クエリで集計した方がよいのか、テーブルで在庫数管理した方がよいのか、迷走しながら作成していたので、大変助かりました。ありがとうございました。
guest

0

一体そのコードは何を元に作成されましたか。
前にも言いましたが、ここは教育サイトではありませんよ。
別な言い方をすれば、適当に作って丸投げしているように見えます。

質問のコードは、レコードセットを更新する基本にすらなっていません。
※レコードセットが何なのかを理解されていません。
「access recordset 更新」あたりで検索すれば参考にするものが見つかります。

VBA

1Rst!Stock = Rst! + MetxtIn_out

上記は全然ダメです。
少なくとも以下だし、updateメッソドなども無いと結果が反映すらされません。

VBA

1Rst!Stock = Rst!Stock + MetxtIn_out

※別にレコードセットじゃなくても、updateするだけの方が簡単です。

投稿2020/12/01 08:54

編集2020/12/01 08:57
sazi

総合スコア25327

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

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

YISS

2020/12/01 10:37

一応、自分なりに色々検索しつつ、以前使用したコードなんかも参考にして、 コードを作成したのですが、見当違いなものを投稿してしまったようで申し訳ありません。 また、調べてみます。
sazi

2020/12/01 12:05

なにもやっていないとは思ってませんよ。 ただ、分からなくなる内容が、基礎学習を行っていないレベルなので、先ずは学習をと申し上げています。 誰でも右か左かも分からない状態というのはありますけど、過去に幾つか質問をされていて、その変遷をみて、その経験が生かされていないと感じます。 分からない状態で、コードを貰っても、結局コピペする状態になって身に付かない事にしかなりません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問