要素があるかないかをどうやれば判別できるでしょうか?

解決


FG  2009-06-06 20:58:44  No: 101810  IP: 192.*.*.*

Dim a As Variant

上のようにVariant型で宣言された変数aに配列変数が入っている場合、要素があるかないかを判別するにはどうすればいいでしょうか?

配列を戻り値とする関数を作ったのですが、その戻り値を上の変数aに代入すると、配列の要素が1つもないとき、UBound(a)でエラーが出てしまいます。
そこで、
If a = Empty Then
で調べようとすると今度は要素があるときにエラーが出てしまいます。

要素があるかないかをどうやれば判別できるでしょうか?

どうかご教授のほどよろしくお願いいたします。

編集 削除
変態仮面  2009-06-06 23:28:16  No: 101811  IP: 192.*.*.*

どういう関数かしらんけど、
まず変数aが配列型かチェックして、そうであればUBOUND関数使えば
エラーになることはないと思うけど。
配列型でない場合は要素数0でいいのかな?

編集 削除
変態仮面  2009-06-06 23:31:24  No: 101812  IP: 192.*.*.*

IsArray関数ね

編集 削除
魔界の仮面弁士  2009-06-06 23:47:53  No: 101813  IP: 192.*.*.*

> 配列の要素が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 で判定する方法もあるにはありますが、そこまで大袈裟にすることも無いかと)

編集 削除
FG  2009-06-07 02:53:30  No: 101814  IP: 192.*.*.*

変態仮面さん、魔界の仮面弁士さん、ご回答ありがとうございます。

> IsArray関数ね
こんな関数があったのですね。ありがとうございます。

> 想像するに、未初期化の配列を返しているのではないでしょうか?
はい、そのとおりです。
Dim a() As String
としただけの配列変数を戻り値としていました。

おかげさまで解決いたしました。
どうもありがとうございました。

編集 削除