web-dev-qa-db-ja.com

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を設定しますが、タイプの場合はどうすればよいですか?

21
tyrex

標準的な方法は、各メンバーを個別にデフォルト値にリセットすることです。これは、オブジェクトと比較したユーザー定義型の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()
28
GSerg

[〜#〜]編集[〜#〜]:くそー! 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

[〜#〜]スナップショット[〜#〜]

enter image description here

7
Siddharth Rout

VBAでクラスを使用することは、それが単一目的のソリューションではない場合、またはクラスに含まれるプライベート属性が多すぎない場合に、通常は良い習慣です。OOPルールを順守し、クラスを維持したい場合安全です。クラスのすべてのプライベート属性のすべてのLetおよびGetプロパティを宣言する必要があります。50を超えるプライベート属性がある場合、これはコーディングが多すぎます。Excelでクラスを使用するもう1つの欠点は、VBAが完全にはサポートしていないことですOOP。ポリモーフィズムやオーバーロードなどはありません。)継承を使用したい場合でも、継承されたクラスの元のクラスからすべての属性とメソッドを宣言する必要があります。

したがって、この場合、Jean-FrançoisCorbettまたはGSengによって提案された解決策、つまり、クリアしたい変数と同じUDTの空の変数を割り当てるか、関数を使用することをお勧めします。 UDTタイプのemtpy変数用の永続メモリは予約されません。

2
xlNoobie

一発ギャグ:

Function resetDataPoint() As DataPoint: End Function

使用法:

point = resetDataPoint()
2
Unicco

別のオプションは、次のように予約語「空」を使用することです。

.nu​​mber =空

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

2
Brian Geniusz

そのためには、クラスを使用する方がよいため、自分のタイプの名前でクラスモジュールを宣言してから、すべてのメンバーをパブリックとして宣言すると、インスタンスの作成と削除で自動的に何も新規に設定できなくなります。

クラスモジュールを作成し、タイプのように名前を付けた後、構文は次のようになります。

'
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
Edgar Barrera