• ベストアンサー

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の前が真の場合、後ろは判定されないのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

>VB6.0の場合はOrの前が真の場合、後ろは判定されないのでしょうか? そんなことはありません。 必ず後ろも比較されます。 >VB6.0の場合はNullと0の比較が出来たということでしょうか? If 0 = Null Then MsgBox ("にゃー") End If はVBAで試したところエラーにはなりませんでした、ただメッセージは出ませんでした。 If Not 0 = Null Then MsgBox ("にゃー") End If も If 0 <> Null Then MsgBox ("にゃー") End If メッセージは出ませんでした。 結果としては 比較は行われる。 エラーは起きない。 Nullは0でも0以外でもない。(特別?)

pepepepepe
質問者

お礼

わざわざ試していただいてありがとうございます。 実際試していただいた結果なので、かなり参考になります。 ありがとうございました!

その他の回答 (1)

回答No.2

VB.NETのヘルプで「Null値の反映」を見てください。 VB6.0の場合、Null 値を含む式はすべて式自体が Null 値となり、偽 (False) と評価されます。 VB.NETの場合は、Null値に対する式はエラー(型の不一致)になります。 【ヘルプから抜粋】 以前のバージョンの Visual Basic では、NULL 値の反映がサポートされています。 NULL 値の反映は、VB.NET ではサポートされていません。 NULL 値の反映は、式で NULL が使用されている場合に、式の結果自体が Null になるという前提を支えるものです。 VB6.0 と VB.NET の両方との互換性を持つためには、Null 値の反映を使用せずに、Null をテストするコードを常に記述する必要があります。

pepepepepe
質問者

お礼

ありがとうございます。 ヘルプに書いてあるんですね。 調査不足で申し訳ありません。

関連するQ&A

  • 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分で判定したい場合どのような記述を行えばよいでしょうか。 どうぞよろしくお願い致します。

  • 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になります。 何が起こっているのでしょうか?

  • 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の場合の処理を実行してしまいます。 どこを修正すれば宜しいのでしょうか?

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

  • DBへNULLの書き込みって出来ますか?

    いつもお世話になっております。 VB初心者で「BV2008EE」を使っています。よろしくお願いします。 データリーダーが気に入ってよく使っています。 使い方に問題があるのかもしれませんが ***<< ソース例 >>***************************************** 'データコマンドの定義 command.CommandText = "SELECT tana_type FROM tbl_tana ORDER BY tana_type" 'データリーダーからのデータの読み出し dr = command.ExecuteReader() Do While dr.Read '読み出したデータ(Null以外)をコンボボックスに追加する If Not IsDBNull(dr("tana_type")) Then cmbTana.Items.Add(dr("tana_type")) End If Loop 'データリーダーを閉じる dr.Close() *********************************************************** データベースの情報をコンポボックスに追加していくものですが 空白を追加する場合があります。 原因は「NULL」ではなく「""(0文字)」が登録された為です。 一度文字を書いて削除した場所はNULLではなく""になるようです。 データリーダーで""の判定がエラーになるためNULL判定にしたのですが 入力間違いで削除するケースは多いと思う為、どうしようか困っています。 ""判定が出来ないのは私のプログラム構造のミスなのかもしれません。 苦肉の策で""だったら「NULL」を書き込もうと思いましたが出来ませんでした。 良い方法がございましたらご教授いただけると助かります。 宜しくお願いいたします。

  • 【エクセル】ActiveCellはなぜNullではないのでしょうか?

    私は今まで新規のシートを挿入した際のActiveCellは、Nullだと思っていたのですが Sub Empty空白なら() If ActiveCell.Value = Empty Then Debug.Print "空白セルです" End Sub Sub Null空白なら() If ActiveCell.Value = Null Then Debug.Print "空白セルです" End Sub Sub Null空白なら2() If IsNull(ActiveCell.Value) = True Then Debug.Print "空白セルです" End Sub VBAでこのコードを実行すると Emptyの方だけ「空白セルです」となりました。 (1)なぜ空白でもNullだと反応しないのでしょうか? (2)NullとEmptyの違いはなんですか? ご教授よろしくお願い致します。

  • データベースから呼び出して、エクセルのシートに素早く転記したい。

    データベースから呼び出して、エクセルのシートに素早く転記したい。 オラクルのデータベースから呼び出して、エクセルのシートに転記しているのですが、 1項目ずつなので、1000行で1分くらい掛かります。 配列が良いと聞きますが、さっぱり分かりません。 何か良い方法があれば、御教授願えませんでしょうか? If (OraDset.EOF = False) Then Do Until (OraDset.EOF) Line_Cnt = Line_Cnt + 1 Range("C" & Line_Cnt).Value = OraDset.Fields("BBB").Value Range("D" & Line_Cnt).Value = OraDset.Fields("CCC").Value Range("E" & Line_Cnt).Value = OraDset.Fields("DDD").Value Range("F" & Line_Cnt).Value = OraDset.Fields("EEE").Value Range("G" & Line_Cnt).Value = OraDset.Fields("FFF").Value OraDset.MoveNext DoEvents Loop End If

  • VB.NET Form1からForm2を開いたり閉じたりする方法

    VB.NET2005でForm1にあるCheckBoxをTrueにするとform2をモードレスフォームとして開き、CheckBoxをFalseにするとform2を閉じる方法がわかりません。また、form2の[×]で閉じた時にはForm1にあるCheckBoxをFalseにする方法がわかりません。 '----------------------------------- Private Sub CheckBox2_CheckedChanged ・・・   Dim f_cnt As Integer   Dim form2 As New Form2()   f_cnt = My.Application.OpenForms.Count   If CheckBox1.Checked = True Then     If f_cnt = 1 Then form1.Show() 'モードレスフォームとして表示する   Else    form2.Close() ←閉じない   End If End Sub '-----------------------------------

  • excel2007 VBで

    下記のマクロ作成して実際にセルにA、あるいは何かデータを入力しても下記イベント?が発生している気配がありません。 Application.EnableEvents = Falseの行がなにか問題なのでしょうか。実プログラムは If Target.Value = "A" Or Target.Value = "A" Thenの他にB、C、計算も含んでいるのですがApplication.EnableEvents = TrueはEnd Subの前行に入れてあります。 他に設定することがあるのでしょうか。どなたか教えてください。 Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Count > 1 Then Exit Sub '複数セルの入力は無視 Application.EnableEvents = False '割込み停止 ’[B3] = 123 ’Stop If Target.Value = "A" Or Target.Value = "A" Then Target.Value = "A" End If Application.EnableEvents = True '割込み再開 End Sub excel2007 VB6.5です。

  • [VB.NET]and,orを使う状況

    自分で考えても思いつかなかったので、皆様のご意見をお聞かせ下さい。 今、VB.NETの勉強をしているのですが、VB.NETでは、VB6やVBAで使用できなかった AndAlso、OrElseが使えるということを知りました。 これらは、短絡評価なので、たくさんの条件を指定した場合、AndやOrに比べて処理が速くなるだろうと 予測がつくのですが、それでは、AndやOrを使う必要がないのではないでしょうか・・・? 自分で考えてみたのですが、うまい使用例が考え付きません。 必ず2つ以上の条件を評価しなくてはならない場合でも、条件判定を入れ子にしたほうが、 エラー処理が入れやすくなりますし・・・ AndやOrを使わなければならない状況ってあるのでしょうか?