VBA MS Access 2010 Как вызвать подпрограмму объекта?

Я пытался создать подпрограмму в VBA для своего приложения Access:

Public Sub addProduct(ByRef Product As Product, AsFoo As Integer, Optional Mutual As Boolean = True)
    Products.Add (Product)

    If (Mutual) Then
        Select Case AsFoo
            Case 0
                Product.setProjectmanager = Me
            Case 1
                Product.setVIP1 = Me
            Case 2
                Product.setVIP2 = Me
            Case 11
                Product.setVIP1A = Me
            Case 22
                Product.setVIP2A = Me
        End Select
    End If
End Sub

Это нужно просто добавить данный Продукт в Коллекцию Продуктов и установить ссылку на ссылку Пользователя, если Взаимная имеет значение true.

Это должно работать... проблема в том, что я не знаю, как это назвать, моя текущая попытка:

User.addProduct(Product, 0, True)

Но IDE хочет иметь = в конце, поэтому я подумал, что это сработает:

User.addProduct(Product, 0, True) = Product

Но это вызывает ошибку компиляции: Expected function or Variable


person Oli    schedule 05.07.2012    source источник
comment
Вам нужно объявить общедоступную функцию: общедоступная подпрограмма не возвращает значения или объекты.   -  person html_programmer    schedule 05.07.2012
comment
Но я не хочу что-то возвращать, он должен просто добавить этот продукт в эту коллекцию пользователя. Есть ли способ добиться этого?   -  person Oli    schedule 05.07.2012
comment
Разве вам не нужно использовать Set при назначении Product.setProjectmanager = Me, потому что Me является объектом?   -  person Gaffi    schedule 05.07.2012
comment
Кроме того, @KimGysen упомянул, что вам нужна функция для возврата значения, но User.addProduct(Product, 0, True) = Product выглядит так, как будто вы имеете в виду Product = User.addProduct(Product, 0, True)...?   -  person Gaffi    schedule 05.07.2012
comment
@Graffi 1-й, ммм, да, я так думаю, спасибо за это. и 2-й нет, на самом деле я хочу первую строку: User.addProduct(Product, 0, True), но затем я получаю сообщение об ошибке, в котором говорится, что ожидается a = und die IDE говорит мне ввести Product... ведьма не будет работать...   -  person Oli    schedule 05.07.2012
comment
@Oli Моя ошибка ... Тогда смотри мой ответ.   -  person Gaffi    schedule 05.07.2012
comment
Хм, я не уверен, правильно ли я понимаю, но я попробовал ниже...   -  person html_programmer    schedule 05.07.2012
comment
Просто вопрос: поскольку вы используете Access, не могли бы вы поместить эти данные в связанную (ассоциированную) таблицу многие ко многим? Просто спрашиваю, я не знаю, для чего вам это нужно, поэтому это просто предложение.   -  person html_programmer    schedule 05.07.2012
comment
@Гаффи; да ты прав на самом деле. Я думал написать ответ, потому что это могло быть слишком долго для комментариев. Спасибо за уведомление в любом случае.   -  person html_programmer    schedule 05.07.2012


Ответы (2)


Попробуйте вызвать эту строку с помощью:

User.addProduct Product, 0, True

or

Call User.addProduct(Product, 0, True)

Удаление ключевого слова () или использование ключевого слова Call должно помочь вам.

person Gaffi    schedule 05.07.2012
comment
Большое спасибо, это был ответ на мой вопрос. - person Oli; 06.07.2012

Я не уверен, что это то, что вы хотите сделать, но если он добавляет экземпляры класса в коллекцию, я предлагаю что-то вроде этого:

Sub Main_sub()

dim colProduct as Collection 
dim cProduct as clsProduct
dim asFoo as integer    
dim Mutual as boolean


set colProduct = new collection
set cProduct = new clsproduct

asFoo = ? 'Define
Mutual = ? 'Define

'if the AddProduct function resides in the clsProduct class: 
set cProduct = cproduct.AddProduct(cProduct, asFoo, Mutual)
colProduct.add cProduct

set cProduct = nothing
set colProduct = nothing

end sub

И для частных свойств класса продукта Projectmanager, VIP1, VIP2, VIP1A, VIP2A

Public function addProduct(cProduct as clsProduct, AsFoo As Integer, Optional Mutual As Boolean) as cProduct

            If (Mutual) Then 
                Select Case AsFoo 
                Case 0 
                    cProduct.Projectmanager = Me 
                Case 1 
                    cProduct.VIP1 = Me 
                Case 2 
                    cProduct.VIP2 = Me 
                Case 11 
                    cProduct.VIP1A = Me 
                Case 22 
                    cProduct.VIP2A = Me 
                End Select 
            End If
set addProduct = cProduct
End Sub 

Вы объявляете свойства в модуле класса следующим образом:

Private pVIP1 as <Type>

И геттеры/сеттеры:

Public Property Get VIP1() As <Type>
    VIP1 = pVIP1
End Property

Public Property Let VIP1(tVIP1 As <Type>)
    pVIP1 = tVIP1
End Property

Если тип является объектом, вам нужно использовать SET вместо LET.

Public Property SET VIP1(tVIP1 As <Type>)
    SET pVIP1 = tVIP1
End Property

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

person html_programmer    schedule 05.07.2012
comment
Я пропустил цикл, чтобы добавить несколько экземпляров объекта класса в коллекцию. - person html_programmer; 05.07.2012
comment
Хорошо, в вашем случае Коллекция называется USER. - person html_programmer; 05.07.2012
comment
Вау, спасибо, это мне очень помогает, я просто привыкаю к ​​VBA, мой опыт работы с Java не очень помогает ^^ - person Oli; 06.07.2012