Word 2010 - VBA - Dropdownliste auslesen

Knufu

Lieutenant
Registriert
Dez. 2011
Beiträge
592
Hallo,

ich versuche derzeit eine Dropdownliste auszulesen.
Das erste Element funktioniert, jedoch sobald ich das 2. Element auswähle, passiert nichts mehr. D.h. die Variable bleibt leer.

Eingefügt wurde das Dropdown über das Menü Entw.tools und dort das rechte in der 2. Zeile (rechts neben dem Kombinationsfeld). Habe also keine "Vorversionstools" genutzt.

Derzeitiger Code(schnipsel) unter "ThisDocument"
Code:
Private Sub ButtonMA_Click()
  strMeinCCValue = getCCValue(ActiveDocument.ContentControls(1))
  Selection.InsertAfter strMeinCCValue
End Sub
Derzeitiger Code(schnipsel) unter "Modul1"

Code:
Option Explicit
Dim strMeinCCValue As String

Function getCCValue(cc As ContentControl)
    Dim ccLE As ContentControlListEntry
    For Each ccLE In cc.DropdownListEntries
        If ccLE.Text = cc.Range.Text Then
            getCCValue = ccLE.Value
        End If
    Exit For
    Next
End Function
Wie das aktuell ausgewählte Element auslesen?
Bin leider noch ein Neuling in Sachen VBA.

Danke für eure Hilfe
Ralph
 
Hi.

Ich habe sowas bisher leider nur in Excel gemacht, aber für Word könnte es auch so funktionieren.
Und zwar kannst du den aktuellen Inhalt einer ComboBox (= Dropdown-Liste) einfach mit *.text auslesen.

Bevor du also im Makro den Unload.Userform machst, muss Code kommen, der den Inhalt irgendwo zuordnet. Z.B. einer Variable so:
Code:
strTextderBox= userform.Controls("ComboBox").Text

Dann würde "strTextderBox" den aktuelle ausgewählten Text beinhalten

Edit:
Habs grad mal getestet: Funktioniert.
Falls es Probleme macht, ich nutze das ganze in Verbindung mit nem OK-Button.
Dafür in der Userform einfach nen Button anlegen (bei mir heißt er cmdOK), mit folgendem zugehörigem Code:
Code:
Private Sub cmdOK_Click()
Me.Hide
End Sub
 
Zuletzt bearbeitet:
Danke dir für deinen Hinweis.
Aber deinen Codeschnipsel "UserForm.Controls" nimmt er nicht an oder ich kann ihn nicht richtig einordnen.

Könntest du mir bitte den ganzen Code im Zusammenhang zeigen?

Hintergrund der ganzen Aktion:
User wählt aus einer Dropdown einen Namen aus.
Dieser User - und nur dieser - kann dann unten im Dokument einen Button drücken (Vergleich der Umgebungsvariable "Username") und damit das Dokument "unterschreiben" mit seinem Namen aus der Umgebungsvariable.
Klappt wie gesagt beim ersten Element der Liste, jedoch nicht bei allen weiteren.
 
Zuletzt bearbeitet:
Hi

Mein Codeschnipsel funktioniert natürlich nur, wenn du die Namen anpasst.
Nochmal als kleine Hilfestellung:
Code:
strTextderBox= "NameDerEntsprechendenUserform".Controls("NameDerComboBox").Text

Wenn deine Userform z.B. "Unterschrift" heißt und die Combobox mit der Namensauswahl z.B. "Name", dann heißt der Befehl entsprechend Unterschrift.Controls("Name").Text
 
Hallo,

danke für deine Tips.
Bisher habe ich auch nur in Excel VBA gemacht. Hier in Word komme ich irgendwie nicht klar.

Bsp. der Name der Combobox (Dropdown): Ist das der Titel in den Eigenschaften oder das Tag?
Wer oder was ist hier die Userform? Der ausgelesene Text aus der Combobox soll bei mir eigentlich lediglich an ab einer Textmarke ausgegeben werden...

Hilfäääää :freak:

Edit: Hab den Fehler gefunden. eine Zeile im Code war vertauscht.
Ergänzung ()

Nachdem die erste Hürde genommen ist, taucht das nächste Problem auf.
Wenn ich im Dokument nun eine Datumsauswahl einfüge bricht das Skript mit einer Fehlermeldung ab - "diese Eigenschaft kann nur mit Dropdownfeldern verwendet werden".

Any hints??
 
Zuletzt bearbeitet: (Lösung gefunden)
Freut mich, dass es jetzt funktioniert hat.

Zum besseren Verständnis erstmal eine Frage: Hast du die Dropdown-Auswahl in einem Formularfenster (= Userform) oder direkt auf einem Arbeitsblatt eingebettet?

Was genau verstehst du unter Datumsauswahl und was genau soll damit gemacht werden?
Den Fehler kann ich so nämlich jetzt nicht verstehen ;)
 
Also:
Das Word-Dokument (als xlsm) ist insgesamt als Formular eingerichtet (wurde nicht von mir gemacht, ich will es nur pimpen). D.h. es gibt im Moment nur Felder für freien Text und einige Checkboxen.

Ich will nun einige Freitext-Felder durch Datumsauswahl ersetzen (Urlaub von .. bis). Diese sind direkt im Formular, ohne Userform eingefügt! Damit kann man später eben das Formular statt mit Freitext per "klick" ausfüllen.

Daneben gibt es Dropdown Listen mit Namen um zwei Mitarbeiter zu diesem Dokument "zuzuordnen". Und eben nur diese beiden MA können dann die "Unterschriftbutton" nutzen (eben nur, wenn dieser User auch angemeldet ist).

