VB6で、
Dim v() As Variant
と宣言した変数vに対し、現在の長さをUbound()-LBound()で求め、
そこに+1してredim preserveステートメントを使い、順次要素を増やして処理を行いたいと思っています。
しかし、TypeName関数では型の名前が"Variant()"となってしまい、要素数0の判定ができません。
LBound、Uboundで要素の長さを得ようとしても要素がないので実行時エラーになります。
要素数0の配列を見分ける方法があれば教えてください。
そのままでは、エラートラップするか、APIで判定するしかありません。
こういう場合は、あらかじめ
v = Array()
のようにして、空の配列を作成しておく事をお奨めします。
このようにして作った配列ならば、LBound/UBoundしてもエラーになりません。
要素数0の配列(空の配列)、と、
初期化されてない配列型の変数、
とは異なるので区別しましょう。
似たような文字列で対応するものを探すのならば、
前者は""
後者はvbNullString
となります。
v = Array()とするのですか。
よくわかりました。
UBoundで-1が返るのは多少違和感を感じますが、
これなら要素0を特別扱いすることなく処理できそうです。
ありがとうございました。
vbNullStringはCで言うところのNULLポインタだそうですね。
""はvbNullCharとも書けるようです。
今までこの二つは同一だと思い込んでいました。
思い込みとは怖いものです。
解決しました。
> UBoundで-1が返るのは多少違和感を感じますが、
この時、LBound は 0 を返します。(Option Base 0 の場合)
結果として、空の配列においても、要素数を求めるために
要素数 = UBound値 - LBound値
という数式が、そのまま使えるようになっているわけですね。
> ""はvbNullCharとも書けるようです。
書ける場合もありますが、それぞれは別物です。
確かに API などに渡す時には、それらが同一視される事もありますが、
VB側として見れば、
If "" = vbNullChar Then
は、False を返しますからね。
おっと間違い。要素数の求め方は、
要素数 = UBound値 - LBound値 + 1
ですね。(^^;
Dim V() As Variant
V = Array() '要素数ゼロ
Debug.Print UBound(V) - LBound(V) + 1
ReDim V(3) '要素数4
Debug.Print UBound(V) - LBound(V) + 1
ReDim V(1 To 3) '要素数3
Debug.Print UBound(V) - LBound(V) + 1
ツイート | ![]() |