Microsoft Access Club >AccessTips >このページ >次頁 < 前項  サイト内検索


Null値 についての考察_VBA:AccessTips060



VBAでは、Null という何処にでも顔を覗かせる奴がいます。値を代入したときによく問題になる奴です。一般的に、VBAでは文字列を String型 と定義します。例えば、変数(一時的に値を貯めておく仮想の場所)名を Strtext と命名する場合は、

Dim Strtext As String

と記述しますが、この場合の Dim とは変数を宣言するステートメント、Asは予約語、Asの次に変数のデータ型(ここでは文字列型)を記述します。

一例

Nullを理解するために、下記のようなテーブルデータを作成します。

ID 氏名 性別
1 中村 晃一
2 佐藤 陽子
3 松下 孝枝
4 鈴木 真紀子
5 柴田 浩樹

次に、これを元にしたフォーム(単票式)を作成します。

このフォームでは、オートナンバー形のID、テキスト型の氏名と性別、フォームフッターに配置した一番下のテキストボックスではこれらを組み合わせて表示させています。

レコード移動時イベントプロシージャの作成

レコード移動時イベントプロシージャを以下のように作成します。

Private Sub Form_Current()

    Dim Str名前 As String
    Dim Str性別 As String
    Dim Txt統合 As TextBox
    Const Str接中語 = "は、"
    Const Str接尾語 = "です"

    Set Txt統合 = Me.txt_Total
    Str名前 = Me.氏名
    Str性別 = Me.性別
    Txt統合 = Str名前 & Str接中語 & Str性別 & Str接尾語

End Sub
解説

しかし、ここでIDが 3 のレコードを表示させようとすると、下記のAccess所定のエラーメッセージが表示されます。

ここで、[終了ボタンをクリックするとVBAは停止しますが、[デバッグ]をクリックすると、VBEの画面に切り替わり、プロシージャ内のエラー箇所が黄色で表示されます。そして、そのエラー箇所にマウスを置くと、下記のよう な式が表示され、Null値が代入されていることが判ります。

つまり、String型の変数には、Nullを代入することはできません。

エラーの対処方法

このエラーを防ぐには、Nz関数を用いて下記のとおり変更します。

Private Sub Form_Current()

    Dim Str名前 As String
    Dim Str性別 As String
    Dim Txt統合 As TextBox
    Const Str接中語 = "は、"
    Const Str接尾語 = "です"

    Set Txt統合 = Me.txt_Total
    Str名前 = Nz(Me.氏名)
    Str性別 = Nz(Me.性別)
    Txt統合 = Str名前 & Str接中語 & Str性別 & Str接尾語
        
End Sub
IF関数の利用

または、IF関数を用いて分岐させる方法もあります。

Private Sub Form_Current()

    Dim Str名前 As String
    Dim Str性別 As String
    Dim Txt統合 As TextBox
    Const Str接中語 = "は、"
    Const Str接尾語 = "です"

    Set Txt統合 = Me.txt_Total
    
    If IsNull(Me.氏名) Then
        Str名前 = ""
    Else
        Str名前 = Me.氏名
    End If

    If IsNull(Me.性別) Then
        Str性別 = ""
    Else
        Str性別 = Me.性別
    End If

    Txt統合 = Str名前 & Str接中語 & Str性別 & Str接尾語
        
End Sub
Resume Nextを利用したエラー処理

もう一丁、エラー処理で対応する方法もあります。

Private Sub Form_Current()

On Error GoTo エラー処理

    Dim Str名前 As String
    Dim Str性別 As String
    Dim Txt統合 As TextBox
    Const Str接中語 = "は、"
    Const Str接尾語 = "です"

    Set Txt統合 = Me.txt_Total
    Str名前 = Me.氏名
    Str性別 = Me.性別
    Txt統合 = Str名前 & Str接中語 & Str性別 & Str接尾語
    
エラー処理:

    If Err.Number = 94 Then
            Resume Next
    Else
        MsgBox "エラーNo. " & Err.Number
        End
    End If
    
End Sub
解説

Resume Next は、エラーが生じた行の次行から実行を開始するステートメントです。

通常、VBAでは変数をString型と定義した場合、初期値は空白の文字列になります。つまり、このケースでは、Str性別="" となっている訳です。よって、エラー行を飛ばせば、求める Str性別="" が現れる原理です。

エラー処理を記述する場合は必ず、メイン処理の最後に Exitステートメントを記述し、メイン処理範囲とエラー処理範囲を区分する必要があります。今回のケースでExit Subと記述している箇所です。
String型からVariant型に変更

データ型をVariant型に変更します。

Private Sub Form_Current()

    Dim Var名前 As Variant
    Dim Var性別 As Variant
    Dim Txt統合 As TextBox
    Const Str接中語 = "は、"
    Const Str接尾語 = "です"

    Set Txt統合 = Me.txt_Total
    Var名前 = Me.氏名
    Var性別 = Me.性別
    Txt統合 = Var名前 & Str接中語 & Var性別 & Str接尾語
        
End Sub

いろいろとお話しましたが、やっかいなNullの取扱いを頭の片隅にちょっと置かれて、今後もAccessに取り組んで下さいね。

 2001/08/21

ページの先頭へ 前ページへ戻る

 


Null値 についての考察_VBA:AccessTips060


 

-Microsoft Access Club-