Listboxauswahl
#1
Hallo zusammen,


ich habe in einem Tabellenblatt ab Zeile C41:C51 ein Drop-down-Menü, das ich über die Datengültigkeit befülle. In D41: D51 habe ich ein Drop-down-Menü, das in Abhängigkeit zum Ersten steht und zu guter Letzt in F41:F51 wiederum eins, was in Abhängigkeit zum Zweiten steht, was ich über Tabellen und indirekt gelöst habe und einwandfrei funktioniert.


Das Problem ist, das man dieses Drop-down-Menüs aus der Gültigkeit nicht individuell einstellen kann, was heißt, in der Breite und in der Anzahl der Einträge ist das ganze sehr beschränkt und lässt sich meines erachten wenn überhaupt nur schlecht und kompliziert einstellen.



So nun würde ich gerne auf Listenfelder ausweichen, da dort die Möglichkeiten der Einstellung gegeben sind.

Es soll also im ersten Schritt, sobald ich in eine der Zellen C41:C51 klicke, die erste Listbox1 neben der zu befüllenden Zelle erscheinen und nach Auswahl eines Wertes wieder schließen. Im zweiten Schritt muss sich die Zweite und im dritten Schritt sollen sich die Listboxen 2 und 3 dann wiederum in Abhängigkeit befüllen und neben den Zellen zum Anklick, Zuverfügung stehen.


Ein Code, den ich im Netz gegoogelt habe funktioniert, bis auf das er nicht schließt, wenn ein Wert gewählt und eingetragen wurde.




Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
 Select Case Target.Column
   Case 3
     Select Case Target.Row
       Case 41 To 51
       With ListBox1
'          .List = Range(Cells(7, 13), Cells(Rows.Count, 13).End(xlUp)).Value
         .Top = Target.Top
         .Left = Target.Offset(, 1).Left
         .LinkedCell = Target.Address
         .Visible = True
       End With
     End Select
   Case Else
     ListBox1.Visible = False
 End Select
End Sub

Vielen Dank für Eure Hilfe
Gruß
Dietmar

Damit das Mögliche entsteht, muß immer wieder das Unmögliche versucht werden.  
Top
#2
Hallo Dietmar,

ich würde statt Listbox Combobx nehmen.
Beide würden mit dem gleichen Code arbeiten.

Um nach Auswahl auszublenden, würde ich die Zelle daneben auswählen mit folgendem Code zusätzlich an gleicher Stelle, wie Dein Code:


Code:
Option Explicit
Dim boVar As Boolean

Private Sub ComboBox1_Change()
 If boVar = False Then Range(ListBox1.LinkedCell).Offset(, 1).Select
End Sub
Gruß Atilla
Top
#3
Hallo Atilla,

ich danke dir für deine Antwort, es funktioniert allerdings nicht wie gewünscht, wenn z.b. schon ein Wert in einer Zelle steht, kann ich ihn wohl überschreiben aber die Combo geht nicht zu.
Was muss ich ändern?
Gruß
Dietmar

Damit das Mögliche entsteht, muß immer wieder das Unmögliche versucht werden.  
Top
#4
Hallo Dietmar,

sorry, in Deinem bisherigen Code musste auch noch etwas ergänzt werden:

hier alles zusammen  für Deine Listbox:


Code:
Dim boVar As Boolean

Private Sub ListBox1_Click()
 If boVar = False Then Range(ListBox1.LinkedCell).Offset(, 1).Select
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case Target.Column
  Case 3
    Select Case Target.Row
      Case 41 To 51
      boVar = True
      With ListBox1
        .Top = Target.Top
        .Left = Target.Offset(, 1).Left
        .LinkedCell = Target.Address
        .Visible = True
      End With
    End Select
    boVar = False
  Case Else
    ListBox1.Visible = False
End Select
End Sub



Und so für bei einr Combobox


Code:
Dim boVar As Boolean

Private Sub ComboBox1_Click()
 If boVar = False Then Range(ComboBox1.LinkedCell).Offset(, 1).Select
End Sub


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Select Case Target.Column
  Case 3
    Select Case Target.Row
      Case 41 To 51
      boVar = True
      With ComboBox1
        .Top = Target.Top
        .Left = Target.Offset(, 1).Left
        .LinkedCell = Target.Address
        .Visible = True
        .DropDown
      End With
    End Select
    boVar = False
  Case Else
    ComboBox1.Visible = False
End Select
End Sub


Ich habe das so eingestellt, das das Dropdown der Combo automatisch aufgeht.
Gruß Atilla
Top
#5
Hallo Atilla,
vielen Dank für deine Mühe, das funktioniert jetzt tadellos und ist Genial.

Nun brauche ich 3 Listboxen die Erste für den Bereich C41: C51 funktioniert bereiits :100:
die Zweite für den Bereich D41: D51 und die Dritte für den Bereich F41: F51.

Den ersten Teil des Codes, würde ich jetzt kopieren und für jede Listbox bzw. Combo anpassen
Code:
Private Sub ListBox2_Click()
If boVar = False Then Range(ListBox2.LinkedCell).Offset(, 1).Select
End Sub
Private Sub ListBox3_Click()
 If boVar = False Then Range(ListBox3.LinkedCell).Offset(, 1).Select
End Sub

aber wie mache ich das mit dem zweiten Teil, ich kann ja diesen Teil nicht dreimal kopieren   Huh
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

sonden muss diese beiden Teile dort einbauen

