Как вставить значение в word FormField как строку из sql

#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)
  

Я надеюсь, что это поможет.