Ich erstelle ein Word-Formular mit mehreren voneinander abhängigen Auswahllisten. Da ich in VBA neue bin, brauche ich bitte eure Unterstützung.
Ich brauche diese sechs voneinander abhängige Dropdown-Felder:
1. Dropdown (DD1) ist die Gesellschaft
2. DD2 Firma (abhängig von DD1 – Gesellschaft)
3. DD3 Anschrift (abhängig von DD2 – Firma)
4. DD4 Ansprechpartner (abhängig von DD2 – Firma)
5. DD5 Software (abhängig von DD2 – Firma)
6. DD6 Benutzergruppe (abhängig von DD5 – Software)
Ich bin mir nicht sicher, ob man dass alles in einen Private Sub und eine Private Function packen darf oder ob man für jede Abhängigkeit es einzeln definieren muss?
Ich bin mit meinem Code noch nicht weit gekommen. Die erste Abhängigkeit (Gesellschaft + Firma) funktioniert schon mal.
Vielen Dank im Voraus für eure Unterstützung.
Liebe Grüße
Option Explicit
Const SOURCE_CC As String = "Gesellschaft" ' Titel des 1. DropDowns
Const DEPENDENCY_CC As String = "Firma" ' Titel des 2. DropDowns, dessen Einträge
' von der Auswahl des 1. DropDowns abhängig sind
Const DEPENDENCY_AN As String = "Adresse"
Const DEPENDENCY_AP As String = "Ansprechpartner"
Const DEPENDENCY_SW As String = "Software-Produkte"
Const DEPENDENCY_BG As String = "Benutzergruppe"
' stellt die Auflistung der abhängigen Einträge im 2. DropDown bereit
' Key: Eintrag im 1. DropDown
' Item: Liste der von Key abhängigen Einträge
' für Gesellschaft
Dim dependentEntries As New Collection
' für Software (SW)
Dim SWdependentEntries As New Collection
'für Anschrift (AN)
Dim ANdependentEntries As New Collection
'für Ansprechpartner (AP)
Dim APdependentEntries As New Collection
'Gesellschaft -> Firma Zuordnung
Private Sub initDependentEntries()
If dependentEntries.Count = 0 Then
dependentEntries.Add Key:="Gesellschaft1", Item:=Array("Firma1", "Firma2")
dependentEntries.Add Key:="Gesellschaft2", Item:=Array("Firma3", "Firma4")
End If
End Sub
' erneuert beim Verlassen des 1. DropDowns die Einträge des 2. DropDown
' in Abhängigkeit des im 1. DropDown gewählten Eintrags und zeigt den 1. Eintrag an
Private Sub Document_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
'
' wenn 1. DropDown ("Gesellschaft") verlassen wird...
If ContentControl.Tag = SOURCE_CC Then
'
' gewählten Eintrag aus 1. DropDown holen
Dim selectedEntry As String: selectedEntry = ContentControl.Range.Text
'
' 2. DropDown ("Firma") ermitteln, um es bearbeiten zu können
Dim cc As ContentControl: Set cc = getCCbyTitle(DEPENDENCY_CC)
If Not cc Is Nothing Then
With cc
'
' bisherige Einträge entfernen
.DropdownListEntries.Clear
'
' ggf. Einträge erstellen
initDependentEntries
'
' Einträge gem. Auswahl im 1. DropDown in 2. DropDown erstellen
Dim entry
For Each entry In dependentEntries(selectedEntry)
.DropdownListEntries.Add entry
Next
'
' 1. Eintrag vorselektieren
.DropdownListEntries(1).Select
End With
End If
End If
End Sub
' da ContentControls eigentlich nur über einen Index angesprochen werden können,
' ermittelt diese Hilfsfunktion ein ContentControl anhand seines Titels
Private Function getCCbyTitle(ccTitle As String) As ContentControl
'
' falls es ein ContentControl mit dem Titel nicht gibt, wird 'Nothing' zurückgegeben
Set getCCbyTitle = Nothing
'
' in allen ContentControls nach dem ContentControl mit dem angegebenen Titel suchen
Dim cc As ContentControl
For Each cc In ContentControls
If cc.Title = ccTitle Then Set getCCbyTitle = cc
Next
End Function
'Firma -> Ansprechpartner (AP) - Zuordnung
Private Sub initAPDependentEntries()
If APdependentEntries.Count = 0 Then
APdependentEntries.Add Key:="Firma1", Item:=Array("Ansprechpartner1", "Ansprechpartner2")
APdependentEntries.Add Key:="Firma2", Item:=Array("Ansprechpartner1", "Ansprechpartner2")
End If
End Sub
'Software-Produkte (SW)- Benutzergruppen Zuordnung
Private Sub initSWDependentEntries()
If SWdependentEntries.Count = 0 Then
SWdependentEntries.Add Key:="Software1", Item:=Array("Benutzergruppe1", "Benutzergruppe2", "Benutzergruppe3")
SWdependentEntries.Add Key:="Software2", Item:=Array("Benutzergruppe1", "Benutzergruppe2", "Benutzergruppe3")
End If
End Sub
' erneuert beim Verlassen des 1. DropDowns die Einträge des 2. DropDown
' in Abhängigkeit des im 1. DropDown gewählten Eintrags und zeigt den 1. Eintrag an
Private Sub SWDocument_ContentControlOnExit(ByVal ContentControl As ContentControl, Cancel As Boolean)
'
' wenn 1. DropDown ("Software-Produkt") verlassen wird...
If ContentControl.Tag = SOURCE_SW Then
'
' gewählten Eintrag aus 1. DropDown holen
Dim selectedEntry As String: selectedEntry = ContentControl.Range.Text
'
' 2. DropDown ("Benutzergruppe") ermitteln, um es bearbeiten zu können
Dim sw As ContentControl: Set sw = getSWbyTitle(DEPENDENCY_SW)
If Not sw Is Nothing Then
With sw
'
' bisherige Einträge entfernen
.DropdownListEntries.Clear
'
' ggf. Einträge erstellen
initSWDependentEntries
'
' Einträge gem. Auswahl im 1. DropDown in 2. DropDown erstellen
Dim entry
For Each entry In SWdependentEntries(selectedEntry)
.DropdownListEntries.Add entry
Next
'
' 1. Eintrag vorselektieren
.DropdownListEntries(1).Select
End With
End If
End If
End Sub
' da ContentControls eigentlich nur über einen Index angesprochen werden können,
' ermittelt diese Hilfsfunktion ein ContentControl anhand seines Titels
Private Function getSWbyTitle(swTitle As String) As ContentControl
'
' falls es ein ContentControl mit dem Titel nicht gibt, wird 'Nothing' zurückgegeben
Set getSWbyTitle = Nothing
'
' in allen ContentControls nach dem ContentControl mit dem angegebenen Titel suchen
Dim sw As ContentControl
For Each sw In ContentControls
If sw.Title = swTitle Then Set getSWbyTitle = sw
Next
End Function
|