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

VBA|IsEmpty関数は変数が初期化されているかを判定する

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

IsEmpty関数について

VBAのIsEmpty関数は、指定した値や変数が初期化されているか、そうでないかを確認するための関数です。

以前に紹介したIsNumeric関数IsDate関数といった数値や日付を判定するものと比較すると一般的な作業では使用頻度は少ないと考えますが、VBAにはこういった関数があるといった感覚で知っておいてもらえたら幸いです。

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

IsEmpty関数では、変数が初期化されていないとき、または変数にEmptyが設定されているときTrueとなり、それ以外の場合はFalseの結果がかえってきます。

また、判定する変数が複数であった場合は、つねにFalseの判定結果が返ってきます。

すこし分かりにくいけど、初期化されていないときがTrueになるよ。


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

IsEmpty関数がつかえる場面

IsEmpty関数の利用が想定される場面では、以下のようなものがあります。

変数の初期化の確認

 指定された変数が初期化されているかの判定を実行します。

セルの値が空であるかどうかの確認

 指定されたセルが空白であるかの判定を実行します。

配列が初期化されているかどうかの確認

 指定された配列が初期化されているかの判定を実行します。

IsEmpty関数の使いかた

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

IsEmpty関数の構文

IsEmpty(値または変数)

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

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

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

指定した値や変数が初期化されていない、またはEmptyが設定されている場合はTrue、それ以外と判定された場合や変数が複数の場合はFalseが返ってきます。

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

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

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

IsEmpty関数で変数が初期化されているかを確認する

以下のサンプルマクロは変数が初期化されているかを確認します。

IsEmpty関数の引数にバリアント型の変数を指定して初期化されているかを確認します。

  
Option Explicit

Sub IsEmpty_macro1() '変数の初期化の確認

    Dim Var As Variant 'バリアント型の初期値はEmpty
    Debug.Print IsEmpty(Var) '実行結果はTrue
    
End Sub

05行目

バリアント型の変数Varを宣言します。

06行目

IsEmpty関数をつかってVarが初期化されているかを判定します。判定結果としてTrueまたはFalseが返ります。

実行結果(イミディエイトウィンドウ)

True

Trueが返ってきたので初期化されているみたいだね。

IsEmpty関数でさまざまな変数が初期化されているかを確認する

以下のサンプルマクロは、各種データ型で宣言した変数をIsEmpty関数で初期化されているか判定します。

  
Option Explicit

Sub IsEmpty_macro2() '変数の初期化の確認2
    
    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 test_collection As collection
    Set test_collection = New collection
    
    test_collection.Add Item:=Var1 '数値
    test_collection.Add Item:=Var2 '小数値
    test_collection.Add Item:=Var3 '文字列値
    test_collection.Add Item:=Var4 '真偽値
    test_collection.Add Item:=Var5 '日付値
    test_collection.Add Item:=Var6 'オブジェクト変数
    test_collection.Add Item:=Var7 'バリアント変数(データ型明記)
    test_collection.Add Item:=Var8 'バリアント変数(データ型なし)
    test_collection.Add Item:=Var9 'バリアント配列(動的)
    test_collection.Add Item:=Var10 'バリアント配列(静的)
    test_collection.Add Item:=Var11 'バリアント変数(Nothing)
    
    'くり返し処理用の変数を宣言する
    Dim X As Variant
    'For EachステートメントでIsEmpty関数の結果を出力する
    For Each X In test_collection
        Debug.Print IsEmpty(X)
    Next X

End Sub

05行目から15行目

各種データ型を宣言します。

18行目から19行目

宣言した変数をくり返し処理でまとめて判定したいので、コレクションオブジェクトtest_collectionを宣言します。

21行目から31行目

コレクションオブジェクトに各種データ型の変数を追加します。

35行目から38行目

ForEachステートメントtest_collectionの要素すべてに対してくり返しを指定しています。処理の内容は、IsEmpty関数をつかって各種データ型の変数を判定して、結果をイミディエイトウィンドウに表示します。

\データ型の異なる変数を要素としてまとめて処理できるコレクションオブジェクトはコチラ/
\ForEacnステートメントの詳しい解説はコチラ/

実行結果(イミディエイトウィンドウ)

False
False
False
False
False
False
True
True
False
False
False

実行結果を表にまとめると以下のとおりです。

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で宣言した変数 True
8 Var8 Dim Var8で宣言した変数 True
9 Var9 Dim Var9()で宣言した変数 False
10 Var10 Dim Var10(1 To 3)で宣言した変数 False
11 Var11 Dim Var11 As Variantで宣言した変数
Set Var11 = Nothing
※Nothingが代入されている
False
※未初期化がTrue、初期化済みはFalseです。

バリアント型の変数の初期値はEmptyだね。

IsEmpty関数で変数が初期化されているかを確認する(変数が複数の場合)

以下のサンプルマクロは、宣言した変数をIsEmpty関数で初期化されているか判定します。引数に複数の変数が指定された場合の動作を確認します。

  
Option Explicit

