Установить тип в VBA на ничего?
Я определил переменную с собственным типом, скажем
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
, но как я могу продолжить, если это тип?
Ответы
Ответ 1
Стандартный способ состоит в reset каждом члене по умолчанию по умолчанию. Это одно ограничение пользовательских типов по сравнению с объектами.
рискуя заявить очевидное:
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
Вы можете воспользоваться тем фактом, что функции в VB имеют неявную переменную, которая содержит результат, и которая по умолчанию имеет значение по умолчанию.
public function GetBlankPoint() as DataPoint
end function
Использование:
point = GetBlankPoint()
Ответ 3
ИЗМЕНИТЬ: Черт! Избито 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]()
Ответ 4
Другой вариант - использовать зарезервированное слово "Пусто", например:
.number = Empty
Единственная проблема заключается в том, что вам нужно будет изменить число от целого к варианту.
Ответ 5
Использование классов в VBA обычно является хорошей практикой в случае, если это не единственное целевое решение, или класс не содержит слишком много частных атрибутов, потому что если вы хотите придерживаться правил ООП и держать свой класс в безопасности, вы должны объявить все свойства Let и Get для всех частных атрибутов класса. Это слишком много кодирования, если у вас более 50 частных атрибутов. Другой отрицательной стороной использования классов в excel является факт, что VBA не полностью поддерживает ООП. Полиморфизм, перегрузка и т.д. Не существует). Даже если вы хотите использовать наследование, вы должны объявить все атрибуты и методы из исходного класса в унаследованном классе.
Итак, в этом случае я предпочел бы решение, предложенное Жаном-Франсуа Корбеттом или GSeng, т.е. назначить пустую переменную того же UDT, что и переменная, которую вы хотите очистить, или использовать функцию, которая для меня кажется немного более элегантное решение, поскольку оно не будет сохранять постоянную память для переменной emtpy вашего типа UDT.
Ответ 6
Однострочник:
Function resetDataPoint() As DataPoint: End Function
Использование:
point = resetDataPoint()
Ответ 7
Для того, чтобы лучше использовать классы, вы можете объявить модуль класса с именем своего типа, а затем объявить всех своих членов общедоступными, а затем автоматически вы можете установить ничего и новое для создания и удаления экземпляров.
Синтаксис будет таким же, как после создания модуля класса и названного как ваш тип:
'
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