web-dev-qa-db-fra.com

Définir un type dans VBA à rien?

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?

20
tyrex

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
24

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()
26
GSerg

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É

enter image description here

6
Siddharth Rout

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.

2
xlNoobie

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.

2
Brian Geniusz

Bon mot:

Function resetDataPoint() As DataPoint: End Function

Usage:

point = resetDataPoint()
1
Unicco

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