#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. На самом деле это не решило мою проблему, на самом деле это было где-то еще в моем коде, но вы указали мне правильный путь, и я не знал о настройках отслеживания ошибок (что очень помогло), поэтому я собираюсь отметить это как ответ.