みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBA null判定

Accessでテキストボックスの値をテーブルへ書き込むVBAを作成しているのですが、Null判定がうまくいきません。

◎環境
OS:Windows7Pro
Var:Access2010
DB:MySQL5.6

Private Sub cmdSubmit_Click()
Dim Rst As DAO.Recordset
Dim ErrT As String

Set Rst = CurrentDb.OpenRecordset("m_plan", dbOpenDynaset)

'各テキストボックス、Null判定
If IsNull(txtPid) Then
MsgBox "プランID[" & txtPid & "]が未入力です"
Call txtCrer
Exit Sub
End If
If IsNull(txtPName) Then
MsgBox "プラン名が未入力です"
Call txtCrer
Exit Sub
End If
If IsNull(txtPsdate) Then
Me!txtPsdate = #01/01/2010#
End If
If IsNull(Me!txtPedate) Then
Me!txtPedate = #01/01/2010#
End If

Debug.Print "プランID["; Me.txtPid & "]"
Debug.Print "プラン名[" & Me!txtPName & "]"
Debug.Print "開始日[" & Me!txtPsdate & "]"
Debug.Print "終了日[" & Me!txtPedate & "]"
↑↑↑↑↑↑↑↑↑
ここで、Null判定を行ってますが、データがあるにも関わらず、処理が続行されたり、Null判定結果が起動するたびに変わります。

On Error GoTo err
With Rst
.MoveLast
.AddNew
.Fields("PlanID") = Me!txtPid
.Fields("PlanName") = Me!txtPName
.Fields("PlanSt") = CDate(Me!txtPsdate)
.Fields("PlanEn") = CDate(Me!txtPedate)
.Fields("P_Remaks") = Me!txtPbikou
.Update
End With
Rst.Close
Set Rst = Nothing

err:
MsgBox "DBエラー"
Debug.Print Rst.Type
Debug.Print err.Description
Call txtCrer
End Sub

ただし、下記判定だけのボタンとプロシージャーでは、正常に判定されます。
判定だけの、プロシージャー
'Null判定テスト
Private Sub cmdtest_Click()

If IsNull(txtPid) Then
Debug.Print "[" & txtPid & "]" & "Nullです。"
Else
Debug.Print "[" & txtPid & "]" & "Not Nullです。"
End If
If IsNull(txtPName) Then
Debug.Print "[" & txtPName & "]" & "Nullです。"
Else
Debug.Print "[" & txtPName & "]" & "Not Nullです。"
End If
If IsNull(txtPsdate) Then
Debug.Print "[" & txtPsdate & "]" & "Nullです。"
Else
Debug.Print "[" & txtPsdate & "]" & "Not Nullです。"
End If
Debug.Print "==============================="
End Sub
どこが間違っているかまったくわかりません、アドバイスを頂けましたら幸いです。

投稿日時 - 2015-02-03 11:16:36

QNo.8910147

すぐに回答ほしいです

質問者が選んだベストアンサー

> どうやら、2010から、テキストボックスのNullの扱いが変わったようです。

えっ、そうなんですか。当方、Access2010で今まで IsNull で判定を行ってきましたが、問題になったことはないです。
確認するために、サンプルを作成して実験してみましたが、"" が入るという現象は再現できませんでした。
ファイル形式は、Accdb と MDB で試してみましたが、どちらもフォームを開いた直後は Null でした。

環境依存の問題なのかな。それとも、旧バージョンのファイルからアップデートしたらでるのだろうか。

ちなみにテストした環境は、
Windows8.1 64bit
Access2010 32bit

複数の同じ症状と報告があるということは、
IsNullを、Nz([フィールド],"")="" に変更したほうがよさそうですね。

投稿日時 - 2015-02-03 18:20:42

お礼

hatena1989様

そうですか、2010使ってこられた方でも、この症状は初めてなんですね?
なぜ、今回発生しているのかまったくわかりませんが、他でも発生している症状のようなので、あきらめます。

親切に、アドバイス頂きありがとうございました。

投稿日時 - 2015-02-03 20:49:20

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

テキストボックスが非連結なら開いた直後はNullのはずです。
ただし、「規定値」プロパティが設定してあればその値になります。

非連結(コントロールソースに何も設定していない)で、規定値も何も設定してないのであれば、Null のはずです。

開く時、読み込み時、アクティブ時、レコード移動時などでテキストボックスに代入するようなマクロやVBAは設定してないですか。

Null判定に失敗した時、

Debug.Print "プランID["; Me.txtPid & "]"
Debug.Print "プラン名[" & Me!txtPName & "]"
Debug.Print "開始日[" & Me!txtPsdate & "]"
Debug.Print "終了日[" & Me!txtPedate & "]"

によるイミディエイトの出力はどうなってますか。

投稿日時 - 2015-02-03 14:10:26

お礼

hatena1989様

たびたびの回答有難うございます。

>開く時、読み込み時、アクティブ時、レコード移動時などでテキストボックスに代入するようなマクロやVBAは設定してないですか。
フォームを開くときにDB接続は確認してますが、他はデータ登録用のプロジージャ(上のソース)と、データをすべてクリアするプロジージャーは何もありません。

Null判定に失敗した時、
すべての値が[]です。

自分なりに調べていたら、下記サイトを発見しました。
どうやら、2010から、テキストボックスのNullの扱いが変わったようです。
Access2010でテキストボックスにnullを設定する方法
http://t-yumi.jp/gengo/access/20110606100120.html

Access2010でテキストボックスを使う場合、Null値は要注意
http://infith.com/system/access/access2010_textbox_null/

2010からの仕様らしいですが、なんかすっきりしません。
仕様なら、通ったり通らなかったりするのだけは辞めてほしいです。。。

投稿日時 - 2015-02-03 17:40:03

ANo.1

各テキストボックスは非連結ですか、連結ですか。
連結の場合、連結しているフィールドの「値要求」「空文字列の許可」の設定はどうなってますか。
設定によっては、Null ではなく 空文字列("")が格納される場合もあります。

Null と 空文字列 は見た目では区別がつきません。また、半角空白や全角空白が入っていないか確認してますか。

非連結でも通常は未入力はNullですが、VBAやマクロで""を代入するとNullではなくなります。

そのあたりをまずは確認してください。

Null、空文字列、スペースが混在する可能性があるなら、下記でチェックしてください。

If Trim(Nz(Me.txtPid,"")) Then

本来はそういうことがないように設計するべきですが。

投稿日時 - 2015-02-03 12:00:54

お礼

hatena1989様
回答ありがとうございます。

テキストボックスは、非連結です。
フォームを開いた直後から、判定が成功したり失敗したりいたします、フォームを開いたばかりですので、本来テキストボックスには[””]も入力されていないのではかと、考えておりました。

>If Trim(Nz(Me.txtPid,"")) Then
Debug.prinntoの結果から、空白文字は入ってません。
””、Nullのどちらかだと思います。

>本来はそういうことがないように設計するべきですが。
現在勉強中のため、プロの方のご意見、非常に参考になりました。
ありがとうございます。

ちなみに、当初の判定は,「if テキストボックス = "" then」としておりましたが、いろんなサイトを見ていると、Null判定は、ISNull(テキストボックス)と記載がありましたので、変更しました。

ただ、フォームを開いたばかりの、テキストボックスにNull以外の””文字が入っているとなると、Nullと””で判定をしないといけないのではと考えております。

上記の2つの判定を簡潔に書く方法をアドバイス頂けましたら幸いです。

投稿日時 - 2015-02-03 13:38:32

あなたにオススメの質問