2012-03-20 3 views
20

は、 VBAの型を何も設定しないでください。私は自分の型の変数を定義している

Dim point As DataPoint 

Public Type DataPoint 
    list as Collection 
    name as String 
    number as Integer 
End Type 

を言うと、私は一度変数 pointのすべての値を削除したいです。クラスの場合は、 Set point = New DataPointを使用するか、 Set point = Nothingと設定しますが、それがタイプの場合はどのように進めることができますか?

答えて

23

標準的な方法は、各メンバーを個別にデフォルト値にリセットすることです。これは、オブジェクトに比べてユーザー定義型の1つの制限です。明白なことを述べるのリスクが

With point 
    Set .list = Nothing 
    .name = "" 
    .number = 0 
End With 

代わりに、あなたは「クリア」、それにするたびに「空白」の変数を作成し、それを変数に割り当てることができます。

Dim point As DataPoint 
Dim blank As DataPoint 

With point 
    Set .list = New Collection 
    .list.Add "carrots" 
    .name = "joe" 
    .number = 12 
End With 

point = blank 
' point members are now reset to default values 
+0

よろしくお願いいたします。私はクラス全体を定義したり、すべてのメンバーを個別にリセットする以外に、これに対する解決策があることを期待していました。ブランク変数に関しては、それは参考になります。私はそれを使用することを検討します。 – tyrex

+2

+1ブランクデータポイント –

+0

@FMan:これはクラス全体を定義していません...変数を宣言するだけです。 –

25

VBの関数には、結果を保持する暗黙の変数があり、既定では既定の型の値が含まれているという利点があります。

public function GetBlankPoint() as DataPoint 
end function 

使用法:

point = GetBlankPoint() 
6

EDIT:くそー!ここでD

は1行でそれを達成するための代替である。)

Dim point As DataPoint 
Dim emptyPoint As DataPoint 

Public Type DataPoint 
    list As Collection 
    name As String 
    number As Integer 
End Type 


Sub Sample() 
    '~~> Fill the point 
    Debug.Print ">"; point.name 
    Debug.Print ">"; point.number 
    point.name = "a" 
    point.number = 25 
    Debug.Print ">>"; point.name 
    Debug.Print ">>"; point.number 
    '~~> Empty the point 
    point = emptyPoint 
    Debug.Print ">>>"; point.name 
    Debug.Print ">>>"; point.number 
End Sub 

SNAPSHOT

enter image description here

2

別のオプションは、予約語「空を使用することである:JFCによって打た例えば:

.number =空白

唯一の問題は、数値を整数からバリアントに変更する必要があることです。

0

これは、クラスを使用するほうが優れているため、タイプの名前を持つクラスモジュールを宣言し、すべてのメンバーをpublicとして宣言してから、インスタンスを作成および削除するために自動的に何も設定しないことができます。あなたはクラスモジュールを作成し、あなたのタイプのような名前の後に

構文は次のように気にいらないようになります。

' 
Public List as Collection 
Public Name as String 
Public Number as Long 

Private Sub Class_Initialize() 

'Here you can assign default values for the public members that you created if you want 

End Sub 
+0

私は多くの場合、すべてのメンバー変数を保持するクラス内にプライベート型を作成します。利点は、クラスインスタンスを再作成せずにtype変数= empty変数を設定することによって、すべてのメンバー変数をクリアするために、クラスに "reset()"メソッドを簡単に実装できることです。また、個々のメンバ変数をすべてコピーするのではなく、1つのプライベート型変数をコピーするだけで、 "Copy()"メソッドを簡単に実装できるようになります。 –

1

ワンライナー:

Function resetDataPoint() As DataPoint: End Function 

使用法:

point = resetDataPoint() 
+0

回答済みの1行目のコピーペスターは、2014年3月20日14時10分に検出されました:http://stackoverflow.com/a/9788459/6698332 – user6698332

2

を使用しますVBAのクラスは、それが単一の目的の解決策ではない場合、またはクラスに多すぎるprivate attrあなたがOOPルールを守り、クラスを安全に保つためには、クラスのすべてのプライベート属性のすべてのLetプロパティとGetプロパティを宣言する必要があるからです。これは、50を超えるプライベート属性を持つ場合には、あまりに多くのコーディングです。Excelでクラスを使用することのもう一つのマイナス面は、VBAがOOPを完全にサポートしていないという事実です。ポリモーフィズム、オーバーロードなどはありません)継承を使用したい場合でも、継承されたクラスの元のクラスからすべての属性とメソッドを宣言する必要があります。

この場合、私はJean-FrançoisCorbettまたはGSengが提案したソリューションを好むでしょう。つまり、クリアする変数と同じUDTの空の変数を割り当てたり、あなたのUDT型のemtpy変数に永久メモリを予約しないので、より洗練されたソリューションです。

関連する問題