Подтвердить что ты не робот

Установить тип в 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, но как я могу продолжить, если это тип?

4b9b3361

Ответ 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