Установить тип в VBA ничего? - PullRequest
20 голосов
/ 20 марта 2012

Я определил переменную с собственным типом, скажем

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 ]

26 голосов
/ 20 марта 2012

Вы можете извлечь выгоду из того факта, что функции в VB имеют неявную переменную, которая содержит результат и по умолчанию содержит значение типа по умолчанию.

public function GetBlankPoint() as DataPoint
end function

Использование:

point = GetBlankPoint()
24 голосов
/ 20 марта 2012

Стандартным способом является сброс каждого элемента к его значению по умолчанию индивидуально.Это одно ограничение пользовательских типов по сравнению с объектами.

С риском указать очевидное:

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
7 голосов
/ 20 марта 2012

РЕДАКТИРОВАТЬ : Черт!Побитый 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

SNAPSHOT

enter image description here

2 голосов
/ 13 апреля 2017

Использование классов в VBA обычно является хорошей практикой в ​​случае, если это не одноцелевое решение или класс не содержит слишком много закрытых атрибутов, потому что если вы хотите придерживаться правил ООП и обеспечить безопасность своего класса, вы должны объявить все свойства Let и Get для всех приватных атрибутов класса. Это слишком много кода, если у вас есть более 50 личных атрибутов. Еще одна негативная сторона использования классов в Excel заключается в том, что VBA не полностью поддерживает ООП. Здесь нет полиморфизма, перегрузки и т. Д.) Даже если вы хотите использовать наследование, вы должны объявить все атрибуты и методы исходного класса в унаследованном классе.

Так что в этом случае я бы предпочел решение, предложенное Жаном-Франсуа Корбеттом или GSeng, т.е. присвоение пустой переменной того же UDT, что и переменная, которую вы хотите очистить, или использование функции, которая мне кажется немного более элегантное решение, потому что оно не зарезервирует постоянную память для переменной emtpy вашего типа UDT.

2 голосов
/ 23 ноября 2012

Другой вариант - использовать зарезервированное слово «Пусто», например:

.number = Пусто

Единственная проблема заключается в том, что вам нужно будет изменить число с целого на вариант.

1 голос
/ 05 августа 2016

Однострочник:

Function resetDataPoint() As DataPoint: End Function

Использование:

point = resetDataPoint()
0 голосов
/ 24 апреля 2014

Для этого лучше использовать классы, вы можете объявить модуль класса с именем вашего типа, затем объявить все ваши члены как публичные, затем автоматически вы можете установить ничего и новые для создания и удаления экземпляров.

Синтаксис

будет выглядеть примерно так после того, как вы создадите модуль класса и назовете его так:

'
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...