2015-06-24 20 views
0

Это вполне возможно - возможно, даже - что я чего-то не хватает, но для жизни меня не могу понять, что.Неисправность «Требуемый объект» вопрос

У меня возникла ситуация, когда мне нужна структура, определенная пользователем (или класс, я думаю, но я стараюсь оставаться простой) для переноса двух связанных битов данных: имя столбца и номер столбца, где живут определенные данные ,

Однако, когда я запускаю код, я получаю «объект требуется» ошибка при первой попытке присваивания:

Вот укороченный список:

Public Type ConfigDataType 
    ltr As String 
    nbr As Integer 
End Type 

Sub MacroWorkbookName() 
    Dim ProjCol, WBSCol, ResCol, ValCol As ConfigDataType 
    Call GetParameters(ProjCol, WBSCol, ResCol, ValCol) 
End Sub 

Sub GetParameters(ByRef P, W, R, V As ConfigDataType) 

    Dim MacroWorkBook As String 
    MacroWorkBook = ThisWorkbook.Name 

    ' The next line triggers the error 
    P.ltr = Workbooks(MacroWorkBook).Sheets("Configuration").Cells(6, 3) 
    W.ltr = Workbooks(MacroWorkBook).Sheets("Configuration").Cells(7, 3) 
    R.ltr = Workbooks(MacroWorkBook).Sheets("Configuration").Cells(8, 3) 
    V.ltr = Workbooks(MacroWorkBook).Sheets("Configuration").Cells(9, 3) 

End Sub 

Я либо принципиально недоразумение что-то о Синтаксис VBA, или я пропустил ошибку braindead.

Возможно также, что я собираюсь сделать это All Wrong с точки зрения идиоматической автоматизации Excel, и в этом случае я также приветствую подталкивание к True Path - клиент, по-видимому, будет использовать это некоторое время, и я ненавижу они думали, что я плохой для того, чтобы развернуть дрянной код.

+1

Вы должны явно объявлять типы переменных для ** каждой ** переменной. Ваша строка 'P, W, R, V As ConfigDataType' объявляет только' V', все остальные (P, W и R) по умолчанию используют 'Variant' вместо ConfigDataType – tigeravatar

+0

Aha. Таким образом, правильный синтаксис больше похож на Sub SubParams (byRef P как ConfigDataType, W as ConfigDataType ... 'и т. Д. Выполняет ли начальный Dim работу, как я ожидаю, т.е. создает ProjCol, WBSCol, ValCol , и ResCol как переменные типа ConfigDataType? – Chet

+1

Для вашего первого вопроса: Да, это правильный синтаксис. Для вашего второго вопроса: Нет, применяется одна и та же логика, и вам все равно нужно объявить каждый тип переменной явно – tigeravatar

ответ

1

TigerAvatar сразу увидел мою проблему. Я предполагал, линию как

Dim foo, bar, bash, baz as ConfigType 

приведет к четырем переменным типа ConfigType, но это не так. Только последний; остальные варианты типа. Правильное использование, по-видимому

Dim foo as ConfigDataType, bar as ConfigDataType, bash as ConfigDataType, bas as ConfigDataType 

и распространяется на определение подлодки, тоже, что бы правильно записать

Sub GetParameters(ByRef P as ConfigDataType, W as ConfigDataType, R as ConfigDataType, V As ConfigDataType) 

После того, как я установил оба этих вопросов, код работал, как я ожидал , Еще раз спасибо Тиграватар за такой быстрый ответ.