2016-01-18 2 views
2

Я пытаюсь написать некоторый код в excel VBA с использованием Object Oriented Concept. Поэтому я хотел инициализировать мои объекты с помощью конструкторов, как мы обычно делаем на Java. Однако я обнаружил, что по умолчанию Class_Initialize() Sub, предлагаемый в VBA, не принимает аргументов. После некоторого поиска я обнаружил, что ответ на этот вопрос Question предложил довольно хорошую альтернативу.Конструктор в VBA - Ошибка выполнения 91 «Объектная переменная не установлена»

Вот пример моего завода модуля (я назвал его Creator):

Public Function CreateTool(ToolID As Integer) As cTool 
    Set CreateTool = New cTool 
    CreateTool.InitiateProperties (ToolID)  '<= runtime error 91 here 
End Function 

Класс cTool:

Private pToolID As Integer 
Private pAttributes As ADODB.Recordset 
Private pCnn As ADODB.Connection 

Public Sub InitiateProperties(ToolID As Integer) 
    Dim sSQL As String 
    Set pCnn = connectToDB()  'A function that returns a connection to the main DB 
    pToolID = ToolID 
    sSQL = "SELECT Tool_ID, Status, Type, Tool_Number " _ 
       & "FROM Tool WHERE Tool_ID = " & pToolID 
    pAttributes.Open sSQL, pCnn, adOpenKeyset, adLockOptimistic, adCmdText 
End Sub 

Это, как я называю конструктор:

Dim tool As cTool 
Set tool = Creator.CreateTool(id) 

Моя проблема заключается в том, что когда я запускаю код, я получаю следующее сообщение об ошибке:

Ошибка выполнения «91»:Переменная объекта или блока переменной не указан

отладки подчеркивает CreateTool.InitiateProperties (ToolID) строка моего CreateTool Функция.

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

Любая помощь, советы для решения этой проблемы были бы очень признательны!

Спасибо.

+2

Вы не создали объект pAttributes в cTool.InitateProperties. – Jules

+0

Спасибо! Я никогда не тестировал свой класс * cTool *, поскольку отладчик указывал где-то в другом месте. Добавление строки 'Set pAttributes = Новый ADODB.Recordset' решило проблему.Еще раз спасибо за быстрый ответ. Я отредактирую сообщение, чтобы ответить на него. –

+0

Не делайте этого. Это сайт вопросов и ответов, а не форум. Вопрос должен содержать вопрос, и ответы должны содержать ответ. –

ответ

3

не может быть причиной ошибки, но это:

Public Function CreateTool(ToolID As Integer) As cTool 
    Set CreateTool = New cTool 
    CreateTool.InitiateProperties (ToolID)  '<= runtime error 91 here 
End Function 

Является проблематичным по ряду причин. Рассмотрим:

Public Function CreateTool(ByVal ToolID As Integer) As cTool 
    Dim result As cTool 
    Set result = New cTool 
    result.InitiateProperties ToolID 
    Set CreateTool = result 
End Function 

Теперь, глядя на остальной части вашего кода, вы делаете VBA эквивалент делает работу в конструкторе, то есть доступ к базе данных и другие побочные эффекты для построения вашего объекта.

Как @Jules correctly identified, вы получаете доступ к унифицированному объекту pAttributes внутри InitiateProperties - это очень вероятно, причина вашей проблемы.

Я бы сильно рекомендую другой подход - если вы приехали из Java вы знаете делает работу внутри конструктора плохой дизайн ... то же самое относится и к VBA.

Получите ваш код и разместите его на Code Review Stack Exchange для полного обзора.

+0

Благодарим вас, я изменю свой код соответствующим образом. Я не знал о Code Review Stack Exchange. Я начну использовать его чаще! –

+2

@OscarAnthony Имейте в виду, что Code Review - это место, где ** рабочий ** код пересматривается, а не место, чтобы спросить, как заставить его работать, но скорее, чтобы сделать работу более совершенной **. –

Смежные вопросы

 Смежные вопросы