Sub IsEmpty_macro3() '変数の初期化の確認3(変数が複数である場合)
    
    Dim Var1 As Variant, Var2 As Variant, Var3 As Variant 'バリアント型の初期値はEmpty
    Debug.Print IsEmpty(Var1 + Var2 + Var3) '実行結果はFalse(変数が複数)

    Dim Var4 As Variant, Var5 As Variant, Var6 As Variant 'バリアント型の初期値はEmpty
    Var4 = 5
    Var5 = 10
    Var6 = 15

    Debug.Print IsEmpty(Var6 - Var4 - Var5)  '実行結果はFalse(変数が複数)
    
    Dim Var7 As Variant, Var8 As Variant, Var9 As Variant 'バリアント型の初期値はEmpty
    Var7 = "A"
    Var8 = "B"
    Var9 = "C"
    
    Debug.Print IsEmpty(Var7 & Var8 & Var9)  '実行結果はFalse(変数が複数)
    
End Sub

05行目

バリアント型の変数Var1Var2Var3を宣言します。

06行目

IsEmpty関数の引数にVar1Var2Var3を指定して判定します。判定結果は真偽値をイミディエイトウィンドウに表示します。

08行目

バリアント型の変数Var4Var5Var6を宣言します。

09行目から11行目

変数Var4Var5Var6に数値を代入します。

13行目

IsEmpty関数の引数にVar4Var5Var6を指定して判定します。判定結果は真偽値をイミディエイトウィンドウに表示します。

15行目

バリアント型の変数Var7Var8Var9に数値を代入します

16行目から18行目

変数Var4Var5Var6に文字列を代入します。

20行目

IsEmpty関数の引数にVar7&Var8&Var9を指定して判定します。判定結果は真偽値をイミディエイトウィンドウに表示します。

実行結果(イミディエイトウィンドウ)

False
False
False

IsEmpty関数は指定する変数が複数だったらFalseになるね。

IsEmpty関数でセルの値が空であるかどうかを確認する

以下のサンプルマクロは、宣言した変数にエクセルシートのA1セルを代入します。そのあと、IsEmpty関数が初期化されているか判定します。判定した結果によって表示するメッセージが変化するようにしています。

  
Option Explicit

Sub IsEmpty_macro4() 'セルの値が空であるかどうかの確認
    
    'セルの値を代入する変数を宣言する
    Dim CellVal As Variant
    
    'アクティブシートのA1セルの値を変数に代入する
    CellVal = ActiveSheet.Range("A1").Value
    
    'セルの値が空白(Empty)であるかを判定し、処理を分岐する
    If IsEmpty(CellVal) Then
        Debug.Print "セルは空白です。"
    Else
        Debug.Print "セルは空白ではありません。"
    End If
    
End Sub

06行目

バリアント型の変数CellValを宣言します。

09行目

CellValにアクティブ(表示している)シートのA1セルに入力された値を代入します。

12行目から16行目

IsEmpty関数でCellValを判定します。判定の結果によってそのあとの処理を分岐します。

実行結果

09行目に代入したA1セルが空白であった場合は、Trueとなります。何かしら文字が入力されているとFalseが返ってきます。

「セルは空白です。」の実行結果となる状態

IsEmpty関数によるセルの空白判定(アクティブシートが空白のとき)

アクティブシートのA1セルが空白の場合

「セルは空白ではありません。」の実行結果となる状態

IsEmpty関数によるセルの空白判定(アクティブシートが空白ではないとき)

アクティブシートのA1セルが空白ではない場合

実行結果はアクティブシートのA1セルが空白かどうかで変わるよ。

似たような機能で考えられるものとして、ユーザーフォームのコントロール(テキストボックスなど)が未入力かどうかをチェックするマクロを思い浮かべますが、IsEmpty関数を使うとFalseの結果となるため、判定式ではTextBox1.Value = “”などで対応するといいでしょう。

IsEmpty関数で配列が初期化されているかどうかを確認する

サンプルマクロのVBAコード

  
Option Explicit

Sub IsEmpty_macro5() '配列が初期化されているかどうかの確認
    
    'バリアント型の配列を宣言する
    Dim UserArray As Variant
    Dim i As Integer

    '2回くり返す
     For i = 1 To 2
        'セルの値が空白(Empty)であるかを判定し、処理を分岐する
        If IsEmpty(UserArray) Then
            Debug.Print "配列は初期化されています。"
            ReDim UserArray(1 To 3) '配列の再定義(要素数3つ)
        Else
            Debug.Print "配列は初期化されていません。"
        End If
    Next i

End Sub

06行目

バリアント型の変数UserArrayを宣言します。

10行目

ForNextステートメントをつかってくり返しを指定しています。こちらのサンプルでは変数iが1から2までの2回くり返します。

12行目から17行目

IsEmpty関数でUserArrayが初期化されているか判定します。判定の結果によってそのあとの処理を分岐します。判定の結果として初期化されている(True)であったときは、UserArray配列として再定義する処理を実行します。

サンプルマクロで利用している配列については、別の記事でも取り上げています。
配列の宣言や再定義などについて詳しく知りたい人は、以下のリンクより記事をご覧になってください。

配列は初期化されています。
配列は初期化されていません。

IsEmpty関数の結果が、1度目と2度目で変化したね。

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

VBAには数値以外にも値や変数を判定する関数があります。関数名をクリックするとそちらの記事にジャンプします。

IsArray関数

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

IsNumeric関数

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

IsDate関数

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

IsError関数

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

IsNull関数

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

IsObject関数

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

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

コメント

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