Ошибка при попытке назвать пользовательское поле формы в Word VBA
Я создаю поле формы (textinput), и когда я его называю, я получаю:91 Переменная объекта или С переменной блока не установлено
В этом макросе есть десятки других мест, где я делаю ту же самую вещь, и она отлично работает. Вот код:
Private Sub IRPMs()
Dim objCon As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim i, j, k As Integer
Dim tmpField As FormField
Dim strOut As String
Set doc = ActiveDocument
i = 0
j = 1
k = 0
Call grabInfo
strFieldName(1) = "Property: "
strFieldName(2) = "General Liability: "
strFieldName(3) = "Auto Liability: "
strFieldName(4) = "Auto Phys Dam: "
strFieldName(5) = "Inland Marine: "
'' Remove document protection, if necessary
If doc.ProtectionType <> wdNoProtection Then doc.Unprotect
On Error GoTo IRPMerror
doc.Tables(3).Rows(9).Cells(2).Select
Selection.Delete
doc.Tables(3).Rows(10).Cells(2).Select
Selection.Delete
strSQL = "redacted"
objCon.Open "redacted"
rs.Open strSQL, objCon
If Not rs.EOF Then
For k = 0 To 4
If rs(k) <> "" Then i = i + 1
Next
doc.Tables(3).Rows(9).Cells(2).Select
If i = 0 Then
Selection.EndKey unit:=wdLine
Set tmpField = Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput)
tmpField.Name = "irpms1"
Else
For k = 0 To 4
If rs(k) <> "" Then
Selection.InsertAfter (strFieldName(j))
Selection.EndKey unit:=wdLine
Set tmpField = Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput)
tmpField.Name = "irpms" & j
If j <= i And j < 5 Then
Selection.InsertAfter Chr(11)
End If
strOut = rs(k)
If Left(strOut, 1) = "." Then strOut = "0" & strOut
doc.FormFields("irpms" & j).Result = strOut
End If
j = j + 1
Next
End If
Else
Selection.EndKey unit:=wdLine
Set tmpField = Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput)
tmpField.Name = "irpms1"
End If
rs.Close
strSQL = "redacted"
'rs.CursorLocation = adUseClient ' I've tried with and without setting the cursor
rs.Open strSQL, objCon, adOpenDynamic
MsgBox (rs.RecordCount)
i = rs.RecordCount
If Not rs.EOF Then
rs.MoveFirst
doc.Tables(3).Rows(10).Cells(2).Select
Set tmpField = Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput)
tmpField.Name = "Ducks" ' This is merely for testing; throws the error
If i = 1 Then
Selection.EndKey unit:=wdLine
Set tmpField = Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput)
tmpField.Name = "devi1"
Else
For k = 1 To i
Set tmpField = Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput)
tmpField.Name = "devi" & k
'doc.FormFields("devi" & k).Result = rs(0) & " Deviations: " & rs(1)
If k <> rs.RecordCount Then
Selection.InsertAfter (Chr(11))
End If
rs.MoveNext
Next
End If
End If
GoTo IRPMexiter
IRPMerror:
MsgBox ("IRPM" & vbCrLf & Err.Number & vbCrLf & Err.Description)
GoTo IRPMexiter
IRPMexiter:
If Not rs Is Nothing Then Set rs = Nothing
If rs.State Then rs.Close
If Not objCon Is Nothing Then Set objCon = Nothing
If objCon.State Then objCon.Close
If doc.ProtectionType = wdNoProtection Then doc.Protect Type:=wdAllowOnlyFormFields, noreset:=True, Password:=""
If Err Then End
Exit Sub
Параметры SQL и соединения были отредактированы, у них, похоже, нет проблем. "grabInfo" извлекает данные из свойств документа для передачи в SQL. "Док" объявляется публично в другом месте.
Итак, он проходит через первую часть в порядке, и уже более месяца. После закрытия и повторного открытия rs я больше не люблю использовать tmpfield.
Я ценю любые советы. Первый пост, поэтому, пожалуйста, дайте мне знать, если я могу улучшить свой вопрос или если я нарушил какие-либо правила.
1 ответ
Существуют ситуации, когда Word не может вставить что-либо, потому что текущий выбор не поддерживает этот тип объекта. Если пользователь попробует это сделать в интерфейсе Word, появится сообщение об ошибке... Или Word просто сделает "наилучшее предположение" и создаст объект в ближайшей допустимой позиции.
Объектная модель (VBA) не всегда так проста и просто откажется, часто с не столь информативным сообщением об ошибке.
В этом случае выделяется целая ячейка таблицы, и Word не может создать поле формы внутри структур ячеек (в отличие от текстовой области ячейки). Сокращение выделения до одной точки (мигающая точка вставки / курсор) позволит создать поле формы. Collapse
Метод может сделать это, как показано в следующем примере кода:
doc.Tables(3).Rows(10).Cells(2).Select
Selection.Collapse wdCollapseStart
Set tmpField = Selection.FormFields.Add(Range:=Selection.Range, Type:=wdFieldFormTextInput)
tmpField.Name = "Ducks"