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

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

詳細はこちら
VBA

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

Access

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

Q&A

2回答

1448閲覧

Access レコード 新規作成エラー

Yoshikun_0945

総合スコア224

VBA

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

Access

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

0グッド

0クリップ

投稿2019/09/13 05:15

編集2019/09/13 05:30

前提・実現したいこと

AccessのFormに設置しているテキストボックスにてカレンダーから日付を選択した際に、
日付データをテーブルのレコードに登録(レコードを新規作成)するコードを記述しました。

発生している問題・エラーメッセージ

日付カレンダーにて日付を設定した直後にプログラムを実行したら、
テキストボックスに表示されている日付データがNullとして判定されているようです。
どのように修正すればよろしいでしょうか?

該当のソースコード

Private Sub Tx仕入日_Change() 'レコードを作成する Set rs = db.OpenRecordset("T01-1_仕入登録", dbOpenTable) rs.AddNew rs.Fields("仕入日") = Me!Tx仕入日 rs.Update rs.Close Set rs = Nothing End Sub ###追加情報 ①:Formにつきましては、Formレコードソースに『T01-1_仕入登録』というテーブルを設定しております。 ②:Tx仕入日につきましては、書式を『日付(S)』にしており、日付カレンダーの表示を『日付』にしております。 ③:Tx仕入日につきましては、テーブルのフィールドとは非連結の状態としております。

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

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

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

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

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

coco_bauer

2019/09/13 05:27

「日付カレンダーにて」の"日付カレンダー"は何ですか? Accessのファイル? Accesssに組み込んであるマクロ(VBA)? Accessを使ったアプリケーション? 質問者以外の人が容易に理解・想像できない語は、何であるかを説明してから使ってください。 「テキストボックスに表示されている日付データ」というのは、質問のコードの中では何にあたりますか?
Yoshikun_0945

2019/09/13 07:19

日付カレンダーというのは、Accessの日付選択カレンダーのことですが、おわかりでしょうか? エラーが発生しているのは、 『rs.Fields("仕入日") = Me!Tx仕入日』のところです。 ここで、Me!Tx仕入日には、日付選択カレンダーで日付を選択したため、画面には選択した日付が表示されているのですが、プログラム上では、Nullとなっているようです。
guest

回答2

0

フォームは連結フォームですか、非連結フォームですか。
日付カレンダーは、Accessのテキストボックスの標準の機能のものですか。

それによって回答が異なりますので、質問に追記してください。

とりあえずは、設定するイベントは Changeイベントではないことは確かです。

追記

上記の情報提供がないので、
非連結フォームとして回答します。
連結フォームなら、OpenRecordsetする必要はないので。

まず、
コードは、テキストボックスのChangeイベントではなく、AfterUpdateイベントに移動してください。
Changeイベントだと一文字入力しり削除しただけでも発生してしまいます。一文字入力するたびに新規レコードが追加されたら困りますよね。また、日付選択カレンダーから日付を入力した場合は、Changeイベントは発生しません。これは仕様です。

『T01-1_仕入登録』テーブルの「仕入日」フィールドのデータ型が日付/時刻型だとしたら、下記に変更してください。

vba

1If IsDate(Me!Tx仕入日.Value) Then 2 rs.AddNew 3 rs.Fields("仕入日").Value = Me!Tx仕入日.Value 4 rs.UpDate 5End If

テキストとして # で囲むのはVBA上でSQLを扱うときの文法です。
DAOのレコードセットのフィールドに代入する場合は、日付/時刻型で代入すればOKです。

ただし、非連結フォームの場合としても、一つのフィールドを入力しただけで、テーブルに追加するのは設計としてまずいと思います。すべてのフィールドを入力した後に、整合性をチェックしてテーブルに追加するというので非連結フォームのメリットを活かした設計と言えます。

失礼ながら、質問内容から、非連結フォームを設計できるスキルレベルではないと推測されます。

投稿2019/09/13 05:23

編集2019/09/13 13:24
hatena19

総合スコア34073

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

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

0

~~以下の様にしてみて下さい。
rs.Fields("仕入日") = "#" & Me!Tx仕入日 & "#"
~~
追記

Null考慮が必要かもしれませんね。
先頭でNullだった場合に追加せずに終了する処理を追記してみてください。

VBA

1if IsNull(Me.Tx仕入日) then exit sub '←ここで出口 2'レコードを作成する 3Set rs = db.OpenRecordset("T01-1_仕入登録", dbOpenTable) 4rs.AddNew 5rs.Fields("仕入日") = Me.Tx仕入日 6rs.Update 7rs.Close 8Set rs = Nothing

投稿2019/09/13 07:27

編集2019/09/14 15:26
sazi

総合スコア25327

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

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

Yoshikun_0945

2019/09/13 07:34 編集

ご回答いただきまして、ありがとうございました。 回答いただいた内容を実行してみましたが、 Tx仕入日がNullのためか、実行時エラー3241 データ型の変換にエラーが発生しました。 というエラーになってしまいました。 どこがエラーなのかさっぱりわかりません。
sazi

2019/09/13 07:33

T01-1_仕入登録の仕入日の型は何ですか?
Yoshikun_0945

2019/09/13 07:37 編集

日付/時刻型にしてあります。
sazi

2019/09/13 07:38

Tx仕入日の書式ではなく、T01-1_仕入登録テーブルの仕入日の型です。
Yoshikun_0945

2019/09/13 07:40

日付/時刻にしてあります。 失礼いたしました。
hatena19

2019/09/14 07:53

日付/時刻型のフィールドに、"#" & Me.Tx仕入日 & "#" を代入したら、下記のエラーになります。 実行時エラー`3421`: データ型の変換エラーが発生しました。 当方のAccessで確認しました。 ベストアンサーを取り消してください。 後から見た人に間違った情報を与えることになります。
sazi

2019/09/14 15:27

@hatena19さん お手数かけまして、すみません。・
hatena19

2019/09/15 00:27

saziさん いえいえ、確認せずにベストアンサーにする質問者さんの問題ですので。 ちょっと、私の回答の言い方がきつかったので質問者さんの気分を害したのかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問