※本ブログのページには広告主との提携による広告や宣伝、プロモーションが含まれます。当ブログを経由しての商品の購入や、サービス申し込みが発生すると、それらの提携企業からの成果報酬を受けとる場合があります。

VBA|IsNull関数は指定した値にNullがふくまれるかを判定する

エクセルVBAのIsNull関数のトップ画像

IsNull関数について

VBAのIsNull関数は、指定した値や変数がNull(ヌル)であるかを確認する関数です。

これまでに紹介したIsNumeric関数やIsDate関数といった数値や日付を判定するものと比べ、Excelだけに限って言えば、VBAマクロを使用する場面でも、変数やオブジェクトがNullとなる場面は一般的にはほとんどありません。

その理由としては、Excelのセルやワークシート内のデータは通常、空白やゼロなどの値が初期値とされているためNullになる場面がめずらしいからです。

従って、Nullを判定するIsNull関数も、Excelの一般的な作業で登場する機会は稀なものだと言えます。しかし、使う頻度はすくないものの存在はしているので、VBAにはこのような関数があるといった感覚で知っておいてもらえたら幸いです。

IsNull関数の判定結果はほかのIs〇〇関数と同じく、真偽(Boolean)となるため、TrueまたはFalseで返します。

PR

独学でプログラミングをはじめてみたけど、このままの学習方法に不安を感じているのなら、
オンラインスクールで現役エンジニアのサポートがあるテックアカデミーがおすすめ。
スキマ時間に学べて仕事も保証。必ず副業、始められます。まずは無料でプログラミング体験

Null値について

IsNull関数について検索している時点で、この記事を読まれている人はNull値がどういったものかはなんとなくは知っている人であることが多いと推察されますが、プログラミングに精通していない人にとっては、そもそもNullって何なの?ということになるでしょう。

Nullは変数が値を持たないことを示す特別な値です。Nullは何もないことを意味し、空の文字列(””)、数値の0、または未定義の変数(Empty)とは異なるものです。

さきほどもお伝えしたとおり、エクセルではセルやデータの初期値があり、変数を宣言するときのデータ型によって初期値が代入されるため、意図的にNull値を代入しない限りはNull値となることはありません。

※データベースやActiveX Data Objectsなどの特定の状況では、Null値が使用されることがあります。

Nullは0や、空白、Emptyともちがうものなんだね。

VBAにすこしなれてきたステップアップにおすすめです♪

IsNull関数の使いかた

IsNull関数の構文と戻り値について紹介します。

IsNull関数の構文

IsNull(変数)

※値または変数(expression)の指定は必須のため、省略した場合はエラーが発生します。

IsNull関数の判定結果について

IsNull関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。

指定した変数にNullが含まれる場合はTrue、それ以外と判定された場合はFalseが返ってきます。なお、引数に指定した変数が複数で構成されており、その内にNullが含まれるときはTrueの結果を返します。

IsNull関数をつかったサンプルマクロ

ここではIsNull関数をつかったマクロを紹介します。

IsNull関数で指定した変数にNullが含まれるかを確認する

Option Explicit
Sub IsNull_macro1()
    
    'バリアント型の変数
    Dim Var As Variant
    Debug.Print IsNull(Var) 'False
    
    '変数VarにNullを代入する
    Var = Null
    Debug.Print IsNull(Var) 'True

End Sub

IsNull関数をつかって変数である「Var」がNullであるかの判定を実行します。デバッグプリントのコードの部分で判定結果をイミディエイトウィンドウに表示しますが、1度目のデバッグプリントでは、変数「Var」はバリアント型の変数の初期値であるEmpty値が入っていますのでIsNull関数の判定結果は、Falseがかえってきます。

一方、VarにNullを代入しているため、2度目のデバッグプリントでは結果がTrueに変わります。

IsNull関数は指定した変数がNullならTrueが返ってくるよ。

つづいて、各種データ型の変数を宣言して、IsNull関数でNullが含まれるかを確認してみます。

Option Explicit

Sub IsNull_macro2()

    Dim Var1 As Integer
    Dim Var2 As Double
    Dim Var3 As String
    Dim Var4 As Boolean
    Dim Var5 As Date
    Dim Var6 As Object
    Dim Var7 As Variant
    Dim Var8 'データ型の指定をしないとVariant型となる
    Dim Var9()
    Dim Var10(1 To 3)
    Dim Var11 As Variant
    Set Var11 = Nothing
    Dim Var12 As Variant: Var12 = ThisWorkbook.Sheets("Sheet1").Cells(1, 1)


    'くり返し処理用にコレクションを宣言する
    Dim Var_Collection As collection
    Set Var_Collection = New collection
    
    Var_Collection.Add Item:=Var1  '数値
    Var_Collection.Add Item:=Var2  '小数値
    Var_Collection.Add Item:=Var3  '文字列値
    Var_Collection.Add Item:=Var4  '真偽値
    Var_Collection.Add Item:=Var5  '日付値
    Var_Collection.Add Item:=Var6  'オブジェクト変数
    Var_Collection.Add Item:=Var7  'バリアント変数(データ型明記)
    Var_Collection.Add Item:=Var8  'バリアント変数(データ型なし)
    Var_Collection.Add Item:=Var9  'バリアント配列(動的)
    Var_Collection.Add Item:=Var10  'バリアント配列(静的)
    Var_Collection.Add Item:=Var11  'バリアント変数(Nothing)
    Var_Collection.Add Item:=Var12  'バリアント変数(シート1のA1セル)
    
     'くり返し処理用の変数を宣言する
    Dim X As Variant
    Dim i As Long: i = 1
    
    For Each X In Var_Collection
        Debug.Print i & " コめの変数は " & IsNull(X)
        i = i + 1
    Next X
    
