在VBA中如何将类型设置为空?

25
我定义了一个具有独特类型的变量,比如说:
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个回答

34

你可以从VB中函数有一个隐式变量来保存结果,并且默认情况下包含默认类型值这一事实中受益。

public function GetBlankPoint() as DataPoint
end function

用法:

point = GetBlankPoint()

29

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

冒昧指出:

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

好的,谢谢。我希望有一种解决方法,而不是定义整个类或逐个重置所有成员。至于空变量,那是一个有用的想法。我会考虑使用它。 - tyrex
@FMan:这不是定义整个类,只是声明一个变量。 - Jean-François Corbett
是的,我知道。我评论的第一句话并没有涉及此变量,而只是一个普遍的想法。 - tyrex

9

编辑:哎呀!被JFC打败了 :D

这里有一种实现方法,只需要一行代码就可以实现;)

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

一句话概括:

Function resetDataPoint() As DataPoint: End Function

使用方法:

point = resetDataPoint()

1
检测到已回答Mar 20'12 at 14:10的一行复制代码 :) https://dev59.com/XWkw5IYBdhLWcg3wlrka#9788459 - user6698332

2

另一个选择是使用保留词“Empty”,例如:

.number = Empty

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


2
在VBA中使用类通常是一个好的实践,除非它不是单一目的的解决方案或类不包含太多私有属性,因为如果您想遵守OOP规则并保持类的安全性,您应该为类的所有私有属性声明所有Let和Get属性。如果您有超过50个私有属性,则编码量太大。在Excel中使用类的另一个负面方面是,VBA不完全支持OOP。没有多态,重载等。即使您想使用继承,您也必须在继承类中声明原始类的所有属性和方法。
因此,在这种情况下,我更喜欢Jean-François Corbett或GSeng提出的解决方案,即分配与要清除的变量相同UDT的空变量,或者使用一个函数,因为这似乎更加优雅的解决方案,它不会为您的UDT类型的空变量保留永久内存。

0

因此最好使用类,您可以声明一个名为您类型的类模块,然后将所有成员声明为公共的,然后自动设置为无和新建实例。

在创建类模块并命名为您的类型后,语法将类似于以下内容:

'
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

我经常在类中创建私有类型来保存所有成员变量。好处是,我可以轻松地在类上实现“reset()”方法,通过将类型变量=空变量来清除所有成员变量,而无需重新创建类实例。此外,它使得实现“Copy()”方法非常简单,因为您只需要复制一个私有类型变量,而不是复制所有单个成员变量。 - Joe Bourne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接