#sql #vba #ms-word
#sql #vba #ms-word
Вопрос:
У меня есть скрипт VBA, но я получаю ошибку «Ошибка компиляции: требуется объект»
Я добавил следующие ссылки в word VBA для приложения, но это не помогло
-Visual Basic For Applications
-Microsoft Word 12.0 Object library
-OLE Automation
-Microsoft office 12.0 Object Library
-Microsoft ActiveX data Objects 2.8 Library
-Microsoft ActiveX data Objects Recordset 2.8 Library
-Microsoft remote Data Services 2.7 Library
Чего не хватает в этом скрипте?
===========================
Sub ftbox()
Dim spinr As String
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.Open "lv", "xx", "xxxxxx"
Set spinr = cnn.Execute("select spinnr from cust where custid=" amp; ActiveDocument.FormField("custid").Result)
ActiveDocument.FormFields("reg").Result = spinr
End Sub
Ответ №1:
Я думаю, вы получаете ошибку, потому что:
Set spinr = cnn.Execute("select spinnr from cust where custid=" amp; ActiveDocument.FormField("custid").Result)
должно быть:
Set spinr = cnn.Execute("select spinnr from cust where custid=" amp; ActiveDocument.FormFields("custid").Result)
При этом, похоже, в вашем коде происходит много странностей. Это:
cnn.Open "lv", "xx", "xxxxxx"
для меня это выглядит очень странно. Я не уверен, к какому источнику данных вы пытаетесь подключиться (если только вы не сделали это только для публикации). Также:
Dim spinr As String
...
Set spinr = cnn.Execute("select spinnr from cust where custid=" amp; ActiveDocument.FormField("custid").Result)
Объект, возвращаемый cnn.Execute, является ADODB.Recordset, а не строкой. spinr должен быть типом ADODB.Recordset.
Наконец:
ActiveDocument.FormFields("reg").Result = spinr
должно быть больше похоже:
ActiveDocument.FormFields("reg").Result = spinr.Fields("spinnr")
потому что spinnr будет объектом набора записей. Вы не закрываете свое соединение и не освобождаете свои объекты. Может вызвать проблемы при попытке подключиться к вашему источнику данных, особенно если код прерывается и вы завершаете процедуру. Я не очень хорошо знаю слово objects, поэтому у вас может возникнуть еще больше проблем.
Ответ №2:
Я попытался использовать ваш код и получил ту же ошибку. Я думаю, что ошибка возникает из-за того, что вы предварительно фиксируете строку (назначение) с помощью SET . Если вы удалите SET, вы получите другую ошибку.
Как уже упоминалось, вам необходимо использовать набор записей:
Dim rst as ADODB.Recordset
Затем запустите следующие 2 строки после открытия соединения:
Set rst = cnn.Execute("select spinnr from cust where custid=" amp; ActiveDocument.FormFields("custid").Result)
spinr = rst.GetString(adClipString, -1, vbTab)
Я надеюсь, что это поможет.