Dim a As Variant
上のようにVariant型で宣言された変数aに配列変数が入っている場合、要素があるかないかを判別するにはどうすればいいでしょうか?
配列を戻り値とする関数を作ったのですが、その戻り値を上の変数aに代入すると、配列の要素が1つもないとき、UBound(a)でエラーが出てしまいます。
そこで、
If a = Empty Then
で調べようとすると今度は要素があるときにエラーが出てしまいます。
要素があるかないかをどうやれば判別できるでしょうか?
どうかご教授のほどよろしくお願いいたします。
どういう関数かしらんけど、
まず変数aが配列型かチェックして、そうであればUBOUND関数使えば
エラーになることはないと思うけど。
配列型でない場合は要素数0でいいのかな?
IsArray関数ね
編集 削除> 配列の要素が1つもないとき、UBound(a)でエラーが出てしまいます。
要素数 0 の配列ならば、エラーにはならないはずです。
想像するに、未初期化の配列を返しているのではないでしょうか?
Option Explicit
Private Sub Form_Load()
Dim v As Variant
v = Foo()
MsgBox IsArray(v) 'True
MsgBox UBound(v) 'エラー9: インデックスが有効範囲にありません。
End Sub
Private Function Foo() As Variant
Dim V() As Variant
Foo = S
End Function
> 要素があるかないかをどうやれば判別できるでしょうか?
可能であれば、未初期化の配列を返さないようにし、せめて
要素数ゼロの配列を返すことを検討してみてください。
要素数ゼロの配列は、たとえば下記のようにして生成できます。
これらの配列は、LBound/UBound してもエラーにならないはずです。
Dim V() As Variant
V = Array() '空のVariant配列
Dim B() As Byte
B = "" '空のByte配列
Dim S() As String
S = Split("") '空の String 配列
Dim O() As Object
VarType O
もし、要素の無い配列を事前に作成しておくことができないのだとすると、
On Error で UBound をエラートラップして判定することになるでしょう。
(API で判定する方法もあるにはありますが、そこまで大袈裟にすることも無いかと)
変態仮面さん、魔界の仮面弁士さん、ご回答ありがとうございます。
> IsArray関数ね
こんな関数があったのですね。ありがとうございます。
> 想像するに、未初期化の配列を返しているのではないでしょうか?
はい、そのとおりです。
Dim a() As String
としただけの配列変数を戻り値としていました。
おかげさまで解決いたしました。
どうもありがとうございました。