Получить коллекцию разблокированных полей - в Microsoft Word VBA - PullRequest
0 голосов
/ 24 января 2020

Я написал макрос для Excel, который проверяет орфографию разблокированных полей в защищенной электронной таблице, копируя их, проверяя орфографию и копируя обратно.

Я пытаюсь сделать то же самое для Word.

У меня есть защищенный документ Word, в котором обычно есть таблицы с вопросами слева, которые защищены / заблокированы, и пустые поля справа для ввода текста. Я хотел бы пройтись по ним и проверить правописание в редактируемых полях.

Вот что у меня есть для Word.

Здесь сказано, что все поля "разблокированы", что не кажется правильным:

Sub TEST()
    Dim oApp                  As Object    'Word.Application
    Dim oDoc                  As Object    'Word.Document
    Dim oFormField            As Object    'FormField

    Set oApp = GetObject(, "Word.Application")
    Set oDoc = oApp.ActiveDocument
    Set theFields = ActiveDocument.Fields
    For Each theFields In ActiveDocument.Fields
        'Loop through each form field
        If theFields.Locked = wdUndefined Then
            MsgBox "Some fields are locked"
        ElseIf theFields.Locked = False Then
            MsgBox "No fields are locked"
        ElseIf theFields.Locked = True Then
            MsgBox "All fields are locked"
        End If
    Next
End Sub

Это напечатало кучу вещей, которые не имели смысла:

Sub TEST()
    Dim oApp                  As Object    'Word.Application
    Dim oDoc                  As Object    'Word.Document
    Dim oFormField            As Object    'FormField

    Set oApp = GetObject(, "Word.Application")
    Set oDoc = oApp.ActiveDocument
    For Each oFormField In oDoc.FormFields 'Loop through each form field
        Debug.Print oFormField.Name
    Next
End Sub

Например, это было частью моего debug.print:

Text5
Text5
Text5
Check37
Check37
Check37
Check37
Check37

1 Ответ

1 голос
/ 24 января 2020

FormField.Name возвращает имя этого поля, а не текст, который отображается. Кроме того, когда вы просматриваете поля, вы каждый раз запрашиваете окно сообщения, что не похоже на то, что вы хотите сделать.

l oop:

Dim lockedFields as Long
Dim unlockedFields as New Collection
For Each theFields in ActiveDocument.Fields
    If theFields.Locked = True Then
        lockedFields = lockedFields + 1
    Else
        unlockedFields.Add theFields
    End If
Next theFields

If lockedFields = ActiveDocument.Fields.Count Then MsgBox "All fields locked"

Dim incorrectlySpelledFields As New Collection

For Each theFields In unlockedFields
    If CheckSpelling(theFields.Result.Text) = False Then
        incorrectlySpelledFields.Add theFields.Result.Text
    End If
Next theFields

Dim item
For Each item In incorrectlySpelledFields
    Debug.Print item
Next item

Если это все в Word VBA, вам не нужны вещи oWrd и oDoc, просто go прямо для это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...