Gültigkeitsliste als Dropdownfeld erweiterbar?
Hallo,
ich hatte heute morgen schon mal ne Frage gepostet und es wurde mir super weitergeholfen.
Jetzt häng ich aber schon wieder:
Ich möchte ein Liste mit Einnahmen/Ausgaben erstellen.
Einige Posten kehren wieder (sollen auch wg. späterer Auswertung (Pivot) gleich benannt bleiben), manche jedoch nur einmal.
Am liebsten wär mir eine Spalte bei der ich zum Einen aus einem Dropdown-Feld auswählen kann das ich mit "Katalogbegriffen" hinterlege (wie bei Gültigkeit->Liste machbar), zum Anderen aber soll es auch möglich sein, dort auch freie Begriffe einzutragen, also keine Katalogbegriffe. Gültigkeit->Liste erlaubt mir ja nur die in der von mir in der Liste festgelegten Begriffe zu verwenden.
Das Feld sollte diese Einzelbegriffe nicht als neue Katalogbegriffe erfassen bzw. die Liste erweitern, sondern die Katalogbegriffe möchte ich in Form einer hinterlegten Liste, die ich manuell erweitern kann, auswählen.
Geht das? Falls ja wie? Ich steh auf dem Schlauch.
Danke für Eure Hilfe im Voraus.
ich hatte heute morgen schon mal ne Frage gepostet und es wurde mir super weitergeholfen.
Jetzt häng ich aber schon wieder:
Ich möchte ein Liste mit Einnahmen/Ausgaben erstellen.
Einige Posten kehren wieder (sollen auch wg. späterer Auswertung (Pivot) gleich benannt bleiben), manche jedoch nur einmal.
Am liebsten wär mir eine Spalte bei der ich zum Einen aus einem Dropdown-Feld auswählen kann das ich mit "Katalogbegriffen" hinterlege (wie bei Gültigkeit->Liste machbar), zum Anderen aber soll es auch möglich sein, dort auch freie Begriffe einzutragen, also keine Katalogbegriffe. Gültigkeit->Liste erlaubt mir ja nur die in der von mir in der Liste festgelegten Begriffe zu verwenden.
Das Feld sollte diese Einzelbegriffe nicht als neue Katalogbegriffe erfassen bzw. die Liste erweitern, sondern die Katalogbegriffe möchte ich in Form einer hinterlegten Liste, die ich manuell erweitern kann, auswählen.
Geht das? Falls ja wie? Ich steh auf dem Schlauch.
Danke für Eure Hilfe im Voraus.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 55841
Url: https://administrator.de/contentid/55841
Ausgedruckt am: 23.11.2024 um 05:11 Uhr
1 Kommentar
Hallo GerdReiss!
Dein Vorhaben lässt sich AFAIK nur mit VBA umsetzen.
Für meinen unten dargestellten Entwurf benötigst Du zunächst eine Mappe mit 2 Tabellen ("Daten" und "Liste").
Trage in die Tabelle "Liste" ab Zelle A3 untereinander einige der vorgegebenen Texte für das DropDown-Feld ein.
Danach kannst Du mit Rechtsklick auf das Blattregister der Tabelle "Daten" den Menüpunkt "Code anzeigen" wählen. In das jetzt angezeigte (große) Codefenster ist das folgende Programm einzufügen:
Je nachdem, ob Du nur einen bestimmten Zellbereich der Tabelle "Daten" nach Deinen Vorstellungen befüllen willst oder die Funktionalität für eine gesamte Spalte benötigt wird, musst Du eine der beiden "If"-Zeilen verwenden. Die nicht benötigte Zeile wird mit dem vorangestellten Apostroph deaktiviert. Im Beispiel werden zur Demonstration nur die Zellen B2:B20 überwacht.
Zusätzlich brauchst Du ein "UserForm"-Steuerelement, welches Du durch Rechtsklick auf "Tabelle1 (Daten)" (in der Baumstruktur links oben), "Einfügen", "UserForm" erhältst.
Wenn Du das eingefügte Formular anklickst, kannst Du links unten dessen Eigenschaften bearbeiten (falls nicht, über "Ansicht/Eigenschaften" die Anzeige dafür einschalten).
Ändere folgende Eintragungen:
Falls die "Werkzeugsammlung" nicht sichtbar ist, diese über das "Ansicht"-Menü einschalten und ein Element "Kombinationsfeld" ("ComboBox") in die UserForm einzeichnen (Linksklick in der "Werkzeugsammlung" auf "Kombinationsfeld" und dann in der Userform einen Rahmen dafür aufziehen).
Auf gleiche Art und Weise auch eine "Befehlsschaltfläche" ("CommandButton") und ein "Bezeichnungsfeld" ("Label") auf dem Formular platzieren (Position wird mit den nächsten Einstellungen festgelegt).
In den Eigenschaften folgende Eintragungen vornehmen:
Danach mit Rechtsklick auf das Element "frmEingabe" in der Baumstruktur für die UserForm "Code anzeigen" wählen und den folgenden Code einfügen:
Funktionsweise / Verwendung:
Gutes Gelingen!
bastla
Dein Vorhaben lässt sich AFAIK nur mit VBA umsetzen.
Für meinen unten dargestellten Entwurf benötigst Du zunächst eine Mappe mit 2 Tabellen ("Daten" und "Liste").
Trage in die Tabelle "Liste" ab Zelle A3 untereinander einige der vorgegebenen Texte für das DropDown-Feld ein.
Danach kannst Du mit Rechtsklick auf das Blattregister der Tabelle "Daten" den Menüpunkt "Code anzeigen" wählen. In das jetzt angezeigte (große) Codefenster ist das folgende Programm einzufügen:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'Bereich B2:B20 überwachen
If Not Intersect(Target, Range("B2:B20")) Is Nothing Then frmEingabe.Show
'Alternative: Gesamte Spalte B überwachen
'If Target.Column = 2 Then frmEingabe.Show
End Sub
Zusätzlich brauchst Du ein "UserForm"-Steuerelement, welches Du durch Rechtsklick auf "Tabelle1 (Daten)" (in der Baumstruktur links oben), "Einfügen", "UserForm" erhältst.
Wenn Du das eingefügte Formular anklickst, kannst Du links unten dessen Eigenschaften bearbeiten (falls nicht, über "Ansicht/Eigenschaften" die Anzeige dafür einschalten).
Ändere folgende Eintragungen:
Name: | frmEingabe |
Caption: | Eingabe (oder anderer Text --> Fenstertitel) |
Height: | 105 |
Width: | 142 |
StartUpPosition: | 0 - Manuell |
Falls die "Werkzeugsammlung" nicht sichtbar ist, diese über das "Ansicht"-Menü einschalten und ein Element "Kombinationsfeld" ("ComboBox") in die UserForm einzeichnen (Linksklick in der "Werkzeugsammlung" auf "Kombinationsfeld" und dann in der Userform einen Rahmen dafür aufziehen).
Auf gleiche Art und Weise auch eine "Befehlsschaltfläche" ("CommandButton") und ein "Bezeichnungsfeld" ("Label") auf dem Formular platzieren (Position wird mit den nächsten Einstellungen festgelegt).
In den Eigenschaften folgende Eintragungen vornehmen:
ComboBox1: | |
Name: | cboEintrag |
Caption: | "Label1" löschen |
Height: | 15,75 |
Left: | 12 |
Top: | 6 |
Width: | 114 |
CommandButton1: | |
Name: | btnHinzu |
Accelerator: | h |
Caption: | Eintrag zur Liste hinzufügen |
Height: | 24 |
Left: | 12 |
Top: | 30 |
Width: | 114 |
Label1: | |
Name: | lblStatus |
Font: | Tahoma, Schriftgrad 7 |
Heigth: | 24 |
Left: | 12 |
Top: | 60 |
Width: | 114 |
WordWrap: | True |
Danach mit Rechtsklick auf das Element "frmEingabe" in der Baumstruktur für die UserForm "Code anzeigen" wählen und den folgenden Code einfügen:
Option Explicit
'Position der Liste für Dropdown festlegen (Tabelle "Liste", ab Zelle A3):
Const sListenBlatt As String = "Liste"
Const ListeC As Integer = 1 'Spalte A
Const ListeR As Integer = 3
Private Sub UserForm_Initialize()
Dim intTop As Integer
'Positionierung des Eingabeformulars
intTop = ActiveCell.Top + 110
frmEingabe.Top = intTop
frmEingabe.Left = ActiveCell.Left
btnHinzu.Enabled = True
'Aktuellen Inhalt der Zelle in ComboBoxFeld übernehmen
cboEintrag.Text = ActiveCell.Value
End Sub
Private Sub cboEintrag_Enter()
'Liste neu befüllen
Dim R As Integer
cboEintrag.Clear
R = ListeR
Do While Sheets(sListenBlatt).Cells(R, ListeC).Value <> ""
cboEintrag.AddItem Sheets(sListenBlatt).Cells(R, ListeC).Value
R = R + 1
Loop
End Sub
Private Sub cboEintrag_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 13
Eintragen
Case 27 'Eingabe abbrechen, ohne den Inhalt der Zelle zu ändern
Unload Me
End Select
End Sub
Private Sub cboEintrag_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Eintragen
End Sub
Private Sub Eintragen()
ActiveCell.Value = cboEintrag.Text
'Cursor in nächste Zelle rechts setzen
Cells(ActiveCell.Row, ActiveCell.Column + 1).Activate
Unload Me
End Sub
Private Sub cboEintrag_AfterUpdate()
'ComboBoxFeld hat neuen Inhalt erhalten, Hinzufügen ermöglichen
btnHinzu.Enabled = True
End Sub
Private Sub cboEintrag_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
'Inhalt des ComboBoxFeldes hat sich geändert - Text kommt als neuer Listeneintrag in Frage
btnHinzu.Enabled = True
End Sub
Private Sub btnHinzu_Click()
'Aktuellen Inhalt des ComboBoxFeldes der Liste hinzufügen
Dim R As Integer, bAdd As Boolean, Index As Integer
If Trim(cboEintrag.Text) = "" Then
lblStatus.Caption = "<leer> nicht hinzugefügt."
Else
R = ListeR
bAdd = True
Do While Sheets(sListenBlatt).Cells(R, ListeC).Value <> ""
If Sheets(sListenBlatt).Cells(R, ListeC).Value = cboEintrag.Text Then
bAdd = False
Index = R - ListeR
End If
R = R + 1
Loop
If bAdd Then
Sheets(sListenBlatt).Cells(R, ListeC).Value = cboEintrag.Text
cboEintrag.AddItem cboEintrag.Text
Sheets(sListenBlatt).Cells(ListeR, ListeC).Sort _
Key1:=Sheets(sListenBlatt).Cells(ListeR, ListeC), _
Order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
lblStatus.Caption = "<" & cboEintrag.Text & "> hinzugefügt."
Else
lblStatus.Caption = "<" & cboEintrag.Text & "> war bereits vorhanden."
cboEintrag.SetFocus
cboEintrag.ListIndex = Index
End If
End If
'Weiteres Hinzufügen erst sinnvoll, wenn ComboBoxFeld neuen Inhalt erhalten hat
btnHinzu.Enabled = False
End Sub
- Wird eine Zelle des überwachten Bereiches ausgewählt, erfolgt der Aufruf des Eingabeformulars. Dieses wird (bei standardmäßiger Zeilenhöhe) unterhalb der aktuellen Zelle positioniert (Anpassung über die Zeile intTop = ActiveCell.Top + 110).
- Zunächst wird in das Dropdown-Feld der aktuelle Zelleninhalt übernommen. Dieser kann editiert oder durch einen Eintrag aus der Liste ersetzt werden.
- Mit der entsprechenden Schaltfläche kann der aktuelle Wert der ComboBox auch der Liste hinzugefügt werden. Diese wird danach aufsteigend sortiert. Leere bzw bereits in der Liste vorhandene Einträge werden nicht hinzugefügt. Beim Vergleich der Einträge werden Groß-/Kleinschreibung unterschieden (lässt sich auf Wunsch ändern). Eventuelle Leerzeichen am Beginn oder Ende des neuen Textes können ebenfalls dazu führen, dass er sich von einem bereits vorhandenen unterscheidet und daher in die Liste aufgenommen wird.
- Nach Bestätigung mit der Eingabetaste oder per Doppelklick auf die ComboBox wird der dann aktuelle Inhalt in die Tabelle eingetragen und der Zellcursor in die benachbarte Zelle rechts platziert.
- Ein Abbruch mit Esc bewirkt, dass sich der Inhalt der Zelle nicht ändert und die Zelle markiert bleibt, sodass sie "normal" bearbeitet werden kann.
- Die Liste für die ComboBox kann auch manuell ergänzt werden, es dürfen dabei nur keine Zellen leer bleiben. Die Adresse der ersten Zelle der Liste (Blattname, Spalte, Zeile) ist im Programm der UserForm zu hinterlegen (siehe Kommentar).
Gutes Gelingen!
bastla