Word VBA - цикл по закладкам с условием

Я очень новичок в VBA, поэтому любая помощь очень ценится.

Я пытаюсь создать макрос, который выполняет следующее:

  1. При запуске открывается пользовательская форма

  2. Пользовательская форма просит пользователей классифицировать различные темы как «Применимо» или «Неприменимо».

  3. После классификации каждой темы макрос переместит все темы «Неприменимо» в раздел «Неприменимо» в документе.

  4. Категоризация будет «Применимо» по умолчанию.

Каждая тема устанавливается как отдельная закладка. Я застрял на каждой/следующей части кода. У меня пока так:

Sub CleanUp()    
    Dim doc As Document
    Dim book As Bookmark

    For Each book In ActiveDocument.Range.Bookmarks
        If book = "Applicable" Then
        Selection.GoTo what;= wdgotobookmark, which:= book
        Selection.Cut
        Selection.GoTo what:=wdGoToBookmark, Name:="PASTE_HERE"
        Selection.PasteAndFormat (wdFormatOriginalFormatting)
    Next book
end sub

Два первоначальных вопроса:

  1. #P9# <блочная цитата>
      Private Sub OptionButton2_Click()
            Set book = "Applicable"
        End Sub
    
  2. Если мне нужно создать переменную для каждой темы/закладки, лучше ли использовать цикл for/next? Таким образом, я могу установить имя переменной равным счетчику? Например тема1, тема2, тема3 и т.д.?


person user238436    schedule 16.03.2020    source источник


Ответы (1)


Лучшим подходом (IMHO) было бы использование переменных документа, состояние которых можно было бы проверить с помощью полей IF в документе, чтобы, в зависимости от результата проверки, содержимое отображалось в разделе «Применимо» или «Неприменимо», как подходящее.

Например, предположим, что вы создаете переменную документа с именем «Тема1», значения которой могут быть 1 или 0. В:

  • Раздел «Применимо», у вас будет поле IF, закодированное в соответствии со строками:

    {IF{DOCVARIABLE Topic1}= 1 "Содержимое для показа"}

  • Раздел «Неприменимо», у вас будет поле IF, закодированное в соответствии со строками:

    {IF{DOCVARIABLE Topic1}= 0 "Содержимое для показа"}

где «Содержимое для показа» одинаково в каждом поле. Чтобы упростить обработку, вы можете просто создать поля в разделе «Применимо», затем скопировать их в раздел «Неприменимо» и изменить 1 на 0.

Если используются флажки, чтобы указать, применима ли данная тема, код макроса может быть таким простым, как:

Private Sub CommandButton1_Click()
Dim Ctrl As Control: Const CtrlType As String = "CheckBox"
For Each Ctrl In UserForm1.Controls
  If TypeName(Ctrl) = CtrlType Then
  With Ctrl
    If .Caption Like "Topic#*" Then
      ActiveDocument.Variables(.Name).Value = .Value ^ 2
    End If
  End With
  End If
Next
ActiveDocument.Fields.Update
End Sub

Примечание. Пары фигурных скобок (например, '{ }') для приведенных выше примеров создаются в самом документе с помощью сочетания клавиш Ctrl-F9 (Cmd-F9 на Mac или, если вы используете ноутбук, вам может понадобиться использовать Ctrl-Fn-F9); вы не можете просто напечатать их или скопировать и вставить из этого сообщения. Также нецелесообразно добавлять их через любой из стандартных диалогов Word. Пространства, представленные в полевых конструкциях, являются обязательными.

Дополнительные сведения об использовании переменных документа см. по адресу: https://support.microsoft.com/en-us/help/306281/how-to-store-and-retrive-variables-in-word-документы

person macropod    schedule 16.03.2020