独自の型で変数を定義しました。
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
を設定しますが、タイプの場合はどうすればよいですか?
標準的な方法は、各メンバーを個別にデフォルト値にリセットすることです。これは、オブジェクトと比較したユーザー定義型の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
VBの関数には、結果を保持する暗黙の変数があり、デフォルトでデフォルトの型値が含まれているという事実から恩恵を受けることができます。
public function GetBlankPoint() as DataPoint
end function
使用法:
point = GetBlankPoint()
[〜#〜]編集[〜#〜]:くそー! JFCによって打たれる: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
[〜#〜]スナップショット[〜#〜]
VBAでクラスを使用することは、それが単一目的のソリューションではない場合、またはクラスに含まれるプライベート属性が多すぎない場合に、通常は良い習慣です。OOPルールを順守し、クラスを維持したい場合安全です。クラスのすべてのプライベート属性のすべてのLetおよびGetプロパティを宣言する必要があります。50を超えるプライベート属性がある場合、これはコーディングが多すぎます。Excelでクラスを使用するもう1つの欠点は、VBAが完全にはサポートしていないことですOOP。ポリモーフィズムやオーバーロードなどはありません。)継承を使用したい場合でも、継承されたクラスの元のクラスからすべての属性とメソッドを宣言する必要があります。
したがって、この場合、Jean-FrançoisCorbettまたはGSengによって提案された解決策、つまり、クリアしたい変数と同じUDTの空の変数を割り当てるか、関数を使用することをお勧めします。 UDTタイプのemtpy変数用の永続メモリは予約されません。
一発ギャグ:
Function resetDataPoint() As DataPoint: End Function
使用法:
point = resetDataPoint()
別のオプションは、次のように予約語「空」を使用することです。
.number =空
唯一の問題は、数値を整数からバリアントに変更する必要があることです。
そのためには、クラスを使用する方がよいため、自分のタイプの名前でクラスモジュールを宣言してから、すべてのメンバーをパブリックとして宣言すると、インスタンスの作成と削除で自動的に何も新規に設定できなくなります。
クラスモジュールを作成し、タイプのように名前を付けた後、構文は次のようになります。
'
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