Ошибка при попытке назвать пользовательское поле формы в 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"       
Другие вопросы по тегам