Страницы: 1
RSS
vba Установить значение UDT-свойства экземпляра класса
 
Здравствуйте.
Подскажите, пожалуйста, как в примере установить требуемое значение для свойства пользовательского типа для созданного экземпляра.
 
Код
Sub adsf()
    Dim d As New Class1
    Dim v As DateDate
    v.A = Date
    v.B = Date + 1
    d.tst = v
    Debug.Print d.tst.A, d.tst.B
End Sub
 
Спасибо. Иначе говоря достичь написания кода по типу "ActiveCell.Borders.Color = ..." нельзя(
Плюс теряются инициализированные предзначения.
 
Цитата
vladjuha написал:
достичь написания кода по типу "ActiveCell.Borders.Color = ..." нельзя(
Почему нельзя? Просто другой код позаботился о существовании коллекции Borders у объектного свойства ActiveCell объекта Application.
 
Цитата
vladjuha написал: "ActiveCell.Borders.Color = ..." нельзя(
При чем здесь UDT? В ActiveCell.Borders.Color элемент ActiveCell это класс, у которого есть свойство Borders, которое является экземпляром другого класса, в котором есть, в том числе, свойство Color.
Добавлено:
В строке Лист1.Range("A1").Borders.Color установите курсор внутрь Range и нажмите Shift-F2 - увидите там Property Range(Cell1, [Cell2]) As Range кликните на Range в конце этой строки и увидите Class Range.
То же самое с Borders - Property Borders As Borders - Class Borders
А вот Color уже просто свойство класса Borders - Property Color As Variant
Изменено: ZVI - 12.08.2017 11:15:48
 
ZVI, спасибо, теперь стало понятно
Изменено: vladjuha - 12.08.2017 11:12:08
 
Добавил в сообщение #5 как посмотреть цепочку классов
 
Цитата
vladjuha написал:
написания кода по типу "ActiveCell.Borders.Color = ..."
Модуль Class1
Код
Private d_ As Class2

Public Property Get d() As Class2
Set d = d_
End Property

Private Sub Class_Initialize()
Set d_ = New Class2
End Sub

Модуль Class2
Код
Private a_ As Date, b_ As Date

Public Property Get a() As Date
a = a_
End Property

Public Property Let a(ByRef v As Date)
a_ = v
End Property

Public Property Get b() As Date
b = b_
End Property

Public Property Let b(ByRef v As Date)
b_ = v
End Property

Станд. модуль
Код
Sub asdf()
Dim c As New Class1
c.d.a = Now
c.d.b = Now + 1
Debug.Print c.d.a & "      " & c.d.b
End Sub
 
AAF, спасибо за конкретное решение.
А есть какой нюансик, между вариантами
Код
Private d_ As Class2
...
Private Sub Class_Initialize()
  Set d_ = New Class2
...
и, если сразу:
Код
Private d_ As New Class2
Может в скорости где выигрыш (если в цикле в большом кол-ве создаются экземпляры, например), или ещё что?
Изменено: vladjuha - 13.08.2017 02:26:36
 
Будьте добры, ещё такой дополняющий вопрос.
Можно ли создать для класса метод по умолчанию, наподобие, как я могу обращаться к элементу в Dictionary минуя .Item(), т.е. Dic("key") = ... ?

Добавлено:

Со вторым вопросом разобрался, инструкция
А с первым всё ещё интересно: есть ли (академическая) разница между Private d_ As New Class2 и Class_Initialize() Set d_ = New Class2
Изменено: vladjuha - 13.08.2017 03:17:59
 
По мне лучше, дабы избежать возможных Nothing
Код
Private d_ As New Class2 
 
Цитата
vladjuha написал:
метод по умолчанию, наподобие, как я могу обращаться к элементу в Dictionary минуя .Item(), т.е. Dic("key") = ... ?
думается мне - это не метод, а свойство...
Андрей VG хорошо описывал здесь в #15 на примере использования JsonBag Class (встречается на сайте)
Property Get
Property Let
Изменено: JeyCi - 14.08.2017 10:12:39
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
vladjuha написал:
какой нюансик
Здесь пишут, что желателен первый вариант.
Скрытый текст

И Вы наверное знаете про позднее связывание (late binding) и раннее связывание (early binding)
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх