Set a type in VBA to nothing?

后端 未结 7 1266
隐瞒了意图╮
隐瞒了意图╮ 2021-02-12 10:40

I have defined a variable with an own type, say

Dim point As DataPoint

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


        
相关标签:
7条回答
  • 2021-02-12 10:54

    Another option is to use the reserved word "Empty" such as:

    .number= Empty

    The only issue is that you will need to change the number from integer to variant.

    0 讨论(0)
  • 2021-02-12 10:56

    The standard way is to reset each member to its default value individually. This is one limitation of user-defined types compared to objects.

    At the risk of stating the obvious:

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

    Alternatively, you can create a "blank" variable and assign it to your variable each time you want to "clear" it.

    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
    
    0 讨论(0)
  • 2021-02-12 10:57

    For that is better to use classes, you can declare a class module with the name of your type, then declare all of your members as public, then automatically you can set to nothing and new for create and delete instances.

    syntax will be somthing like this after you create the class module and named like your 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 讨论(0)
  • 2021-02-12 10:59

    EDIT: Damn! Beaten by JFC :D

    Here is an alternative to achieve that in 1 line ;)

    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
    

    SNAPSHOT

    enter image description here

    0 讨论(0)
  • 2021-02-12 11:01

    You can benefit from the fact that functions in VB have an implicit variable that holds the result, and that contains the default type value by default.

    public function GetBlankPoint() as DataPoint
    end function
    

    Usage:

    point = GetBlankPoint()
    
    0 讨论(0)
  • 2021-02-12 11:14

    Using classes in VBA is usually a good practice in case it is not a single purpose solution or the class do not contain too many private attributes because if you want to adhere on OOP rules and keep your class safe, you should declare all the Let and Get properties for all private attributes of class. This is too much coding in case you have more than 50 private attributes. Another negative side of using classes in excel is fact, that VBA do not fully support the OOP. There is no polymorfism, overloading, etc.) Even you want to use an inheritance, you have to declare all the attributes and methods from the original class in the inherited class.

    So in this case I would prefer the solution suggested by Jean-François Corbett or GSeng, i.e. to assign an empty variable of the same UDT as the variable you want to clear or to use a function which to me seems little bit more elegant solution because it will not reserve permanent memory for the emtpy variable of your UDT type.

    0 讨论(0)
提交回复
热议问题