End Sub

各種データ型で宣言した変数を、IsNull関数をつかってNullであるかを確認します。
このマクロでは、複数の変数をまとめて処理するためにコレクションオブジェクトを宣言し、変数をコレクションに追加する処理をしています。

デバッグプリントなので、結果はイミディエイトウィンドウにTrueかFalseを表示します。表示された結果は以下のとおりです。

変数をまとめるために利用しているコレクションや、くり返しに利用しているForEachステートメントについては、以前の記事で紹介しており、以下のリンクから該当の記事を読むことができます。詳しい内容につきましてはそちらを参考にしてください。

No 判定する変数名 説明 判定結果
(True or False)
1 Var1 Dim Var1 As Integerで宣言した変数 False
2 Var2 Dim Var2 As Doubleで宣言した変数 False
3 Var3 Dim Var3 As Stringで宣言した変数 False
4 Var4 Dim Var4 As Booleanで宣言した変数 False
5 Var5 Dim Var5 As Dateで宣言した変数 False
6 Var6 Dim Var6 As Objectで宣言した変数 False
7 Var7 Dim Var7 As Variantで宣言した変数 False
8 Var8 Dim Var8で宣言した変数 False
9 Var9 Dim Var9()で宣言した変数 False
10 Var10 Dim Var10(1 To 3)で宣言した変数 False
11 Var11 Dim Var11 As Variantで宣言した変数
Set Var11 = Nothing
※Nothingが代入されている
False
Nullが含まれているものはTrue、そうでないものがFalseと判定されます。

変数を宣言した時点での初期値にNullとなっているものはないね。

このマクロを実行したあとで宣言した変数の初期値をVBEのローカルウィンドウの状態

各種データ型の変数を宣言した時点での初期値が、Nullでないことは上のVBEのローカルウィンドウによりわかります。なお、変数名「Var11」と「Var12」については他の変数とは異なり、宣言直後にNothingや、シート1のセルA1を代入(参照)しています。

判定する変数名 宣言したデータ型 初期値 備考
Var1 Integer
(整数型)
0
Var2 Double
(小数型)
0
Var3 String
(文字列型)
“”
(空文字)
Var4 Boolean
(真偽型)
False
Var5 Date
(日付型)
#0:00:00#
Var6 Object
(オブジェクト型)
Nothing
Var7 Variant
(バリアント型)
Empty値
Var8 指定なし
(指定しない場合はバリアント型)
Empty値
Var9() 指定なし
(バリアント型の動的配列)
Empty値
Var10(1 To 3) 指定なし
(バリアント型の静的配列)
Empty値
Var11 指定なし
(バリアント型の静的配列)
Nothing Set Var11 = Nothing
※上記コードによりNothingを代入
Var12 指定なし
(バリアント型の静的配列)
Empty値 Var12 = ThisWorkbook.Sheets(“Sheet1”).Cells(1, 1)
※上記コードによりシート1のセルA1を参照
※初期値は宣言した時点でのローカルウィンドウの値

PR

PCでスキルアップをしたい・Excelをしっかり学んで社内の評価を高めたい人は必見!
実務をプロから学べる「ユースフル」は講座の動画は永年見放題。安心のQ&A機能で分からないを解決。

If文でNullを判定する式とは異なる結果となる

If文をつかった式ではIsNull関数と結果がことなりますので、変数にNullが含まれていること判定するためには、IsNull関数を利用してください。たとえば以下のようなマクロでは常にFalseがかえってきます。

Option Explicit

'If文をつかった判定式を実行するマクロ
Sub IsNull_macroA()

    Dim Judgement
    Judgement = Null 'Nullを代入
    
    'IF文による判定式(常にFalseがかえってくる)
    If Judgement = Null Then
        Debug.Print "Nullです。"
    Else
        Debug.Print "Nullではありません。"
    End If
    
End Sub

このマクロの結果でIf文での分岐にかならずFalseとなるため、「Nullではありません。」がかえってきます。

これはNullの性質によるものであり、Nullを含む式はすべてNullとなります。
何もないものを比較することができないため、すべての結果はFalseでかえってきます。

マイクロソフトのサポートにも以下のような記載があります。

重要:  式に Null 値が含まれているかどうかを判断するには、IsNull 関数を使用します。 If Var = Null、If Var <> Null など、状況によっては True に評価されることがある式は、常に False になります。 これは、Null を含む式は Null であり、そのため False になるためです。

IsNull 関数 – Microsoft サポート

すこし禅問答のような感覚になりますが、変数の値がNullであるかの判定では、サンプルマクロのような方法ではなく、IsNull関数を利用するとおぼえておきましょう。

それでは、サンプルマクロをIsNull関数をつかった判定式に書きかえてみます。

このマクロをIsNull関数をつかった判定式に書きかえてみるよ。

Option Explicit

'If文をつかった判定式を実行するマクロ
Sub IsNull_macroB()

    Dim Judgement
    Judgement = Null
    
    'IsNullによる判定式
    If IsNull(Judgement) Then
        Debug.Print "Nullです。"
    Else
        Debug.Print "Nullではありません。"
    End If
    
End Sub

こちらのIsNull関数をつかったコードだと、Trueの分岐になるよ。

IsNull関数のような値や変数を判定する関数はほかにもある

VBAには数値以外にも値や変数を判定する関数があります。

IsArray関数

 値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsNumeric関数

 値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsDate関数

 値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsEmpty関数

 値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsError関数

 値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

IsObject関数

 値や変数がオブジェクトかどうかを判定し、TrueまたはFalseの真偽値(Boolean)を返す

コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。

コメント

タイトルとURLをコピーしました