Code:
Select Case Target.Column
 Case 4 'für Spalte D
   Select Case Target.Row
     Case 41 To 51
     boVar = True
     With ListBox2
       .Top = Target.Top
       .Left = Target.Offset(, 1).Left
       .LinkedCell = Target.Address
       .Visible = True
     End With
   End Select
   boVar = False
 Case Else
   ListBox2.Visible = False


Select Case Target.Column
 Case 5 'für Spalte F
   Select Case Target.Row
     Case 41 To 51
     boVar = True
     With ListBox3
       .Top = Target.Top
       .Left = Target.Offset(, 1).Left
       .LinkedCell = Target.Address
       .Visible = True
     End With
   End Select
   boVar = False
 Case Else
   ListBox3.Visible = False


Danke für die Hilfe
Gruß
Dietmar

Damit das Mögliche entsteht, muß immer wieder das Unmögliche versucht werden.  
Top
#6
Hallo Dietmar,

hab jetzt kein Muße, deshalb so:


Code:
Dim boVar As Boolean

Private Sub ListBox1_Click()
If boVar = False Then Range(ListBox1.LinkedCell).Offset(, 1).Select
End Sub

Private Sub ListBox2_Click()
If boVar = False Then Range(ListBox2.LinkedCell).Offset(, 1).Select
End Sub

Private Sub ListBox3_Click()
If boVar = False Then Range(ListBox3.LinkedCell).Offset(, 1).Select
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim x As Long
If Not Intersect(Target, Range("C41:D51,F41:F51")) Is Nothing Then
     boVar = True
     x = IIf(Target.Column = 6, 3, 2)
     With ActiveSheet.OLEObjects("ListBox" & Target.Column - x)
       .Top = Target.Top
       .Left = Target.Offset(, 1).Left
       .LinkedCell = Target.Address
       .Visible = True
     End With
   boVar = False
   Select Case Target.Column
   Case 3
     ListBox2.Visible = False
     ListBox3.Visible = False
   Case 4
     ListBox1.Visible = False
     ListBox3.Visible = False
   Case 6
     ListBox1.Visible = False
     ListBox2.Visible = False
   End Select
Else
   ListBox1.Visible = False
   ListBox2.Visible = False
   ListBox3.Visible = False
End If
End Sub


Vielleicht kann das noch etwas zusammengefasst werden, aber im Moment sehe ich das nicht.
Gruß Atilla
Top
#7
Hallo Atilla,

vielen Dank für deine Mühe, das klappt nun wunderbar und ist genial.

So die Erste Hürde ist genommen. Nun stehe ich vor der nächsten Problem , ich muss die Listboxen füllen.

Die Erste L BOX wollte ich über die Eigenschaft ListFillRange füllen und habe einen Namen angelegt STO der den Bereich Stoerungsliste B1:J1 beinhaltet, es wird mir allerdings nur der erste Eintrag angezeigt.
Mein zweiter Versuch dies über diesen Code zutun   ListBox1.List = Stoerungsliste.Range("B1:J1").Value bringt mir das gleiche Ergebnis nur der erste Eintrag wird angezeigt.



Die zweite Sache ich muss dann noch die Zweite L Box in Abhängigkeit zur Ersten bringen und die Dritte in Abhängigkeit zur Zweiten das hatte ich ja mit der Gültigkeit über =Indirekt() gelöst.

Kannst du mir da noch mal auf die Sprünge helfen?
Gruß
Dietmar

Damit das Mögliche entsteht, muß immer wieder das Unmögliche versucht werden.  
Top
#8
Hallo Dietmar,

wie eine horizontale Zelladresserierung an die Lisfillrange übergeben werden kann weiß ich nicht
Per VBa muss man Transponieren.

Beispiel

ListBox1.List = Application.Transpose(Stoerungsliste.Range("B1:J1").Value)
Gruß Atilla
Top
#9
Hallöchen,

ich habe den Thread jetzt nicht komplett gelesen, aber willst Du wirklich die Spalten als Zeilen darstellen? Eine Listbox kann ja z.B. einen Tabellenausschnitt darstellen und wenn Du die Spalten B bis J sehen willst, dann nimmst Du auch den ColumnCount der Listbox auf 9 und Du siehst alle 9 Einträge. Wenn nun eine Zeile dazu kommt, dann hast Du damit auch gleich alle 9 Einträge der Zeile.

Ansonsten kannst Du die Zeile in Deinem Blatt transponieren und darauf zugreifen. Ggf. auch per Formel.
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#10
Hallo Andre,

ehrlich gesagt denke ich an den gleichen Aufbau, den ich momentan noch habe, über die Gültigkeit!

Hier wird ja das erste Gültigkeits Drop Down auch zeilentechnisch dargestellt, im Zweiten sowie im dritten, werden dann die dazu angelegten Tabellen über =Indirekt() dargestellt.

Nun dachte ich, ich muss dies über die Listboxen genau so machen.

Wenn es nicht so ist, wie sollte mein Tabellenaufbau dann für meine Listboxeinstellung am besten aussehen?
Das Transportieren über diesen Code "ListBox1.List = Application.Transpose(Stoerungsliste.Range("B1:J1").Value)"
habe ich bisher auch noch umsetzen können, da er auf Fehler läuft.



Vielen Dank für eure Antworten.
Gruß
Dietmar

Damit das Mögliche entsteht, muß immer wieder das Unmögliche versucht werden.  
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste