Использование/Обновление реляционных выпадающих списков

0

Вопрос

Я пытаюсь настроить выпадающий список, который зависит от выбора предыдущего выпадающего списка в Word, используя VBA-код. Я просмотрел кучу видео и прочитал на форумах, но не могу заставить это работать. Я использовал раскрывающиеся списки Word Legacy и правильно их обозначил, затем написал следующий код в VBA:

    Dim xDirection As FormField
    Dim xState As FormField
    On Error Resume Next
    Set xDirection = ActiveDocument.FormFields("ddType")
    Set xState = ActiveDocument.FormFields("ddSelection")
    If ((xDirection Is Nothing) Or (xState Is Nothing)) Then Exit Sub
    With xState.DropDown.ListEntries
    .Clear
        Select Case xDirection.Result
            Case "Numbers"
                .Add "1"
                .Add "2"
                .Add "3"
                .Add "4"
                .Add "5"
                .Add "6"
            Case "Letters"
                .Add "A"
                .Add "B"
                .Add "C"
            Case "None"
                .Add "Not applicable"
    End Select
    End With
End Sub

Проблема в том, что это решение работает только иногда и не последовательно. Такое ощущение, что возможные варианты выбора обновляются недостаточно быстро, и я могу выбрать букву, даже если должны быть доступны только цифры (иногда я вообще ничего не могу выбрать).

Я делаю это в Office 365.

Обратная связь будет высоко оценена

Заранее благодарю вас!

ms-word office365 vba
2021-11-23 08:57:31
1

Лучший ответ

0

Предположение: у вас есть документ Word с двумя раскрывающимися элементами управления содержимым. Для обоих тегов задано имя: ccType и ccSelection.

enter image description here

В модуле классаThisDocument вы вводите следующий код:

Option Explicit

Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
If ContentControl.Tag = "ccType" Then
    fillccSelection ContentControl.Range.Text
End If
End Sub

Private Sub fillccSelection(valueType As String)

Dim cc As ContentControl
Set cc = ThisDocument.SelectContentControlsByTag("ccSelection")(1)

If cc.Title <> valueType Then
    With cc
        .Title = valueType  'set title to current type so that we now if coming here next time
        .Range.Text = vbNullString  'clear content as it has to change with new values
        With .DropdownListEntries
            .Clear
            Select Case valueType
                Case "Numbers"
                    cc.SetPlaceholderText Text:="Please select a number"
                    .Add "1"
                    .Add "2"
                    .Add "3"

                Case "Letters"
                    cc.SetPlaceholderText Text:="Please select a letter"
                    .Add "A"
                    .Add "B"
                    .Add "C"
            End Select
        End With
    End With
End If
End Sub

Всякий раз, когда вы изменяете значение первого элемента управления содержимым (ccType) и выходите из него, запускается ContentControlOnExit.

Если вы "оставили" ccType (а не ccSelection), fillccSelection вызывается путем передачи значения, выбранного в ccType.

Если этот тип еще не задан для выбора CCS, раскрывающиеся записи устанавливаются в соответствии с выбранным типом.

2021-11-25 14:06:12

Привет, Айк, спасибо тебе за помощь. К сожалению, я не в состоянии заставить это работать. Я настроил два раскрывающихся списка управления контентом и пометил их, как вы сказали. Я вставил код в модуль, но он все равно не работает. Я что-то упускаю? Должен ли я связать два выпадающих списка вместе в какой-либо форме, чтобы они взаимодействовали? Лучший, Джей
Jakob R.

Вы вставили код в модуль ThisDocument (шаг 1)? Если вы нажмете на подраздел Document_ContentControlOnExit (шаг 2), вы увидите, что помечено 3 и 4 на этом снимке экрана: i.imgur.com/Ug9zPPX.png
Ike

Спасибо. Это решило первую проблему. Теперь я получаю ошибку 6124 во время выполнения, которая, похоже, исходит из строки кода .Диапазон.Текст = строка vbnull
Jakob R.

У меня есть только немецкое слово, но, пожалуйста, проверьте, нет ли ccSelection если выделенный флажок снят: i.imgur.com/Fx77qbn.png
Ike

Он снят, но ошибка все равно говорит мне, что я не могу редактировать, потому что он защищен. Я более подробно рассмотрю общие настройки
Jakob R.

Когда я достану ".Диапазон.Text = vbNullString" он отлично работает, просто не обновляет текст маркировки. Однако меня это вполне устраивает. Большое спасибо!
Jakob R.

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................