AccessVBAでNULLの判定方法について

このQ&Aのポイント
  • AccessVBAを使用している際に、NULLの判定について分からない点が出てきました。具体的には、データベースから取得したrs.Fields(0)の値がNULLの場合に、エラーを回避する方法がわかりませんでした。
  • これまで以下のようなコードを試しましたが、うまくいきませんでした。 If rs.Fields(0) = Null Then Else 区分 = rs.Fields(0) End If If rs.Fields(0) Is Null Then Else シール = rs.Fields(0) End If
  • NULLをIF文で判定したい場合、具体的にどのような記述を行えばよいのでしょうか。ご教示いただけると幸いです。
回答を見る
  • ベストアンサー

AccessVBA NULLについて

いつもお世話になっております。 AccessVBAでコーディングを始めたのですが、 NULLの判定で分からない点がでてきました。 データベースより If rs.Fields(0) = Null Then Else 区分 = rs.Fields(0) End If この場合、rs.Fields(0)の中身がNULLの場合は rs.Fields(0)のデータを入れるとエラーになるので ELSEで逃がしたいのですが、 中身のデータがNULLにもかかわらずELSEの方を通ってしまいます。 If rs.Fields(0) Is Null Then Else シール = rs.Fields(0) End If こちらかとも思いましたが、オブジェクトが必要とエラーが返ってきました。 NULLをIF分で判定したい場合どのような記述を行えばよいでしょうか。 どうぞよろしくお願い致します。

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

  • ベストアンサー
回答No.1

Q、NULL値の判定? A、IsNull()を使います。 http://office.microsoft.com/ja-jp/access-help/HA001228867.aspx For Each fld In .Fields   With fld   C = C + 1     Select Case .Type       Case adBoolean ' ブール型         DataValues(R, C) = IIf(.Value = -1, "Yes", "No")       Case adChar, adVarChar ' 文字列型         DataValues(R, C) = Nz(.Value, "")       Case adDBDate, adDBTimeStamp ' 日付型、日付/時刻型         DataValues(R, C) = .Value       Case adSmallInt, adInteger ' 整数         DataValues(R, C) = FormatNumber(.Value, 0)       Case adSingle, adDouble ' 浮動小数点型         DataValues(R, C) = FormatNumber(.Value, 2)       Case adCurrency ' 通貨型         DataValues(R, C) = FormatCurrency(.Value, 2)       Case Else         DataValues(R, C) = .Value     End Select End With Next fld Null値があれば何かと不便。 ですから、私は、列の型に応じて変換して代入しています。 なお、Nz()はIsNull()で書くこともできます。 V = IIf(IsNull(.Fields(0)), "", .Fields(0)) V = IIf(IsNull(.Fields(0)), 0, .Fields(0))

shinnnn
質問者

お礼

ありがとうございました。 質問以上のご回答頂き 勉強になります。 NULLの対処について今後是非とも参考にさせて頂きたいと 思います。

その他の回答 (1)

  • x-1919
  • ベストアンサー率52% (91/173)
回答No.2

Access からしばらく遠ざかっているのでスパッと答えられませんが、 IsNull 関数で判定するのではなかったでしょうか? If IsNull(rs.Fields(0).Value) THen それと、Field オブジェクトの既定のプロパティは Value なので省略可能なのはわかりますが、 Value の評価なのかオブジェクト変数の評価なのかわからなくなるので rs.Fields(0).Value と省略せずに書いたほうが良いと思います。

shinnnn
質問者

お礼

ありがとうございます。 問題なく処理がとおりまし。 また、省略についてのご指摘ありがとうございます。 早速、修正致しました。

