VBA - Възможно ли е да се предаде свойство на обект като аргумент в метод?

Доста съм свикнал с VBA, но не толкова с Objects, но в момента се сблъсквам със стената...

Моят конфигурационен клас има почти 100 свойства, така че няма да ги изпращам тук, тъй като подробностите нямат особено значение за моя въпрос.

Надявах се да кодирам дублираща се функция, да създам множество обекти от един и след това да присвоя различни стойности за конкретно свойство на всеки нов обект (добавете нови елементи към конфигурациите, така че той генерира нови конфигурации), които ще изглеждат така:

Public Function Duplicate(SrcCfg As Config, PropertyName As String, Properties As String) As Collection
Dim Cc As Collection, _
    Cfg As Config, _
    TotalNumber As Integer, _
    A() As String

Set Cc = New Collection
A = Split(Properties, "/")
TotalNumber = UBound(A)

For i = 0 To TotalNumber
    'Create a copy of the source object
    Set Cfg = SrcCfg.Copy
    'Set the property for that particular copy
    Cfg.PropertyName = A(i)
    'Add that copy to the collection
    Cc.Add ByVal Cfg
Next i

    Duplicate = Cc
End Function

Но не съм сигурен, че една колекция е най-добрият резултат (тъй като ще взема резултатите и ще ги включа в друга основна колекция), така че съм отворен за предложения.

И съм почти сигурен, че не можем да предадем собственост като аргумент (прекарах доста време в търсене на решение за това...) и не знам какво да правя тъй като това би било супер практично за мен. Така че, ако има решение или заобиколно решение, с удоволствие ще го опитам!

Ето и останалите ми методи:

Friend Sub SetConfig(SrcConfig As Config)
    Config = SrcConfig
End Sub

Public Function Copy() As Config
    Dim Result As Config
    Set Result = New Config
    Call Result.SetConfig(Config)
    Set Copy = Result
End Function


Краен код за дублиране на обект:


Работи гладко:

Private Cfg As Config

Friend Sub SetConfig(SrcConfig As Config)
    Set Cfg = SrcConfig
End Sub

Public Function Copy() As Config
    Dim Result As Config
    Set Result = New Config
    Call Result.SetConfig(Cfg)
    Set Copy = Result
End Function

Public Function Duplicate(PropertyName As String, Properties As String) As Collection
Dim Cc As Collection, _
    Cfg As Config, _
    TotalNumber As Integer, _
    A() As String

Set Cc = New Collection
A = Split(Properties, "/")
TotalNumber = UBound(A)

For i = 0 To TotalNumber
    'Create a copy of the source object
    Set Cfg = Me.Copy
    'Set the property for that particular copy
    CallByName Cfg, PropertyName, VbLet, A(i)
    'Add that copy to the collection
    Cc.Add Cfg
Next i

    Set Duplicate = Cc
End Function

person R3uK    schedule 17.07.2015    source източник
comment
Може би вижте отговора на Скот тук: stackoverflow.com /questions/4805475/   -  person Tim Williams    schedule 17.07.2015
comment
@TimWilliams : Thx, започнах с този отговор, за да създам метода .copy и той наистина беше наистина полезен!   -  person R3uK    schedule 17.07.2015


Отговори (1)


Всъщност разбрахте правилно, включително типовете (String).

Просто сменете вашия

Cfg.PropertyName = A(i)

с

CallByName Cfg, PropertyName, vbLet, A(i)

Името на свойството трябва да бъде предадено като низ, а не препратка или ламбда или нещо подобно, така че тук няма помощ за безопасност на типа или компилатор. Ще имате грешка по време на изпълнение, ако грешите в името.

Що се отнася до типа връщане, VBA няма списъци, така че колекцията обикновено е добре, но тъй като във вашия конкретен случай знаете предварително колко обекта ще върнете, можете да декларирате масив:

Dim Cc() As Config
ReDim Cc(1 to TotalNumber)

Във всеки случай бихте могли да декларирате масив, но ако не знаете общия брой, ще го преразпределяте при всяка итерация.

person GSerg    schedule 17.07.2015
comment
Благодаря за бързия отговор, обичам да чета, че Е възможно! ‹3 Моят уикенд ще бъде много по-приятен! :) Ще опитам това скоро и тогава ще потвърдя отговора, ако това не е проблем за вас! - person R3uK; 17.07.2015
comment
Тествах го и работи страхотно! :) Благодаря за информация и ще публикувам моя актуализиран код, така че да е по-ясен за хората, когато дойдат - person R3uK; 20.07.2015
comment
Само малък въпрос, тъй като не съм сигурен за това, но използвам персонализиран обект като аргумент и все пак това е обектен метод, така че мога ли да променя Set Cfg = SrcCfg.Copy на Set Cfg = Me.Copy и да се отърва от аргумента? Изглежда доста логично, но за първи път наистина работя с VBA обекти - person R3uK; 21.07.2015