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ともちがうものなんだね。
IsNull関数の使いかた
IsNull関数の構文と戻り値について紹介します。
IsNull関数の構文
構文
IsNull(変数)
※値または変数(expression)の指定は必須のため、省略した場合はエラーが発生します。
IsNull関数の判定結果について
IsNull関数の結果は真偽値(Boolean)となるため、TrueまたはFalseが返ります。
指定した変数にNullが含まれる場合はTrue、それ以外と判定された場合はFalseが返ってきます。なお、引数に指定した変数が複数で構成されており、その内にNullが含まれるときはTrueの結果を返します。
IsNull関数をつかったサンプルマクロ
ここではIsNull関数をつかったマクロを紹介します。
IsNull関数で指定した変数にNullが含まれるかを確認する
サンプルマクロ1
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に変わります。
実行結果
False
True
IsNull関数は指定した変数がNullならTrueが返ってくるよ。
つづいて、各種データ型の変数を宣言して、IsNull関数でNullが含まれるかを確認してみます。
サンプルマクロ2
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ステートメントについては、以前の記事で紹介しており、以下のリンクから該当の記事を読むことができます。詳しい内容につきましてはそちらを参考にしてください。
\データ型の異なる変数を要素としてまとめて処理できるコレクションオブジェクトはコチラ/
\ForEacnステートメントの詳しい解説はコチラ/
IsNull関数の実行結果まとめ
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となっているものはないね。
このマクロを実行したあとで宣言した変数の初期値を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
なぜ、膨大な事務作業でも定時で退社できるのか。
実務をプロから学べる「ユースフル」の動画は永年見放題。Q&A機能で分からないを放置しないから安心。
詳しくは以下のリンクをクリック
If文でNullを判定する式とは異なる結果となる
If文をつかった式ではIsNull関数と結果がことなりますので、変数にNullが含まれていること判定するためには、IsNull関数を利用してください。たとえば以下のようなマクロでは常にFalseがかえってきます。
サンプルマクロ(If文による判定)
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関数をつかった判定式に書きかえてみるよ。
サンプルマクロ(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には数値以外にも値や変数を判定する関数があります。
値や変数が配列であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が数値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が日付であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数が初期値であるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がエラーであるかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
値や変数がオブジェクトかどうかを判定し、TrueまたはFalseの真偽値(Boolean)を返す
コダマのもりブログはにほんブログ村に登録しています。
ブログの記事が役に立ったと感じて頂けたら、フォローお願いいたします。
コメント