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

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

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

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

Access

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

Q&A

解決済

1回答

5938閲覧

ACCESSのフォームでレコードを登録する際に、テキストボックスが空白の場合は登録しない方法

YISS

総合スコア14

VBA

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

Access

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

0グッド

0クリップ

投稿2020/11/10 03:25

編集2020/11/13 09:26

Accessにて、データベースにレコードを登録するフォームを作成しています。

テキストボックスに入力した情報を登録するところまではできたのですが、
下記の2点をクリアするにはどうしたらよろしいでしょうか?

 ◎テキストのボックスの値が全て空白だった場合は、無動作
⇒下記コードにて、できるようになりました!
ありがとうございます。

 ◎テキストボックスの入力項目で、全ての項目が埋まっていなくてもエラーが出ず登録される
⇒3か所だけ、テキストボックスに文字を入力しても、無動作になってしまいます。原因がわかりません。

コード

Private Sub brn_regi_Click() Dim Rst As DAO.Recordset Set Rst = CurrentDb.OpenRecordset("PartsList2", dbOpenTable) Dim fld As Variant Dim NotNull As Boolean For Each fld In Rst.Fields If fld.Name <> "ID" Then If Nz(Me(fld.Name).Value) <> "" Then NotNull = True Exit For End If End If Next If NotNull = False Then GoTo Exit_Sub Rst.AddNew For Each fld In Rst.Fields If fld.Name <> "ID" Then fld.Value = Me(fld.Name).Value Me(fld.Name).Value = Null End If Next Rst.Update MsgBox "登録が完了しました" Exit_Sub: Rst.Close Set Rst = Nothing Dim cl As Control On Error Resume Next For Each cl In Me.Controls With cl If .ControlType = acTextBox Then .Value = Null End If End With Next cl End Sub

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

◎テキストのボックスの値が全て空白だった場合は、無動作

vba

1Private Sub brn_regi_Click() 2 If Nz(Me!txUse_Place)="" And Nz(Me!txClass_1)="" And Nz(Me!txClass_2)="" And Nz(Me!txPartsName_D)="" Then 3 Exit Sub 4 End If 5 6 '以下略

◎テキストボックスの入力項目で、全ての項目が埋まっていなくてもエラーが出ず登録される

数値型のフィールドに ""(空文字列)を入力しようとしているのが原因です。
下記のコードでテキストボックスに""を代入せずに、Nullを代入しましょう。

vba

1 For Each cl In Me.Controls 2 With cl 3 If .ControlType = acTextBox Then 4 '.Value = "" 下記に修正 5 .Value = Null 6 End If 7 End With 8 Next cl

追記 フィールド数が多い場合のコードの簡潔化

テーブルのフィールド名とフォーム上のテキストボックス名は同じにしておく。
(テーブルからウィザードで作成すると自動で同じ名前にしてくれるので楽、その後、コントロールソースとレコードソースを削除)

一応、「ID」フィールドはオートナンバー型のフィールドと仮定してスルーするようにしてありますが、実際のテーブルに合わせてください。

vba

1Private Sub brn_regi_Click() 2 Dim Rst As DAO.Recordset 3 Set Rst = CurrentDb.OpenRecordset("T_Data", dbOpenTable) 4 5 Dim fld As Variant, NotNull As Boolean 6 For Each fld In Rst.Fields 7 If fld.Name <> "ID" Then 8 If Nz(Me(fld.Name).Value) <> "" Then 9 NotNull = True 10 Exit For 11 End If 12 End If 13 Next 14 If NotNull = False Then GoTo Exit_Sub 15 16 Rst.AddNew 17 For Each fld In Rst.Fields 18 If fld.Name <> "ID" Then 19 fld.Value = Me(fld.Name).Value 20 Me(fld.Name).Value = Null 21 End If 22 Next 23 Rst.Update 24 MsgBox "登録が完了しました" 25 26Exit_Sub: 27 Rst.Close 28 Set Rst = Nothing 29End Sub

投稿2020/11/10 03:38

編集2020/11/11 01:18
hatena19

総合スコア34075

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

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

YISS

2020/11/10 04:09

◎テキストのボックスの値が全て空白だった場合は、無動作 ⇒長くなってしまうので、コードを一部省略して記載したのですが、   フィールドが全部で22項目あります。   教えて頂いたコードに当てはめると、かなり長くなってしまうのですが、   何か完結に書く方法など無いでしょうか? ◎テキストボックスの入力項目で、全ての項目が埋まっていなくてもエラーが出ず登録される  ⇒データは、数値型です。   フィールドの情報と、エラーの画像を質問欄に追記しました。
hatena19

2020/11/10 04:18

連結フォームにすれば、 DoCmd.RunCommand acCmdSaveRecord と1行ですみ一番完結になりますが、連結フォームを使わない理由はなんでしょうか。 連結フォームだと勝手に登録されてしまうということであれば、下記の方法で保存ボタンのみで保存できるようにもできます。 レコード入力時に「保存」コマンドボタンでのみレコード保存できるようにする https://hatenachips.blog.fc2.com/blog-entry-162.html
YISS

2020/11/13 08:33

返信遅くなり申し訳ありません。 そして、何度も回答頂きありがとうございます。 教えて頂いたコードで修正中なのですが、エラーがでてきてきますので、 現在自分で原因調査中です。 新しく出たエラーコードを、投稿しておきますので、 もし、お分かりでしたら、教えて頂けると助かります。
hatena19

2020/11/13 08:41

数値型フィールドに対するデータ型のエラーなので、数値でないものを代入してませんか。 例えば、123,245 とカンマで桁区切りしているとか、\123 とか 123円 などと単位を付けているとか。
YISS

2020/11/13 08:48

◎テキストのボックスの値が全て空白だった場合は、無動作 ⇒この動作確認を行いたく、テキストボックスは全て未入力の状態で登録ボタンを押しています
hatena19

2020/11/13 08:56

エラーが出たとき、[デバッグ]ボタンを押して、イミディエイトウィンドウで、 ?fld.Name と入力してEnterキーを押したらどうなりますか。 テーブルのフィールド名が表示されますか。 もし、表示されたら、そのフィールド名で、 ?Me("フィールド名").Value と入力してEnterキーを押したらどうなりますか。
YISS

2020/11/13 09:03

フィールド名が出てきたので、?Me("フィールド名").Valueを入力。 下記のエラーコードが出てきます。 実行時エラー”438”: オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ちなみにそのフィールドは、数値型です。
YISS

2020/11/13 09:08

すみません。該当箇所ですが、先にラベル名=テーブルのフィールド名になっていた為、テーブルのフィールド名=フォーム上のテキストボックス名になっていませんでした。 修正して再トライしてみます。
YISS

2020/11/13 09:24

先ほどの件ですが、該当箇所を テーブルのフィールド名=フォーム上のテキストボックス名 に修正したところ、エラーメッセージの問題は解消されました。 ただ、テキストボックスが25ヵ所あるのですが、その内3つだけ、 文字を入力しても無動作になります。 何が原因かわかりますでしょうか?
hatena19

2020/11/14 00:16

ステップ実行で該当コードの式の値がどうなっているか確認してください。 コード自体には問題がないはずですので(こちらのサンプルで確認済み)どこかに間違いがあるはずです。 ここまでくるとデバッグ作業の領域ですので、実物のファイルがないこちらからではアドバイスは難しいです。
YISS

2020/11/15 04:25

検証して、無事解決できました。 何度もありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問