J'ai défini une variable avec un type propre, disons
Dim point As DataPoint
Public Type DataPoint
list as Collection
name as String
number as Integer
End Type
et je veux supprimer toutes les valeurs de la variable point
à la fois. Si c'était une classe, je voudrais simplement utiliser Set point = New DataPoint
ou définir Set point = Nothing
, mais comment puis-je continuer si c'est un type?
La méthode standard consiste à réinitialiser chaque membre à sa valeur par défaut individuellement. Il s'agit d'une limitation des types définis par l'utilisateur par rapport aux objets.
Au risque de poser l'évidence:
With point
Set .list = Nothing
.name = ""
.number = 0
End With
Vous pouvez également créer une variable "vide" et l'affecter à votre variable chaque fois que vous souhaitez "l'effacer".
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
Vous pouvez tirer parti du fait que les fonctions de VB ont une variable implicite qui contient le résultat et qui contient la valeur de type par défaut, par défaut.
public function GetBlankPoint() as DataPoint
end function
Usage:
point = GetBlankPoint()
EDIT: Zut! Battu par JFC: D
Voici une alternative pour y parvenir en 1 ligne;)
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
INSTANTANÉ
L’utilisation de classes dans VBA est généralement une bonne pratique si ce n’est pas une solution à objectif unique ou si la classe ne contient pas trop d’attributs privés, car si vous souhaitez respecter les règles OOP et protéger votre classe, vous devez devrait déclarer toutes les propriétés Let et Get pour tous les attributs privés de la classe. C'est trop de codage si vous avez plus de 50 attributs privés. Un autre aspect négatif de l’utilisation de classes dans Excel est le fait que VBA ne prend pas complètement en charge la POO. Il n'y a pas de polymorfisme, de surcharge, etc.) Même si vous souhaitez utiliser un héritage, vous devez déclarer tous les attributs et méthodes de la classe d'origine dans la classe héritée.
Donc dans ce cas, je préférerais la solution proposée par Jean-François Corbett ou GSeng, c’est-à-dire d’affecter une variable vide du même UDT à la variable que vous voulez effacer ou d’utiliser une fonction qui me semble une solution un peu plus élégante, il ne réservera pas de mémoire permanente pour la variable emtpy de votre type UDT.
Une autre option consiste à utiliser le mot réservé "Vide" tel que:
.number = Vide
Le seul problème est que vous devrez changer le nombre de entier en variant.
Bon mot:
Function resetDataPoint() As DataPoint: End Function
Usage:
point = resetDataPoint()
Pour cela, il est préférable d’utiliser des classes. Vous pouvez déclarer un module de classe avec le nom de votre type, puis déclarer tous vos membres en tant que public, puis définir automatiquement les options néant et nouveau pour créer et supprimer des instances.
la syntaxe ressemblera à ceci après la création du module de classe et sera nommée comme votre type:
'
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