Excel VBA: Dropdown Auswahlliste über Msgbox mit Abfrage

  • Excel

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

    Excel VBA: Dropdown Auswahlliste über Msgbox mit Abfrage

    Ich habe folgende Frage. Ich hab ein Störungsaufnahmetool, bei dem MA ihre Störungen eintragen. Aktuell sind es 28 Hauptstörungen und die haben jeweils andere Unterkategorien. Manche Störungen gehen sogar bis zur 4. Unterkategorie.
    Immer wenn eine der Störungen gewählt wird, erscheint im nächsten Dropdown immer nur die Auswahl, die zu dieser Störung gehört.
    Bsp.
    Störung 1 ausgewählt
    Störung 1_1 bis 1_4 verfügbar
    Störung 1_3 ausgewählt
    Störung 1_3_1 bis 1_3_3 verfügbar
    usw.

    Ich habe das über Formeln lösen können, die Datei ist dadurch jetzt aber 7 MB groß, da ich die einzelnen Formeln auch nicht in die Datenabfrage packen konnte.

    Kann man das über VBA lösen, dass wenn ich z.B. eine Störung melden will:
    1. Drücke ich auf einen Button
    2. MSGBox geht auf
    3. MSGBox hat 4 Dropdowns und einen Übernehmen Button
    4. DD1 hat Zellen A1 bis A4
    In den nächsten Dropdowns werden immer jeweils nur die zutreffenden Unterkategorien angezeigt
    5. DD2 hat fortführende Unterkategorie: Bei A1 (B1 bis B3), A2 (B4 bis B6) usw.
    6. DD3 Bei B1 (C1 bis C3), B2 (C4 bis C6) usw.
    7. DD4 "
    8. Beim Übernehmen werden alle ausgewählte Störungen in die selektierte Zelle - getrennt mit einem Komma eingetragen.

    Ist es möglich?
    Indem du für DD2 als ListFillRange einen NamedRange (z.B. "DD_2") anlegst und einträgst.
    Und beim SelectionChange-Event der Combobox (oder beim Change-Event der LinkedCell) überschreibst du den RefersTo-Range des NamedRange

    Visual Basic-Quellcode

    1. ThisWorkbook.Names("DD_2").RefersTo="Tabelle1!H1:H5"
    Gerne kannst du stat absoluter Adressen auch für den Refer-Range NamedRanges angeben.

    Visual Basic-Quellcode

    1. ThisWorkbook.Names("DD_2").RefersTo="DD_2_Sub1"

    Du kannst dich auch verausgaben und eine Funktion für den Refer-Range verwenden, aber fang erst mal mit dem einfachen an.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Danke, aber ich kann leider gar nix damit anfangen :D

    Combobox 1 kann ich gerade noch bestimme, so viele Kenntnisse reichen mir noch, aber weiter komm ich nicht klar. Wie und wo soll ich was einfügen Oo

    Ich habe jetzt die ganzen Störungen mit Namen versehen. Es sind insgesamt 4 Dropdowns am Schluss. Hier mal alle Bedingungen für die zweite Combibox und ein Paar für die 3. Combobox. Wenn ich mal die Logik verstanden habe (hoffentlich) komme ich mit dem Rest klar

    Visual Basic-Quellcode

    1. ​Combobox 2
    2. ThisWorkbook.Names("D_1").RefersTo = "DD_1"
    3. ThisWorkbook.Names("D_2").RefersTo = "DD_2"
    4. ThisWorkbook.Names("D_3").RefersTo = "DD_3"
    5. ThisWorkbook.Names("D_4").RefersTo = "DD_4"
    6. ThisWorkbook.Names("D_5").RefersTo = "DD_5"
    7. ThisWorkbook.Names("D_6").RefersTo = "DD_6"
    8. ThisWorkbook.Names("D_7").RefersTo = "DD_7"
    9. ThisWorkbook.Names("D_8").RefersTo = "DD_8"
    10. ThisWorkbook.Names("D_9").RefersTo = "DD_9"
    11. ThisWorkbook.Names("D_10").RefersTo = "DD_10"
    12. ThisWorkbook.Names("D_11").RefersTo = "DD_11"
    13. ThisWorkbook.Names("D_12").RefersTo = "DD_12"
    14. ThisWorkbook.Names("D_13").RefersTo = "DD_13"
    15. ThisWorkbook.Names("D_14").RefersTo = "DD_14"
    16. ThisWorkbook.Names("D_15").RefersTo = "DD_15"
    17. ThisWorkbook.Names("D_16").RefersTo = "DD_16"
    18. ThisWorkbook.Names("D_17").RefersTo = "DD_17"
    19. ThisWorkbook.Names("D_18").RefersTo = "DD_18"
    20. ThisWorkbook.Names("D_19").RefersTo = "DD_19"
    21. ThisWorkbook.Names("D_20").RefersTo = "DD_20"
    22. ThisWorkbook.Names("D_21").RefersTo = "DD_21"
    23. ThisWorkbook.Names("D_22").RefersTo = "DD_22"
    24. ThisWorkbook.Names("D_23").RefersTo = "DD_23"
    25. ThisWorkbook.Names("D_24").RefersTo = "DD_24"
    26. ThisWorkbook.Names("D_25").RefersTo = "DD_25"
    27. ThisWorkbook.Names("D_26").RefersTo = "DD_26"
    28. ThisWorkbook.Names("D_27").RefersTo = "DD_27"
    29. ThisWorkbook.Names("D_28").RefersTo = "DD_28"
    30. ThisWorkbook.Names("D_29").RefersTo = "DD_29"
    31. ThisWorkbook.Names("D_30").RefersTo = "DD_30"
    32. Combobox 3
    33. ThisWorkbook.Names("DD_1").RefersTo = "DD_1_2"
    34. ThisWorkbook.Names("DD_1").RefersTo = "DD_1_3"
    35. ThisWorkbook.Names("DD_1").RefersTo = "DD_1_4"
    36. ThisWorkbook.Names("DD_1").RefersTo = "DD_1_6"
    37. ThisWorkbook.Names("DD_1").RefersTo = "DD_1_7"
    38. ThisWorkbook.Names("DD_1").RefersTo = "DD_1_8"
    39. ThisWorkbook.Names("DD_1").RefersTo = "DD_1_9"
    40. ThisWorkbook.Names("DD_2").RefersTo = "DD_2_1"
    41. ThisWorkbook.Names("DD_2").RefersTo = "DD_2_2"
    42. ThisWorkbook.Names("DD_2").RefersTo = "DD_2_3"
    43. ThisWorkbook.Names("DD_2").RefersTo = "DD_2_4"
    44. ThisWorkbook.Names("DD_2").RefersTo = "DD_2_6"
    45. ThisWorkbook.Names("DD_2").RefersTo = "DD_2_7"
    46. ThisWorkbook.Names("DD_2").RefersTo = "DD_2_8"
    47. ThisWorkbook.Names("DD_2").RefersTo = "DD_2_9"
    48. ThisWorkbook.Names("DD_3").RefersTo = "DD_3_3"
    49. ThisWorkbook.Names("DD_3").RefersTo = "DD_3_4"
    50. ThisWorkbook.Names("DD_4").RefersTo = "DD_4_2"
    51. ThisWorkbook.Names("DD_4").RefersTo = "DD_4_3"
    52. ThisWorkbook.Names("DD_5").RefersTo = "DD_5_1"
    53. ThisWorkbook.Names("DD_5").RefersTo = "DD_5_2"
    54. ThisWorkbook.Names("DD_5").RefersTo = "DD_5_4"
    55. ThisWorkbook.Names("DD_5").RefersTo = "DD_5_6"
    56. ThisWorkbook.Names("DD_5").RefersTo = "DD_5_11"
    57. ThisWorkbook.Names("DD_5").RefersTo = "DD_5_15"
    ListfillRange zeigt doch nicht auf eine Einzelzelle, sondern auf einen ganzen Range.
    Für jede Zelle einen Namen zu definieren ist sinnlos.
    Erzeuge für die verschiedenen ListFillRanges einen Namen.

    Visual Basic-Quellcode

    1. ThisWorkbook.Names("DD_1").RefersTo="Tabelle1!H1:H5"
    2. ThisWorkbook.Names("DD_2").RefersTo="Tabelle1!H10:H15"
    3. MyBox.ListfillRange = "DD_1"

    und wenn du umschalten willst:

    Visual Basic-Quellcode

    1. MyBox.ListfillRange = "DD_2"
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    Naja, es waren selten einzelne Zellen - meistens sind es ganze Blöcke.. Nun habe ich die aber alle mit einem Namen versehen, weil es auch das Ganze übersichtlicher macht. Aber mir ist trotzdem nicht klar, wie ich das jetzt auf eine ComboBox anwende? :S Bin da eine Null

    SZR2D schrieb:

    meistens sind es ganze Blöcke
    Es müssen ganze Blöcke sein, wenn sie für die Combobox verwendet werden sollen.
    Diesen Blöcken gibst du einen Namen und weist diesen der ComboBox als ListFillRange zu.
    So wie ich es dir in Post #6 beschrieb.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ok, jetzt hab ich das irgendwie hingekriegt, aber über anderen Weg. Falls es jemanden interessiert auf folgende Weise:

    Visual Basic-Quellcode

    1. ​Option Explicit
    2. 'Modulweite Variablen deklarieren
    3. Const C_mstrDatenblatt As String = "Tabelle1"
    4. Const C_mstrZielblatt As String = "Tabelle5"
    5. Dim mobjDic As Object
    6. Dim mlngLast As Long
    7. Dim mlngZ As Long
    8. Private Sub ComboBox1_Enter()
    9. 'Erste Combobox. Jede Störung in Spalte A wird einmalig angezeigt
    10. Set mobjDic = CreateObject("Scripting.Dictionary")
    11. For mlngZ = 2 To mlngLast
    12. mobjDic(Worksheets(C_mstrDatenblatt).Cells(mlngZ, 1).Value) = 0
    13. Next
    14. Me.ComboBox1.List = mobjDic.keys
    15. Set mobjDic = Nothing
    16. End Sub
    17. Private Sub ComboBox2_Enter()
    18. 'Zweite Combobox in Abhängigkeit von Combobox1.
    19. 'Jeder passende Störung in Spalte B wird einmalig angezeigt.
    20. Set mobjDic = CreateObject("Scripting.Dictionary")
    21. With Worksheets(C_mstrDatenblatt)
    22. For mlngZ = 2 To mlngLast
    23. If .Cells(mlngZ, 1).Value = Me.ComboBox1.Value Then
    24. mobjDic(.Cells(mlngZ, 2).Value) = 0
    25. End If
    26. Next
    27. End With
    28. Me.ComboBox2.List = mobjDic.keys
    29. Set mobjDic = Nothing
    30. End Sub
    31. Private Sub ComboBox3_Enter()
    32. 'Dritte Combobox in Abhängigkeit von Combobox 1 + 2.
    33. Me.ComboBox3.Clear
    34. With Worksheets(C_mstrDatenblatt)
    35. For mlngZ = 2 To mlngLast
    36. If .Cells(mlngZ, 1).Value = Me.ComboBox1.Value And .Cells(mlngZ, 2).Value = Me.ComboBox2.Value Then
    37. Me.ComboBox3.AddItem .Cells(mlngZ, 3).Value
    38. End If
    39. Next
    40. End With
    41. End Sub
    42. Private Sub ComboBox4_Enter()
    43. 'Dritte Combobox in Abhängigkeit von Combobox 1 + 2 + 3.
    44. Me.ComboBox4.Clear
    45. With Worksheets(C_mstrDatenblatt)
    46. For mlngZ = 2 To mlngLast
    47. If .Cells(mlngZ, 1).Value = Me.ComboBox1.Value And .Cells(mlngZ, 2).Value = Me.ComboBox2.Value And .Cells(mlngZ, 3).Value = Me.ComboBox3.Value Then
    48. Me.ComboBox4.AddItem .Cells(mlngZ, 4).Value
    49. End If
    50. Next
    51. End With
    52. End Sub
    53. Private Sub CommandButton1_Click()
    54. 'Userform schliessen
    55. Unload Me
    56. End Sub
    57. Private Sub CommandButton2_Click()
    58. 'Ausgewählte Daten in Tabelle 2 übertragen
    59. With Worksheets(C_mstrZielblatt)
    60. .Cells(.Cells(Rows.Count, 1).End(xlUp).Row + 1, 1).Value = Me.ComboBox1.Value
    61. .Cells(.Cells(Rows.Count, 2).End(xlUp).Row + 1, 2).Value = Me.ComboBox2.Value
    62. .Cells(.Cells(Rows.Count, 3).End(xlUp).Row + 1, 3).Value = Me.ComboBox3.Value
    63. End With
    64. End Sub




    Aber ich brauche noch etwas....
    Was soll ich da rein schreiben:

    Visual Basic-Quellcode

    1. Private Sub CommandButton1_Click()End Sub

    Damit mir der Inhalt aller CommandBoxen in die aktuell ausgewählte Zelle (getrennt durch ein Komma) eingetragen wird.
    Es soll wirklich keine speziell definierte Zelle sein, sondern die zuvor selektierte.
    Und wenn es geht noch ein Sonderwunsch... Der Inhalt aus der Textbox1 soll in die Zelle rechts neben an mit übernommen werden.
    Beispiel:
    CommandBox1: Modul1
    CommandBox2: Etikettierer
    CommandBox3: Einlauf
    CommandBox4: Überlast
    TextBox1: 5 min
    In der selektierten Zelle (z.B. A3) steht dann:
    Modul1, Etikettierer, Einlauf, Überlast
    Rechts daneben (B3): 5 min
    Hab da noch eine Frage, was füge ich bei der ComboBox 3 ein, damit die Werte nicht doppelt vergeben werden, wie bei ComboBox 1 und 2?
    Der Rest funktioniert schon einwandfrei, aber bei der dritten Box kommen die Werte manchmal eben doppelt

    Visual Basic-Quellcode

    1. ​Option Explicit
    2. 'Modulweite Variablen deklarieren
    3. Const C_mstrDatenblatt As String = "Tabelle1"
    4. Const C_mstrZielblatt As String = "Tabelle5"
    5. Dim mobjDic As Object
    6. Dim mlngLast As Long
    7. Dim mlngZ As Long
    8. Private Sub ComboBox1_Enter()
    9. 'Erste Combobox. Jede Störung in Spalte A wird einmalig angezeigt
    10. Set mobjDic = CreateObject("Scripting.Dictionary")
    11. For mlngZ = 2 To mlngLast
    12. mobjDic(Worksheets(C_mstrDatenblatt).Cells(mlngZ, 1).Value) = 0
    13. Next
    14. Me.ComboBox1.List = mobjDic.keys
    15. Set mobjDic = Nothing
    16. UserForm2.ComboBox1.Text = "Störungen komplett auswählen, bis das nächste Feld leer ist"
    17. End Sub
    18. Private Sub ComboBox2_Enter()
    19. 'Zweite Combobox in Abhängigkeit von Combobox1.
    20. 'Jeder passende Störung in Spalte B wird einmalig angezeigt.
    21. Set mobjDic = CreateObject("Scripting.Dictionary")
    22. With Worksheets(C_mstrDatenblatt)
    23. For mlngZ = 2 To mlngLast
    24. If .Cells(mlngZ, 1).Value = Me.ComboBox1.Value Then
    25. mobjDic(.Cells(mlngZ, 2).Value) = 0
    26. End If
    27. Next
    28. End With
    29. Me.ComboBox2.List = mobjDic.keys
    30. Set mobjDic = Nothing
    31. End Sub
    32. Private Sub ComboBox3_Enter()
    33. 'Dritte Combobox in Abhängigkeit von Combobox 1 + 2.
    34. Me.ComboBox3.Clear
    35. With Worksheets(C_mstrDatenblatt)
    36. For mlngZ = 2 To mlngLast
    37. If .Cells(mlngZ, 1).Value = Me.ComboBox1.Value And .Cells(mlngZ, 2).Value = Me.ComboBox2.Value Then
    38. Me.ComboBox3.AddItem .Cells(mlngZ, 3).Value
    39. End If
    40. Next
    41. End With
    42. End Sub