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

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

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

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Q&A

解決済

3回答

5215閲覧

ACCESS テーブルとテキストボックス、NULLの処理はどうするか?

mnbwqz

総合スコア74

Access

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

0グッド

0クリップ

投稿2021/10/29 10:25

編集2021/10/30 07:44

フォームを作っていてわからないことがあります。

フォーム上のテキストボックスAを空白にすると値はNULLとなり、
テキストボックスAの値でテーブルのフィールドB(値は1つのみ)を更新すると、
フィールドの値はNULLになります。

逆に、テーブルのフィールドBの値を削除してNULLにした後、
フィールドBの値をテキストボックスAに代入すると
テキストボックスAの値はNULLになります。

テキストボックスAは他の処理に利用されているのですが、
テキストボックスAの値がNULLだとエラーとなります。
そこで、エラーがでないようにする処理として、
1)フィールドBからテキストボックスAに読み込む際に
フィールドBがNULLの場合、テキストボックスAに
長さ0の文字列を設定するようにするか、
2)テキストボックスAを空白にした場合に、
フィールドBにNULLが設定されないように処理するか、
どちらにすればよいでしょうか。

(追記)
テキストボックスAは連結テキストボックスではありません。
テキストボックスAがNULLだとエラーになる処理は
「文字表示」プロシージャの引数として textboxA を指定した場合、
「文字表示」プロシージャに処理が移る前に、
「実行時エラー94 Nullの使い方が不正です。」
と表示されて、プログラムが止まります。

Private Sub 文字表示(表示文字 As String)
MsgBox (表示文字)
End Sub

tableC

項目名備考
10月分
11月分延期
  1. textboxA = DLookup("備考", "tableC", "項目名='10月分'")

  2. textboxA内の文字を全部消します。

その後、クエリにて
UPDATE tableC SET 備考=textboxA WHERE 項目名 IN ('10月分');
で、データを書き込みます。

(10/30 16:43 追記)
皆様ご解答ありがとうございます。
NULL対処の方法が分かりました。(NZ関数使用・Variant型使用)
textboxAとtableCからはNULLが出てくる可能性があり、textboxはA以外にも複数あり、いずれのtextboxも「文字表示」プロシージャを呼び出すので、NULL対処の処理は一行書くだけで済むよう、「文字表示」プロシージャの引数をVariant型にしようと思っています。
プログラムの基本からするとこの対処法が望ましい、というのはありますでしょうか。よろしくお願いします。

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

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

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

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

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

hatena19

2021/10/29 12:41

フォームは連結フォームですか。 そのテキストボックスAは連結テキストボックスですか。 テキストボックスAの値がNULLだとエラーになる処理は具体的にどのような処理ですか。VBAならエラーが出るコードを提示してください。 「1)フィールドBからテキストボックスAに読み込む」とは具体的にどのようなことをしてますか。コードならそれを提示ください。 「2)テキストボックスAを空白にした場合」についても処理を具体的に説明ください。コードも提示ください。
hatena19

2021/10/30 05:36

質問は編集できますので、そちらに追記してください。
guest

回答3

0

VBAの場合NUllが許されるのはVariant型です。(テキストボックスなどもある意味Variant型です)
(Nullでない場合に値によって内部的に型が決まります)
一方テーブルの型にはVariant型はなく、Nullを許可しない設定にしない限り、全ての型にNullはあり得ます。
※NotNullの指定をしていたとしても、SQLでouter joinするとNullは返却されますから、データとしてはNullがあり得る事を前提として考えるべきですが。

ですので、Nullがあり得る場合の対応としては、以下の併用ですね。
・Variant型を使用する
NullはNullのままです。便利な分明示的な型よりは低速です。
・Null判定を行う
最も簡潔になるのがNz()

こういったVBAの型とデータの隙間を埋めてくれる便利な関数としてNZ関数があります。
Nullの判定と、値がNullの場合に返却する値を指定する事ができるので、Null判定処理をコンパクトに纏める事が出来ます。
※返却値を省略した場合はコードの内容から自動的な変換もするので、理解して使用する分には便利です。

プログラムの基本からするとこの対処法が望ましい

「理解した上で、臨機応変に」というのが望ましい事だと思います。

以下の組合せはどちらもエラーにはなりません。

VBA

1Private Sub 文字表示(表示文字 As String) 2 3文字表示(Nz(textboxA)) 4'''' 5Private Sub 文字表示(表示文字 As Variant) 6 7文字表示(textboxA)

投稿2021/10/30 07:22

編集2021/10/30 12:14
sazi

総合スコア25195

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

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

mnbwqz

2021/10/31 08:56

VBAの型と、テキストボックスなどのコントロール類・SQLのデータ型との違いについて説明頂きありがとうございます。このような細かい違いは、VBA・SQLの本を読んだ際に記憶に残らなかったので(記載がなかったかも知れません)、大変参考になりました。
guest

0

ベストアンサー

テキストボックスAがNULLだとエラーになる処理は

「文字表示」プロシージャの引数として textboxA を指定すると、
「実行時エラー94 Nullの使い方が不正です。」
と表示されます。

Nullの時、どのような処理をしたいのか不明ですが、
とりあえず、下記でエラーは出なくなるでしょう。

vba

1Private Sub 文字表示(表示文字 As Variant) 2 If IsNull(表示文字) Then 3 MsgBox "Nullです。" 4 Else 5 MsgBox 表示文字 6 End If 7End Sub

textboxAとtableCからはNULLが出てくる可能性があり、textboxはA以外にも複数あり、いずれのtextboxも「文字表示」プロシージャを呼び出すので、NULL対処の処理は一行書くだけで済むよう、「文字表示」プロシージャの引数をVariantにしようと思っています。

プログラムの基本からするとこの対処法が望ましい、というのはありますでしょうか。よろしくお願いします。

状況によりますが、
VBAコードを記述するときは、Nullが返る可能性がある場合が、変数や引数の宣言の段階でVariant型で宣言するのがいいと思います。
その後、IsNull関数でNullかどうか判断して処理を場合分けします。

NZ関数はNullを0または""に自動変換してくれるのでNullによりエラーを簡単に回避してくれますが、
Nullと0や""では意味が違う場合もあると思いますので、自分はなるべく使わないようにしてます。

クエリ内の式や、コントロールソースの式などで、VBAの関数を使う場合は、Nullを受け付けずエラーを出す関数や式の時はNZ関数をやむを得ず使う場合もあります。

投稿2021/10/30 05:41

編集2021/10/30 07:57
hatena19

総合スコア33715

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

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

mnbwqz

2021/10/30 07:28 編集

ありがとうございます。 引数の部分を 表示文字 As String から 表示文字 As Variant へ変更しました。 見落としていました。 (下記ご指摘を受け、投稿編集)
hatena19

2021/10/30 06:45

引数を 表示文字 As Variant とバリアント型にしてますか。 それでエラーが出るなら、 その呼び出すコードを提示してください。
mnbwqz

2021/10/31 08:56 編集

NZ関数使用・Variant型使用の使い分けについて、考え方を教えていただき、ありがとうございました。大変参考になりました。
guest

0

3)テキストボックスAを他の処理に利用するときにNz関数でNULL退治をする

これが正しいお作法です。

投稿2021/10/29 13:27

iruyas

総合スコア1067

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

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

mnbwqz

2021/10/30 06:40 編集

標準的な方法を教えていただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問