2009-07-16 19 views
2

VBScriptで配列内の要素の数を判断する「最良の方法」とは何ですか?VBScript:配列内のnull以外の要素の数の確認

UBound()は、配列に割り当てられたスロットの数を示しますが、入力されるスロットの数は表示されません。状況によっては、同じ数であってもなくてもかまいません。

答えて

4

まず最初に、vbUndefinedと呼ばれる定義済みの識別子がありません。現在受け入れられている回答は暗示しているようです。このコードは、スクリプトの先頭にOption Explicitがない場合にのみ機能します。まだOption Explicitを使用していない場合は、そうすることで、あなたはあらゆる悲しみを救います。

あなたがvbUndefinedの代わりに使用できる値はEmptyあり、例えば、: -

If arr(x) = Empty Then ... 

Empty識別し、定義済みで、まだ値を持っていない変数や配列要素のデフォルト値ですそれに割り当てられている。

しかし、気を付けるとちゃんがあります。すべて表示真次の文: -

MsgBox 0 = Empty 
MsgBox "" = Empty 
MsgBox CDate("30 Dec 1899") = True 

したがって、あなたはそれをカットしていない空にするために、比較配列要素の有効な定義された値であることを、これらの値のいずれかを期待しています。

あなたは本当に要素が本当に「未定義」であることはIsEmpty機能を使用「空」であることを確認したい場合: - パラメータそれは実際に適切にEmpty場合

If IsEmpty(arr(x)) Then 

IsEmptyにのみtrueを返します。

また、別の問題があります。Nullは、配列または変数に保持できる値です。しかし: -

MsgBox Null = Empty 

は "ヌルの無効な使用"、ランタイムエラーであり、: -

MsgBox IsEmpty(Null) 

はfalseです。したがって、Nullが未定義か、有効な値かどうかを判断する必要があります。 Nullもあなたのように見えるためにあなたのIfの文必要がある未定義を意味している場合: -

If IsEmpty(arr(x)) Or IsNull(arr(x)) Then .... 

をあなたはNullアレイに割り当てることはありません知っていれば、これを放棄することができるかもしれません。

+1

あなたのコメントは素晴らしく、OPの元の質問とはまったく関係がありますが、私の時間の5分を無駄にしただけで、神はこの質問に遭遇した他の人の時間を知っています。配列が空であるかどうかを判断する方法や、Emptyプロパティ間のニュアンスを調べる方法は、配列内の要素数を決定することではありませんでした。 OPの質問に対する答えをあなた自身で省略している間に、あなたが間違っていると感じた別の回答にコメントを投稿している理由を私は知りません。 – Matt

2

埋め込まれている要素を示すために何も組み込まれていません。最良の方法は、配列から要素を追加/削除する際に、count変数を使用してこれを追跡することです。スペンサーRuportは、それがそもそも追跡自分を保つために、おそらく良いでしょう、言うように

Function countEmptySlots(arr) 
    Dim x, c 
    c = 0 
    For x = 0 To ubound(arr) 
     If arr(x) = vbUndefined Then c = c + 1 
    Next 
    countEmptySlots = c 
End Function 

:私はここに、これを行うための非反復法を認識していないよ

4

は反復法です。

+0

これは実際に私が望んだのと反対のものですが、テクニックはまったく同じように動作します(空白のスロットを探して、arr(x)<> vbUndefinedを比較します)。 – TSomKes

+1

もっと包括的な解決策については、AnthonyWJonesの回答を参照してください。 –

+0

後世のために、私はAnthonyWJonesによって与えられた答えに選択された答えを変更しています。 (ありがとう、クリス) – TSomKes

関連する問題