gerdreiss
Goto Top

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.

Content-ID: 55841

Url: https://administrator.de/contentid/55841

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

bastla
bastla 09.04.2007 um 01:22:04 Uhr
Goto Top
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:
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
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:
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
Funktionsweise / Verwendung:
  • 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