Innerhalb Eingabemaske 2 Comboboxen verknüpfen auf verschiedene Tabellen

  • Excel

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Innerhalb Eingabemaske 2 Comboboxen verknüpfen auf verschiedene Tabellen

    Hallo Zusammen,

    ich bin ganz neu im Forum und neu in VBA :)! Ich möchte gerne für mich ein Haushaltsbuch erstellen. Die Idee ist über eine Eingabemaske Daten zu erfassen, in eine ,Datenbank-Tablle' zu schreiben und diese anschließend in Pivot-Tabellen aufzubereiten. Diese Datenbank ist der einzige Ort an dem die Daten geschrieben werden, die restlichen Tabellenblätter dienen nur zur Auswertung.
    Bisher bin ich soweit gekommen und Code:





    -------------------------------------------------------------------
    Private Sub cmd_Ende_Click()
    'schließen des Formular

    Unload frm_Maske

    End Sub

    Private Sub cmd_Hinzufügen_Click()
    'Fügt eingetragene Werte ins Tabellenblatt
    Dim intErsteLeereZeile As Long

    intErsteLeereZeile = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row + 1
    ActiveSheet.Cells(intErsteLeereZeile, 2).Value = CDate(Me.txt_Datum.Value)
    ActiveSheet.Cells(intErsteLeereZeile, 3).Value = Me.ComB_Typ
    ActiveSheet.Cells(intErsteLeereZeile, 4).Value = Me.ComB_Konto
    ActiveSheet.Cells(intErsteLeereZeile, 5).Value = Me.ComB_Kategorie
    ActiveSheet.Cells(intErsteLeereZeile, 6).Value = CCur(Me.txt_Wert.Value)
    ActiveSheet.Cells(intErsteLeereZeile, 7).Value = Me.txt_Notiz

    End Sub

    Private Sub UserForm_Initialize()
    'Werte beim Aufruf initialisieren

    Dim rngTyp As Range
    Dim rngKonto As Range
    Dim rngKategorie As Range

    With Me
    .txt_Datum.Value = Date
    End With

    For Each rngTyp In Range("Typ")
    With Me.ComB_Typ
    .AddItem rngTyp.Value
    .List(.ListCount - 1, 1) = rngTyp.Offset(0, 1).Value
    End With
    Next rngTyp

    For Each rngKonto In Range("Konto")
    With Me.ComB_Konto
    .AddItem rngKonto.Value
    .List(.ListCount - 1, 1) = rngKonto.Offset(0, 1).Value
    End With
    Next rngKonto

    For Each rngKategorie In Range("Kategorie")
    With Me.ComB_Kategorie
    .AddItem rngKategorie.Value
    .List(.ListCount - 1, 1) = rngKategorie.Offset(0, 1).Value
    End With
    Next rngKategorie

    End Sub

    -------------------------------------------------------------------

    Es funktioniert auch bisher ganz gut jedoch möchte ich nun die Comboboxen miteinander verknüpfen und die Auswahl in der nächsten Combobox begrenzen. Dazu habe ich je extra Tabellen angelegt, die entsprechende Werte enthalten, als Beispiel:
    Tabelle Typ: Einnahmen, Ausgaben...
    Tabelle Einnahmen: Gehalt, Nebenjob, Zinsen...
    Tabelle Gehalt: Unternehmen 1, Unternehmen 2...
    Tabelle Zinsen: Bank 1, Bank 2...

    Zwei Beispiele:
    1. Auswahl Typ: Einnahmen -> Auswahl Konto: Gehalt -> Kategorie: Unternehmen A
    2. Auswahl Typ: Einnahmen -> Auswahl Konto: Zinsen -> Kategorie: Bank 1

    Und hier bin ich mit meinem Latein bzw. VBA am Ende und komme auch nicht weiter mit youtube... Wie verknüpfe ich die Boxen, dass ich jeweils auf unterschiedliche Tabellen zugreifen kann, deren Inhalt beliebig erweitern/reduzieren kann und es trotzdem dynamisch in die Datenbank fortschreiben kann?

    Vielen Dank im Voraus für eure Hilfe.

    Viele Grüße

    Marc

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    mad.marc schrieb:

    Wie verknüpfe ich die Boxen, dass ich jeweils auf unterschiedliche Tabellen zugreifen kann
    Indem du in die ​RowSource der ComboBox den entsprechenden Range einträgst.
    techrepublic.com/article/pro-t…rm-combo-box-without-vba/
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vielen Dank für deine Antwort petaod. Leider habe ich noch ein Verständnisproblem :/.

    Wenn ich nun zBsp. für die Kombobox Konto (ComB_Konto) die Tabelle "Einnahmen" festlege (ComB_Konto.RowSource = "Einnahmen"), ist dies doch immer die ausgewählte Tabelle oder nicht?
    Ich wähle in ComB_Typ zwischen Einnahmen und Ausgaben aus (wird später noch weiter unterteilt in fixe und variable) und in ComB_Konto sollen nur die jeweiligen Einträge der Tabelle Einnahmen (Gehalt...) oder Ausgaben (Miete, Auto...) angezeigt werden. Sodas sichergestellt wird, dass nicht bspw. unter Ausgaben ein Gehalt verbuche. Bisher ist es so, dass ich Einnahmen auswählen kann und anschließend sämtliche Konten auswählen kann...
    Du kannst die RowSource-Property auch während der Laufzeit verändern.

    Meine bevorzugte Methode wäre allerdings, den in RowSource eingetragenen NamedRange dynamisch machen.
    Einfach statt einem festen Begriff eine Formel eintragen.
    excel-easy.com/examples/dynamic-named-range.html

    Oder die Source-Zellen selbst sich verändern lassen.
    per Excel-Formel oder per VBA.

    Es gibt so viele Möglichkeiten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    mad.marc schrieb:

    Ich würde es gerne per VBA lösen
    Meiner Ansicht nach, der weniger elegante Weg.
    Es ist die Methode die ich als erste Variante vorschlug.

    petaod schrieb:

    Du kannst die RowSource-Property auch während der Laufzeit verändern.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    Ok, ich geb mich geschlagen :D! Der Weg scheint wirklich nicht elegant zu sein bzw. bekomme ich eine Lösung über VBA nicht hin (Habe es über ein 'Select Case, Case is = ... End Select' versucht, aber dort ist das Problem, dass die dritte Combobox nicht mehr dynamisch ist und dann die einzelnen cases (bspw. Case is = 0 ...) nicht mehr passen.

    Habe bereits zur RowSource-Property mit Laufzeitänderung gegoogelt, aber keinen hilfreichen Link in Bezug auf die Laufzeit gefunden... Wie muss ich vorgehen, dass die drei Comboboxen verknüpft arbeiten?

    Neu

    Moin moin,

    es war eine kurze Nacht :D, aber ich habe es doch mit VBA hinbekommen. Ich muss zwar für jedes neue Konto case is... editieren, aber es klappt schon mal. Jetzt ist noch zu ändern, dass das Tagesdatum in der Userform angezeigt wird und dann passt das schon mal vorerst :)!

    Ich würde mir jedoch gerne deinen Vorschlag durchlesen. Hast du vielleicht einen Link für mich? Ich habe nichts brauchbares gefunden...

    --------------------------------------------------
    Private Sub cmd_Ende_Click()
    'schließen des Formular

    Unload frm_Maske

    End Sub

    Private Sub cmd_Hinzufügen_Click()
    'Fügt eingetragene Werte ins Tabellenblatt
    Dim intErsteLeereZeile As Integer

    intErsteLeereZeile = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row + 1
    ActiveSheet.Cells(intErsteLeereZeile, 2).Value = CDate(Me.txt_Datum.Value)
    ActiveSheet.Cells(intErsteLeereZeile, 3).Value = Me.CB_KK
    ActiveSheet.Cells(intErsteLeereZeile, 4).Value = Me.CB_KG
    ActiveSheet.Cells(intErsteLeereZeile, 5).Value = Me.CB_KT
    ActiveSheet.Cells(intErsteLeereZeile, 6).Value = CCur(Me.txt_Wert.Value)
    ActiveSheet.Cells(intErsteLeereZeile, 7).Value = Me.txt_Notiz

    End Sub

    Private Sub CB_KK_Change()

    Select Case CB_KK.Value

    Case Is = "Ausgaben_f"
    CB_KG.RowSource = "KGAf"

    Case Is = "Ausgaben_v"
    CB_KG.RowSource = "KGAv"

    Case Is = "Einnahmen_f"
    CB_KG.RowSource = "KGEf"

    Case Is = "Einnahmen_v"
    CB_KG.RowSource = "KGEv"

    End Select

    End Sub

    Private Sub CB_KG_Change()

    Select Case CB_KG.Value

    Case Is = "Gehalt"
    CB_KT.RowSource = "KTGehalt"

    Case Is = "Versicherungen"
    CB_KT.RowSource = "KTVersicherung"

    End Select

    End Sub

    --------------------------------------------------

    Neu

    mad.marc schrieb:

    Ich muss zwar für jedes neue Konto case is... editieren
    Wenn du die Namen deiner NamedRanges an den TextBox-Inhalt anpasst, kannst du das auch generisch machen.

    Denk mal drüber nach, wie es wäre, wenn du deinen Range KGAf statt dessen CB_KK_Ausgaben_f benennen würdest.

    An die Eleganz eines dynamischen NamedRange kommt diese Methode noch nicht ran, ist aber schon wesentlich einfacher als jetzt.

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --