2009-04-06 11 views
1

フォームを作成するために使用するいくつかのデータを格納するユーザー定義型を作成しました。私はそのユーザー定義型の配列を利用していますが、オフサイトサーバーからデータを取得するときに配列のサイズを変更します。Excel VBA - 空のユーザータイプを初期化し、NULLを検出する

消化する私のプログラムを容易にするために、私は、サブルーチンに分割し始めています。しかし、私のプログラムが初期化されるとき、私は特定の配列が初期化されたことを知ることができないので、配列が空であるかどうかを調べるためにサイズ関数を呼び出すことができないことは確かではありません。

ヌルユーザタイプを空のユーザタイプを初期化または検出する方法はありますか?現在、私はそれをハードコーディングしています。より洗練されたソリューションを好むでしょう。

答えて

2

私の知る限り、あなたは、ユーザー定義型が初期化されたかどうかをチェックすることができませんプロシージャ/ファンクションの引数として使用します。

私は、郡のフィールドを使用すると、ベース値を使用することができますいくつかの値に初期化されたVBAのヘルプ

 

Type StateData 
    CityCode(1 To 100) As Integer  ' Declare a static array. 
    County As String * 30 
End Type 
 

からこの例を引用しています。 ユーザーがこのフィールドを明示的に設定した場合、ある値を保持していることを意味します。&は未初期化のままです。

Sub main() 
    Dim example As StateData 
    MsgBox IsInitialized(example) 

    Dim example2 As StateData 
    example2.County = "LA" 
    MsgBox IsInitialized(example2) 
End Sub 
Function IsInitialized(arg As StateData) As Boolean 
    Dim initCounty As String * 30 
    IsInitialized = (arg.County <> initCounty) 
End Function 
+0

ええ、私はhaventユーザー定義型の初期化を確認する方法を発見しました。助けてくれてありがとう。 – jrsconfitto

0
If myObjectVariable is Nothing 

は、オブジェクトが初期化されているかどうかを検出する必要があります。

編集: "何もない" それはオブジェクト変数の場合、作業を行います。

Dim blah As Object 
If blah Is Nothing Then 
    MsgBox "blah is nothing!" 
End If 

Dim foo as variant 
If IsEmpty(foo) Then 
    MsgBox "foo is empty!" 
End If 
+0

didntの仕事!申し訳ありませんが、私は構造体/ユーザー型ではなく、オブジェクトを作成したことに言及することを忘れていました。 – jrsconfitto

+0

は、 "オブジェクトが必要です"というランタイムエラーが発生します。 – user53794

1

試してみてください。のisEmptyに加えて

dim v 

if isempty(v) then 
    msgbox "is empty" 
end if 
+0

私はそれが無関係かもしれないと思うが、私は "私はこのコードをしようとすると、"パブリックオブジェクトモデルで定義された唯一のユーザー定義型は、バリアントに強制的にまたは遅延バインドされた関数に渡すことができます。 – jrsconfitto

5

(配列)ソリューション -

それが送信された前
If IsNull(array) then 

    msgbox "array is empty" 

End If 
+0

ねえ。私はrbobbyのソリューションで上記のようにあなたの提案と同じコンパイラエラーを取得します。何か案は? – jrsconfitto

0

カスタムタイプの全体の動的配列が初期化されていないか(だけではなく、特定の要素)VBAで、これは直接(のisEmptyなどの機能の作品のどれもできない可能性がありますされたかどうかを確認する必要がある場合カスタムタイプの場合)。しかし、プログラムを簡単に再構築して、サイズ0のカスタムタイプの配列を返すことで、何も読み込み/初期化されていないことを示すことができます。

Private Function doStuff() As customType() 
    Dim result() As customType 

    ' immediately size it to 0 and assing it as result 
    ReDim result(0) 
    doStuff = vysledek 

    ' do real stuff, ... premature "Exit Function" will return an array of size 0 
    ' possibly return initialized values 
End Function 

' then you can all 
If (UBound(tabulky) = 0) Then 
    MsgBox "Nope, it is not initialized." 
End If 
関連する問題