関連する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 どこが間違っているかまったくわかりません、アドバイスを頂けましたら幸いです。

  • スプレッドシートのnull表示

    win2000、vb6.0、スレッドシート3.0(文化オリエント)を使用しています。 1レコードの中から特定のフィールドだけスプレッドシートに表示し、更新できるようにしたいと考えています。 'ここまでで、レコードセットrsに1レコードセット。 Set SPR_Test.DataSource = rs SPR_TEST.col = 1 SPR_TEST.DataField = "data1" SPR_TEST.col = 2 SPR_TEST.DataField = "data2 ※上記でスプレッドシートにDBから数値型のデータを読み込んで表示しているのですが、nullのレコードが 0 で表示されています。 回避する為に、 SPR_TEST.col = 1 If IsNull(rs.Fields("data1")) Then   SPR_TEST.DataField = "" Else   SPR_TEST.DataField = "data1" End If SPR_TEST.col = 2 If IsNull(rs.Fields("data2")) Then   SPR_TEST.DataField = "" Else   SPR_TEST.DataField = "data2" End If と変更したのですが、今度はdata1,data2共にNullの場合、全くフィールドを指定していないので、他のフィールド全部表示してしまいます。 Nullは空白のまま表示したいのですが、方法はあるのでしょうか?

  • NULLを含むフィールド値の条件分岐

    どなたかご存知の方はご教示願います。 使用言語はVB6_SP5、DBはMdb(アクセス97形式)です。 ADOでDBに接続し、レコードセットを取得しそのレコードの任意のフィールドの値により処理を3通りに分けたいのです。(値はNULL、"1"、"9" の3つです。) IF文で条件分岐を行いたいのですが、うまく振り分けができずにおります。 IF ISNULL(RS.FIELDS("HHH").VALUE) THEN NULLの場合の処理 ELSE "1"の場合の処理 END IF ' "9" の場合はなにもしない 結果は全てNULLの場合の処理を実行してしまいます。 どこを修正すれば宜しいのでしょうか?

  • AccessでNULLのデータを判断する方法

    ご指導、宜しくお願い致します。 Accessを経由してPostgresのデータベースへ データをインポートしていきたいのですが、 Accessから抽出したデータが空白か空白ではないのかを 判断させたいのですが、以下のように記述しているのですが、正しく判断されないようです。 どのように記述すればよいのでしょうか??? ---------------------------------------- SQL="SELECT 単価,フラグ FROM AAA_TBL" Set RS = Conn.Execute(SQL) IF RS(0) = NULL THEN  RESPONSE.WRITE "空白" ELSE  RESPONSE.WRITE "単価" END IF IF RS(1) = NULL THEN  RESPONSE.WRITE "空白" ELSE  RESPONSE.WRITE "フラグ" END IF ---------------------------------------- Accessdb:AAA_TBL フィールド名/データ型 単価/INT4 フラグ/varchar

  • myRange = Null

    VBA Professional Office 2003の試験問題ですが http://vbae.odyssey-com.co.jp/study/sample_2003.html Sub Sample1() Dim myRange As Range On Error Resume Next '――(1) If myRange = Null Then '――(2) Debug.Print "OK" '――(3) Else Debug.Print "NO" '――(4) End If End Sub の(3)が実行されるのは、 myRange = Null が正しいからではなく、 (2)のIf myRange = Null Thenのコードが無視されたから 次のコードの(3)がたまたま実行されただけですか? (2)をIf myRange <> Null Thenにしても OKになりました。

  • VBAで配列のNULL判定

    VBAで下記のように配列に設定したNULL値を判定しようとしました。 Dim str() ReDim Preserve str(2) str(0) = "aaa" str(1) = Null str(2) = "bbb" 以下(1)、(2)の分岐処理ではNullと判定されませんでした。 どのように判定すれば良いでしょうか? (1) If str(1) = Null Then Debug.Print "Null値です" End If (2) If str(1) = "" Then Debug.Print "Null値です" End If

  • VB6とVB.NETでNullの扱いが違う?

    いつもお世話になっております。 VB6.0で開発していたプログラムをVB.NETに変更することになりました。 そこで、以下の所で困っています。 VB6.0で   If IsNull(T_RYOSYU!cnt) = True Or T_RYOSYU!cnt = 0 Then と書いていた箇所をVB.NETで   If IsDBNull(T_RYOSYU.Fields("cnt").Value) = True Or T_RYOSYU.Fields("cnt").Value = 0 Then と変更しました。 このプログラムでT_RYOSYU.Fields("cnt").ValueがNullのとき、エラーが発生しました。 原因はOrの後で、Nullと0を=で比較していたからなのですが、 VB6.0の場合はNullでもそのようなエラーは発生しませんでした。 OrをOrElseに変更することで、Nullの場合には後ろの式は判定されなくなったので、VB.NET側でも動くようになりました。 VB6.0の場合はNullと0の比較が出来たということでしょうか? それとも、VB6.0の場合はOrの前が真の場合、後ろは判定されないのでしょうか? よろしくお願いします。

  • データコンボのNullについて

    何度もすいませんm(__)m データコンボで 値が選択されてない場合は nullをデータベースに格納したいんですが、 できません。nullの使い方が不正です。と出ます。 教えてください。 VB6を使ってますデータベースはMySQLです。 Dim id As Integer If Me.DataCombo1.Text = "" Then id = Null Else id = Me.DataCombo1.SelectedItem End If datacombo1はInteger型のデータを データベースに格納します

  • Nullについて

    こんばんは!よろしくお願いします。 新規に作成したフォームにコンボボックスを設置して Sub test1() If Form_フォーム1.コンボ0.Value = Null Then Form_フォーム1.コンボ0.Value = "" End If MsgBox Form_フォーム1.コンボ0.Value End Sub Sub test2() If IsNull(Form_フォーム1.コンボ0.Value) = True Then Form_フォーム1.コンボ0.Value = "" End If MsgBox Form_フォーム1.コンボ0.Value End Sub 上記2つのサンプルを実行した時に、 test1のほうだけ 実行時エラー94 Nullの使い方が不正です。 となります。 ウォッチウインドウで見ていくと、 「オブジェクト変数、またはwithブロック変数が設定されていません。」 となりますが 「If Form_フォーム1.コンボ0.Value = Null Then」 を通過したら Nullになります。 何が起こっているのでしょうか?

  • EXCELのVBA NULL、スペースの判断

    EXCEL2000を使用しています. 入力データはテキストファイルで VBAで 空白値のを読み飛ばししたい為 if mid(da_i,1,1) <> " " then goto aa end if で判断していますが、空白データが読み飛ばしできません. (null値ではありません) どのようにすればよいのでしょう? また、null値の場合の読み飛ばしは if mid(da_i,1,1) <> "" then goto bb end if でよいのでしょうか?