Korzystanie/Aktualizacja relacyjnych list rozwijanych

0

Pytanie

Próbuję dostosować się rozwijana lista, która zależy od wyboru poprzedniego rozwijanej listy w programie Word przy użyciu VBA-kod. Przejrzałem kilka filmów i przeczytałem na forum, ale nie mogę sprawić, by to działać. Użyłem listy rozwijane Word Legacy i poprawnie je przedstawił, a następnie napisał następujący kod w 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

Problem w tym, że to rozwiązanie działa tylko czasami i nie konsekwentnie. Mam wrażenie, że możliwe opcje wyboru są aktualizowane na tyle szybko, i mogę wybrać literę, nawet jeśli muszą być dostępne tylko cyfry (czasami w ogóle nic nie mogę wybrać).

Robię to w Office 365.

Opinia zostanie wysoko oceniona

Z góry dziękuję!

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

Najlepsza odpowiedź

0

Założenie: masz dokument programu Word z dwoma rozwijanych elementów zarządzania treścią. Dla obu znaczników podano imię: ccType i ccSelection.

enter image description here

W module klasyThisDocument można wprowadzić następujący kod:

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

Za każdym razem, gdy zmieniasz wartość pierwszego elementu zarządzania treścią (ccType) i wyjdź z niego, uruchamia ContentControlOnExit.

Jeśli "zostawili" ccType (a nie ccSelection), fillccSelection wywoływana jest przez przekazanie wartości, wybranego w ccType.

Jeśli ten typ nie został jeszcze ustawiony, aby wybrać CCS, rozwijane wpisy są ustawione zgodnie z wybranym typem.

2021-11-25 14:06:12

Witam, Ike, dziękuję ci za pomoc. Niestety, nie jestem w stanie zrobić to pracować. Ustawiłem dwa rozwijanej listy zarządzania treścią i oznaczył je, jak pan powiedział. Wkleiłem kod do modułu, ale on i tak nie działa. -Coś mi umknęło? Czy muszę połączyć dwie listy rozwijane razem w jakiejkolwiek formie, aby komunikował? Najlepszy, J.
Jakob R.

Włożono kod w module ThisDocument (krok 1)? Jeśli klikniesz na podklucz Document_ContentControlOnExit (krok 2), widać, że oznaczone 3 i 4 na tym zrzucie ekranu: i.imgur.com/Ug9zPPX.png
Ike

Dziękuję. To zdecydowało się na pierwszy problem. Teraz pojawia się błąd: 6124 w czasie wykonywania, która, jak się wydaje, pochodzi z wiersza kodu .Zakres.Tekst = ciąg vbnull
Jakob R.

Mam tylko niemieckie słowo, ale proszę, sprawdź, czy nie ma ccSelection jeśli zaznaczony pole wyboru jest wyczyszczone: i.imgur.com/Fx77qbn.png
Ike

On nakręcony, ale błąd nadal mówi mi, że nie mogę edytować, bo jest on chroniony. Jestem bardziej szczegółowo omówi ustawienia ogólne
Jakob R.

Kiedy dorwę ".Zakres.Text = vbNullString" to działa dobrze, po prostu nie aktualizuje tekst oznakowania. Jednak to mi odpowiada. Dziękuję bardzo!
Jakob R.

W innych językach

Ta strona jest w innych językach

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