将VBA中的类型设置为空?

时间:2012-03-20 14:01:57

标签: vba object variables user-defined-types

我已经定义了一个具有自己类型的变量,比如说

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,但如果是类型,我该怎么办?

7 个答案:

答案 0 :(得分:26)

VB中的函数具有保存结果的隐式变量,并且默认情况下包含默认类型值。

public function GetBlankPoint() as DataPoint
end function

用法:

point = GetBlankPoint()

答案 1 :(得分:24)

标准方法是将每个成员单独重置为其默认值。与对象相比,这是用户定义类型的一个限制。

冒着说明显而易见的风险:

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

答案 2 :(得分:7)

编辑:该死的!遭到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

答案 3 :(得分:2)

另一种选择是使用保留字&#34;空&#34;如:

.number = Empty

唯一的问题是您需要将数字从整数更改为变体。

答案 4 :(得分:2)

在VBA中使用类通常是一种很好的做法,如果它不是单一用途的解决方案或类不包含太多的私有属性,因为如果你想遵守OOP规则并保证你的类安全,你应该声明所有类的所有私有属性的Let和Get属性。如果您拥有超过50个私有属性,则编码过多。在excel中使用类的另一个消极方面是事实,即VBA不完全支持OOP。没有多态,重载等。)即使你想使用继承,你也必须声明继承类中原始类的所有属性和方法。

所以在这种情况下我更喜欢Jean-FrançoisCorbett或GSeng建议的解决方案,即分配一个与你要清除的变量相同的UDT的空变量,或者使用一个对我来说似乎更多的函数优雅的解决方案,因为它不会为UDT类型的emtpy变量保留永久内存。

答案 5 :(得分:1)

一衬垫:

Function resetDataPoint() As DataPoint: End Function

用法:

point = resetDataPoint()

答案 6 :(得分:0)

为了更好地使用类,您可以使用类型名称声明一个类模块,然后将所有成员声明为public,然后自动设置为nothing和create for create和delete instance。

在创建类模块并命名为类型之后,

语法将是这样的:

'
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