Я пытаюсь написать некоторый код в 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
, но это не похоже на мое дело.
Любая помощь, советы для решения этой проблемы были бы очень признательны!
Спасибо.
Вы не создали объект pAttributes в cTool.InitateProperties. – Jules
Спасибо! Я никогда не тестировал свой класс * cTool *, поскольку отладчик указывал где-то в другом месте. Добавление строки 'Set pAttributes = Новый ADODB.Recordset' решило проблему.Еще раз спасибо за быстрый ответ. Я отредактирую сообщение, чтобы ответить на него. –
Не делайте этого. Это сайт вопросов и ответов, а не форум. Вопрос должен содержать вопрос, и ответы должны содержать ответ. –