Классы и объекты Не проверяйте самосоздающиеся объекты , используя Is Nothing Если вы объявляете переменные объектного типа as New ClassName то проверять существование этого объекта с помощью IsNothing нельзя: Dim x As New MyClass If x Is Nothing Then ' Код в этом месте никогда не исполняется End If Бэйсик тихо создаст для вас инстанс такого класса. И все. Будьте внимательны. Использование свойств "по умолчанию" может скрывать ошибку Опять же, при использовании свойств по умолчанию надо быть внимательным в написании кода: ' В CPerson класс модуле Public Name As String ' в простом модуле формы Private Sub Command1_Click() Dim A As New CPerson Dim B As CPerson Dim C As New CPerson ' Создаем три переменных одного обьектного типа A.Name = "Просто Имя" ' Дальше - ошибка , пропущено ключевое слово SET B = A C = A End Sub Внимание! - Свойства типа Variant могут передавать объект В продолжении предыдущего пункта - все привыкли пользоваться свойствами "по умолчанию" - в самом деле куда проще передать текстбоксу - text1 = "anytext " Это может привести к ошибке: Public Sub ToInt(AnyText as Variant) MYINT = CINT(Val(anytext)) end sub text1 = "123" call ToInt(text1) Свойства типа Variant могут передавать объект Если вы создаете Variant свойство, допускающее хранение объекта или любое другое значение , вам надо аккуратно написать Property процедуры для этого объекта. Их должно быть три - Property Get, Let и Set. Property Set будет принимать объектные значения, Property Let все остальные. Однако Property Get всего одна, и должна применяться в обоих случаях. Реализуется это так: ' свойство Tag принимает обьект или не обьектное значение. Dim m_Tag As Variant Property Get Tag() As Variant If IsObject(m_Tag) Then Set Tag = m_Tag Else Tag = m_Tag End If End Property ' Эта процедура вызывается для объектов Property Set Tag(newValue As Variant) Set m_Tag = newValue End Property ' А эта во всех иных случаях Property Let Tag(newValue As Variant) m_Tag = newValue End Property ByVal при ссылках на объекты Когда вы передаете в процедуру аргумент, и не хотите быть уверены, что после выхода из процедуры значение этого аргумента останется неизменным - вы используете передачу аргумента по значению (ByVal) Это работает до тех пор, пока вы не начнете передавать объекты: Sub ClearInvoice (ByVal inv As CInvoice) ' в следующей строчке свойство обьекта будет изменено inv.Total = 0 End Sub В самом деле это не баг Бэйсика. Сам обьект не может быть изменен. допустимо изменение только его свойств. Sub DestroyInvoice (inv As CInvoice) Set inv = Nothing 'Запросто End Sub Sub DestroyInvoice2 (ByVal inv As CInvoice) Set inv = Nothing ' Вот это не выйдет Set inv = New Invoice ' Не пройдет то же End Sub