Das Dokument wird am Ende geschützt und nur Formulareingaben freigegeben.
(dieser wird bei unterschrift kurzzeitig aufgehoben.)

Ich hoffe ich konnte es etwas tiefgründiger erklären.
 
Zuletzt bearbeitet:
In wie fern hängt denn die Datumsauswahl mit dem Makro zusammen?

Ich vermute mal, du hast ein "Datumsauswahl-Inhaltssteuerelement" benutzt, weshalb die Datumsauswahl ja eigentlich kein Problem sein sollte.
 
Mirakel schrieb:
In wie fern hängt denn die Datumsauswahl mit dem Makro zusammen?
Eben das wüßte ich auch gern. Warum er mit dem Makro auf dieses Element zugreifen will.... Ich weiß es nicht



Mirakel schrieb:
Ich vermute mal, du hast ein "Datumsauswahl-Inhaltssteuerelement" benutzt,
korrekt vermutet :)
 
Am einfachsten wäre natürlich, wenn du ein Test-Dokument bereitstellen könntest.

Aber ok, spekulieren wir erst mal so:
Makro funktioniert, aber wenn du eine Datumsauswahl hinzufügst, nicht mehr.
Also scheint das Makro ja irgendwie auf die Datumsauswahl zuzugreifen, was den Fehler verursacht.
Wenn der Fehler auftaucht, müsstes du ja auf "Debuggen" klicken können und so die Zeile mit dem Fehler finden. Sollte das nicht gehen, kannst du im VBA-Editor unter "Debuggen" mal den Einzelschritt versuchen.

Wie lautet dann die fehlerhafte Zeile?
 
Derzeit sieht es so aus:

- Datumsfeld
- Dropdown 1 (Mitarbeiter)
- Dropdown 2 (Vertreter)

<Button A> Unterschrift "Ver" für Daten aus Dropdown 2
<Button B> Unterschrift "MA" für Daten aus Dropdown 1




Ohne das Datumsfeld fügt
ButtonA korrekt den ausgewählten Namen aus DD2,
ButtonB korrekt den ausgewählten Namen aus DD1.

Mit dem Datumsfeld ganz oben fügt
ButtonA falsch den ausgewählten Namen aus DD1,
ButtonB erzeugt einen Fehler in der Zeile "For Each ccLE In cc.DropdownListEntries" aus der Funktion "getCCValue".


Kann/ muss ich nicht irgendwo der Funktion den Namen des Dropdownfeldes übergeben?? Oder ist dies die Zahl bei "ActiveDocument.ContentControls(x)"?

Nachfolgend mal der Code. Der Einfachheithalber habe ich im Moment den Test auf die Umgebungsvariable auskommentiert.


Code:
Function getCCValue(cc As ContentControl)
    Dim ccLE As ContentControlListEntry
    For Each ccLE In cc.DropdownListEntries
        If ccLE.Text = cc.Range.Text Then
            getCCValue = ccLE.Value
            Exit For
        End If
    Next
End Function


'
' Unterschrift Mitarbeiter
'
Sub ButtonMA_Click()
Dim Mitarbeiter As String
    Mitarbeiter = getCCValue(ActiveDocument.ContentControls(1))
'    If Environ("Username") = Mitarbeiter Then
        Protect1
        ActiveDocument.Bookmarks("UnterschriftMA").Select
        Selection.InsertAfter Date
        Selection.InsertAfter " - "
        Selection.InsertAfter Mitarbeiter
'        Selection.InsertAfter Environ$("Username")
        Protect1
'    End If
End Sub



'
' Unterschrift Vertreter
'
Sub ButtonVer_Click()
Dim Vertreter As String
    Vertreter = getCCValue(ActiveDocument.ContentControls(2))
'    If Environ("Username") = Vertreter Then
        Protect1
        ActiveDocument.Bookmarks("UnterschriftVer").Select
        Selection.InsertAfter Date
        Selection.InsertAfter " - "
        Selection.InsertAfter Vertreter
'        Selection.InsertAfter Environ$("Username")
        Protect1
'    End If
End Sub
 
Zuletzt bearbeitet: (Funktionen angehängt)
Ich würde mal vermuten, dass du die Datumsauswahl vor die Dropdownlisten gesetzt hast.
Dann passt die Auswahl mit ActiveDocument.ContentControls(1) natürlich nicht mehr, da du damit das erste Feld auswählst. Dies wäre dann die Datumsauswahl und mit dieser funktioniert die Funktion "getCCValue" nicht mehr.

Ich finde aber gerade nicht mehr, wie man im Dokument die Dropdownliste per Namen einfügt. Ich bevorzuge immer so eine eindeutige Zuweisung, damit man erst gar nicht mit dem Index durcheinanderkommt ;)

*edit*
Ok, ich hab jetzt dazu gefunden, dass wenn man ein altes Steuerelement benutzt, dass es man es mit FormFields("Name") ansprechen kann. Neuere Elemente lassen sich nicht mehr über das Kommando FormFields ansprechen und mit ContentControls gehts nur über den Index.
Irgendwie muss das mit den neuen Steuerelementen aber auch gehen...
 
Zuletzt bearbeitet:
aaaaaja, danke. Das mit den Indexen hat geholfen.
Aber ich sehe das auch so, direktes ansprechen der Objekte erspart viel Ärger.

Danke nochmal für die Hilfe!!
 
Zurück
Oben