Передача объектов процедурам в VBA

#excel #vba

#excel #vba

Вопрос:

Я работаю над простым инструментом, который позволит мне проанализировать несколько файлов CSV и перенести их на новый рабочий лист, «объединенный» вместе. Вот моя реализация (я упростил ее) и моя проблема:

Класс A

 private variables as types
property methods for accessing variables
  

Класс B

 private variables as types
property methods for accessing variables
  

Класс C

 Private cA as ClassA
Private cB as Collection  'Collection of ClassB
  

Класс D — часть моей проблемы

 Private cC as Collection 'Collection of ClassC
'Other member variables and their property get/lets

Public Sub AddA(A as ClassA)
    If cC.Item(A.foo) is Nothing then 
        dim tempC as ClassC
        set tempC = new ClassC
        tempC.A = A
    End if
End Sub
  

Основной модуль — другая половина моей проблемы

 Dim cC as New ClassC
'Initialize Class C, this all works fine
Dim tempA as ClassA
Set tempA = new ClassA
'Set tempA properties
cC.AddA tempA  'This is where my error is
  

Я пытался передать это как ByVal и ByRef каждый из них выдает мне разные ошибки («несоответствие типа аргумента byref», «недопустимая процедура или аргумент» и «Объект не поддерживает это свойство или метод»

Я понятия не имею, что попробовать дальше, я даже попробовал «штуку» в скобках, которая предположительно переводит параметр либо в ByVal, либо в ByRef , я не могу вспомнить, это было вчера.

Спасибо.

Комментарии:

1. Ошибка находится внутри AddA , поэтому некоторый код мог бы помочь. Я бы также поспорил, что вы хотите Public Sub AddA(ByVal A as ClassA) .

2. @GSerg Я получаю сообщение об ошибке в главном модуле, вызывающем вспомогательный модуль, и я попытался использовать ByVal A as ClassA , я получаю сообщение об ошибке «Недопустимая процедура или аргумент». Пожалуйста, обратите внимание, что я добавил код для AddA и в то же время понял, что полностью исключил класс. Я полностью обновил весь код. Извините за это.

3. Поиграйте с Tools -> Options -> General -> Error Trapping , чтобы изменить место, где вы видите ошибку. В этом случае вам может потребоваться «Разбить модуль класса».

4. @GSerg Хорошо, теперь я вижу, где на самом деле возникает ошибка, и, похоже, именно там я предварительно выполняю свою проверку If cC.Item(A.Foo) is Nothing then , согласно документам, если элемент не существует, он просто выдаст ошибку вместо того, чтобы возвращать значение nothing. Позвольте мне исправить это, а затем мы посмотрим, что произойдет

Ответ №1:

Эта строка:

 tempC.A = A 
  

означает «присвоение A свойству tempC объекта значения свойства A объекта по умолчанию».
Ваш A объект, по-видимому, не имеет свойства по умолчанию.

На самом деле вы имели в виду, вероятно,:

 Set tempC.A = A 
  

Но даже тогда вы не сможете получить доступ к закрытому полю A C класса из D class. Сделайте поле общедоступным или создайте общедоступный SetA() метод в C классе и вызывайте его из D .

Комментарии:

1. На самом деле это не решило мою проблему, на самом деле это было где-то еще в моем коде, но вы указали мне правильный путь, и я не знал о настройках отслеживания ошибок (что очень помогло), поэтому я собираюсь отметить это как ответ.