Word VBA Макросы: Добавление закладок при определенном значении другой закладки

Автор ddiller, 25 апреля 2018, 13:40

ddiller

Есть документ, в который вставлен выпадающий список "Drop-Down Form Field" (Поле со списком (элемент управления формы)) от 1 до 10 и ему присвоена закладка Dropdown19.
Есть блоки текста (одинаковые) также помещенные в закладки B1...B10.

Необходимо написать макрос который бы в зависимости от выбранного значения выпадающего списка добавлял соответствующее количество блоков текста.

Т.к. в самом документе изначально должны быть все закладки от B1 до B10, наверное надо пойти обратным путем и макрос должен удалять "ненужные" закладки в зависимости от выбранного значения выпадающего списка.

Другими словами, в выпадающем списке выбирается значение, изменяется значение закладки "Dropdown19" и соответствующее кол-во блоков остается в документе.

Если значение выпадающего списка "2", то выведи / оставь закладки B1 и B2 и т.д.

Пытался решить задачу с помощью MERGEFIELD IF, но когда блокируешь документ как форму для заполнения, то не получается.
В макросе записывал задачу, чтобы при выборе значения обновлял поля закладки.

[вложение удалено администратором]

Администратор

1. Может быть лучше использовать не старый элемент управления, а новый: вкладка Разработчик (по умолчанию её нет, вам надо её самим отобразить) - Элементы управления - поле со списком.

2. Для нового элемента управления нет события, чтобы макрос запускался при выборе пункта, поэтому может быть сделат рядом кнопку: вкладка "Разработчик" - Элементы управления - Инструменты из предыдущих версий - Кнопка.

3. Абзац, в котором находится элемент управления, оформлен стилем "Подзаголовок". Вы вручную изменили текст, но в элементе управления оформление сбивается - становится, как у стиля "Подзаголовок". Поэтому, чтобы оформление не слетало, измените оформление или стиля "Подзаголовок", или сделайте стиль "Обычный", а затем измените оформление.

4. В файле щелкните кнопку, запустится макрос.

Макрос
Sub макрос()

    Dim control As ContentControl, i As Long
   
   
    ' Отключение монитора, чтобы не мерцало, и может это ускорит макрос.
    Application.ScreenUpdating = False
   
    '1. Присваиваем контролу имя "control", чтобы затем обращаться к контролу по этому имени.
        ' Это удобнее, чем писать длинный текст.
    Set control = ActiveDocument.ContentControls(1)
   
    '2. Если в контроле отображается "текст по умолчанию".
    If control.ShowingPlaceholderText = True Then
        Application.ScreenUpdating = True
        MsgBox "Выберите пункт.", vbExclamation
        Exit Sub
    End If
   
    '3. Отключение защиты.
    ActiveDocument.Unprotect
   
    '4. Удаление закладок и текста, входяещего внутрь закладок.
    For i = control.Range.Text + 1 To 4
        ActiveDocument.Bookmarks("B" & i).Range.Delete
    Next i
   
    '5. Вкл. защиты с сохранением имеющихся данных в контролах.
    ActiveDocument.Protect Type:=wdAllowOnlyFormFields, NoReset:=True
   
    '6. Включение монитора и сообщение.
    Application.ScreenUpdating = True
    MsgBox "Готово.", vbInformation
   
End Sub
[свернуть]

[вложение удалено администратором]

ddiller