webentwicklung-frage-antwort-db.com.de

Einen Typ in VBA auf nichts setzen?

Ich habe beispielsweise eine Variable mit einem eigenen Typ definiert

Dim point As DataPoint

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

und ich möchte alle Werte der Variablen point auf einmal löschen. Wenn es eine Klasse wäre, würde ich einfach Set point = New DataPoint verwenden oder Set point = Nothing setzen. Wie kann ich aber vorgehen, wenn es sich um einen Typ handelt?

20
tyrex

Standardmäßig wird jedes Mitglied einzeln auf seinen Standardwert zurückgesetzt. Dies ist eine Einschränkung von benutzerdefinierten Typen im Vergleich zu Objekten.

Auf das Risiko des Offensichtlichen hinweisen:

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

Alternativ können Sie eine "leere" Variable erstellen und sie Ihrer Variablen jedes Mal zuweisen, wenn Sie sie "löschen" möchten.

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

Sie können davon profitieren, dass Funktionen in VB eine implizite Variable haben, die das Ergebnis enthält und die standardmäßig den Standardtypwert enthält.

public function GetBlankPoint() as DataPoint
end function

Verwendungszweck:

point = GetBlankPoint()
26
GSerg

EDIT: Verdammt! Von JFC geschlagen: D

Hier ist eine Alternative, um das in einer Zeile zu erreichen;)

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

MOMENTAUFNAHME

enter image description here

6
Siddharth Rout

Die Verwendung von Klassen in VBA ist in der Regel eine bewährte Methode, wenn es sich nicht um eine Einzellösung handelt oder die Klasse nicht zu viele private Attribute enthält. Wenn Sie die OOP - Regeln einhalten und Ihre Klasse schützen möchten, müssen Sie dies tun sollte alle Let- und Get-Eigenschaften für alle privaten Attribute der Klasse deklarieren. Dies ist zu viel Code für den Fall, dass Sie mehr als 50 private Attribute haben. Eine andere negative Seite der Verwendung von Klassen in Excel ist die Tatsache, dass VBA die OOP nicht vollständig unterstützt. Es gibt keinen Polymorfismus, keine Überladung usw.) Selbst wenn Sie eine Vererbung verwenden möchten, müssen Sie alle Attribute und Methoden der ursprünglichen Klasse in der geerbten Klasse deklarieren.

In diesem Fall würde ich die von Jean-François Corbett oder GSeng vorgeschlagene Lösung vorziehen, dh eine leere Variable desselben UDTs als zu löschende Variable zuweisen oder eine Funktion verwenden, die mir etwas eleganter erscheint es wird keinen permanenten Speicher für die Emtpy-Variable Ihres UDT-Typs reservieren.

2
xlNoobie

Eine andere Option ist die Verwendung des reservierten Wortes "Empty", z.

.number = leer

Das einzige Problem ist, dass Sie die Zahl von Ganzzahl in Variante ändern müssen.

2
Brian Geniusz

Einzeiler:

Function resetDataPoint() As DataPoint: End Function

Verwendungszweck:

point = resetDataPoint()
1
Unicco

Um Klassen besser verwenden zu können, können Sie ein Klassenmodul mit dem Namen Ihres Typs deklarieren und dann alle Ihre Mitglieder als öffentlich deklarieren. Anschließend können Sie für das Erstellen und Löschen von Instanzen automatisch nichts und Neues festlegen.

die Syntax wird ungefähr so ​​aussehen, wenn Sie das Klassenmodul erstellen und wie Ihr Typ benannt haben:

'
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