Das Clever-Excel-Forum.de - Treffen
... 14.-16. September 2018 im Allgäu ...

Listbox mit Werten aus aktuellem Tab.bl. ohne Namenkenntnis anzeigen
#1
Und wieder einmal bin ich am rätseln wie was wo hin kommen könnte.
Ich generiere über einen Cmdbutton ein neues Tabellenblatt "Name" = aktuelles Tagesdatum (Kegelabend)
Code:
Private Sub Cmd_Erstelle_Click()
Dim neuSheet As Worksheet
If Not BlattExists(Worksheets("Start").Range("b2").Text) Then Sheets.Add(Type:=xlWorksheet).Name = (Worksheets("Start").Range("b2").Text)
Set neuSheet = Sheets(Worksheets("Start").Range("b2").Text)
Worksheets("Vorlage").Range("A1:AK1").Copy neuSheet.Range("A1")
Makro1
End Sub
Vorhaben: Nun soll die Listbox1 in der Userform die hinzugefügten Daten aus dem neuen Tab.bl. auflisten.
Statisch ist nicht das Problem. Zur Zeit wird diese mit Daten aus dem Tabellenblatt "Daten" gefüllt, derweil aber hier alle Kegelabende gelistet sind, ist zu den neuen Daten zu scrollen.
Listbox1 = RowSource (=Daten!c3:aa5000)

In einem Forum fand ich diesen Code
Code:
Private Sub UserForm_Initialize()
    With ListBox1
        .ColumnCount = 10
        .ColumnWidths = "1cm;3cm;3cm;2cm;4cm;1cm;4cm;1cm;2cm;5cm"
        .ColumnHeads = True
        ListBox1.RowSource = ActiveSheet.Range("B9:K5000").Address(External:=True)
    End With
End Sub
Daraus habe ich das hier konstruiert:
Code:
Private Sub Cmd_Erstelle_Click()
Dim neuSheet As Worksheet
If Not BlattExists(Worksheets("Start").Range("b2").Text) Then Sheets.Add(Type:=xlWorksheet).Name = (Worksheets("Start").Range("b2").Text)
Set neuSheet = Sheets(Worksheets("Start").Range("b2").Text)
Worksheets("Vorlage").Range("A1:AK1").Copy neuSheet.Range("A1")
Makro1
End Sub

Private Sub UserForm_Initialize()
  With Me
    Dim wksEingabe As Worksheet
    Dim intErsteLeereZeile As Long
     .Txtdatum.Value = Date
     .LblZeit.Caption = Time
  End With
    With ListBox1
        .ColumnCount = 26
        .ColumnWidths = "1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm"
        .ColumnHeads = True
        'ListBox1.RowSource = ActiveSheet.Range("B9:K5000").Address(External:=True)
       ' Versuch 01 meinerseits
        ListBox1.RowSource = ActiveSheet.Range("B2:AA30").Address(External:=True)
       ' Versuch 02 meinerseits
        'ListBox1.RowSource = Sheets(Worksheets("Start").Range("b2").Text).Range("B2:AA30")
    End With
End Sub


Hiermit wollte ich das neu generierte Tabellenblatt erstmal ansprechen, dann den Zellenverband:

ListBox1.RowSource = Sheets(Worksheets("Start").Range("b2").Text).Range("B2:AA30")

Wo hab ich hier verkehrt gehandelt gedacht oder zusammengestellt?

Wüsste jemand von euch Rat?
?mage
to top
#2
Hallo Frank,

ein Unterschied zu den beiden ersten Versuchen ist offensichtlich:
.Address(External:=True)
hast Du im 3. Versuch nicht.
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
to top
#3
(21.10.2014, 19:11)schauan schrieb: ....Address(External:=True)
hast Du im 3. Versuch nicht...
Mensch, das war es? So nah und doch so fern.
Danke André

Zum nächsten:
Kann man der Listbox auch einen kleiner Bereich angeben als der im RowSource angegeben ist.
Über eine Combobox wähle ich die Spiele aus z.b. "2 auf die Vollen" aus.
Nun sag ich der Listbox, wenn in der Cbo "2 auf die Vollen" steht, gib nur die Zeilen mit dem Suchkriterium in der Liste wieder?

Listbox1 komplett: B2:AA30
Spalte B zeigt hier dann den Spielenamen 8x bei 8 Keglern
Ist die Ansicht/Auflistung der Listbox soweit beeinflussbar?

Nochmals Danke für den Hinweis und Danke voarb für weitere Hilfen
?mage
to top
#4
Hallo Frank,

dann solltest Du die Rowsource ändern, wenn die Zeilen auf Deinem Excelblatt noch zusammenhängen. Ansonsten musst Du sie gezielt füllen.
   \\\|///      Hoffe, geholfen zu haben.
   ( ô ô )      Grüße, André aus G in T  
 ooO-(_)-Ooo    (Excel 97-2016)
to top
#5
(21.10.2014, 19:30)schauan schrieb: ...dann solltest Du die Rowsource ändern, wenn die Zeilen auf Deinem Excelblatt noch zusammenhängen. Ansonsten musst Du sie gezielt füllen...
Genau das soll ja wenn dann im Hintergrund eventuell von statten gehen. Durch Auswahltext der Spielecombobox.
Wenn der Text der Combobox sich ändert soll nun nur die Zeile/Zeilen angezeigt werden.
In diesem Moment dürfte die Listbox keinen statischen RowSourceangabe beinhalten.

Die Liste wird ohne Leerzeile fortgeführt.
A = Datum
B = Spiel (man könnte aber auch die Spiel-ID verwenden)
C - ... = die Wertespalten
?mage
to top
#6
Hallo Frank,

das könnte in etwa so gehen (ungetestet):

Code:
Private Sub ComboBox2_Change()
  Dim i As Long
  Dim varL As Variant
  varL = Worksheets(Worksheets("Start").Range("B2").Text).Range("B2:AA30").Value
  If ComboBox2.ListIndex > -1 Then
    With ListBox1
      .ColumnHeads = False
      .RowSource = ""
      For i = 1 To UBound(varL, 1)
        If varL(i, 2) = ComboBox2.Value Then
          .AddItem varL(i, 1)
          For j = 1 To .ColumnCount - 1
            .List(.ListCount, j) = varL(i, j + 1)
          Next j
        End If
      Next i
    End With
  End If
End Sub

Gruß Uwe
to top
#7
Question 
(22.10.2014, 08:51)Kuwer schrieb: ...das könnte in etwa so gehen (ungetestet)...
Hallo Uwe, leider funktioniert der Code nicht richtig.
1. Pkt
-Dim i As Long
= Mit dem reinkopierten Code bei Auswahl in der Combobox, kommt der Fehler
"Variable nicht definiert"
-For j = 1 To .ColumnCount - 1 'fettes j ist im Code markiert
Lösung von mir: -Dim i As Long,j As Long
so weit klappt es.

2. Pkt
-varL = Worksheets(Worksheets("Start").Range("B2").Text).Range("B2:AA30").Value
= Hier wird nur die erste Spalte angezeigt (Dezimalzeit)
Lösung gewünscht: Range("B2:AA30") -Datenbereich
sichtbarer Datenbereich
ColumnWidths(als Beispiel):0pt;1pt;1pt;1pt;1pt;1pt;1pt;1pt;1pt;1pt;1pt;1pt;1pt;0pt;0pt;0pt;0pt;0pt;1pt;0pt;0pt;0pt;0pt;0pt;1pt;1pt
Apropos: Kann die Ansicht der Listbox bei neuer Auswahl auch noch gelöscht werden? Sonst Vervielfältigen sich ja die bisheriggewählten

Wenn das Vorhaben realisierbar ist, anbei eine abgespeckte Tabelle zum einpflegen/probieren
.xlsm   Listbox zeigt Einträge der Cbobox-Auswahl.xlsm (Größe: 21,22 KB / Downloads: 8)
?mage
to top
#8
Hallo Frank,

teste mal (diesmal von mir getestet):

Code:
Private Sub CboSpiel_Change()
  Dim i As Long, j As Long
  Dim varL As Variant
  varL = Worksheets(Worksheets("Start").Range("B2").Text).Range("b1:aa7").Value
  If CboSpiel.ListIndex > -1 Then
    With ListBox1
      .ColumnHeads = False
      .RowSource = ""
      .ColumnCount = 26
      .ColumnWidths = "0cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;1cm;0cm;0cm;0cm;0cm;0cm;1cm;0cm;0cm;0cm;0cm;0cm;1cm;1cm"
      .List = varL
      For i = .ListCount - 1 To 1 Step -1
        If .List(i, 1) <> CboSpiel.Value Then
          .RemoveItem i
        End If
      Next i
    End With
  End If
End Sub
[-] Folgende(r) 1 Benutzer sagt Danke an Kuwer für diesen Beitrag:
  • WergibtmirRat
to top
#9
Smile 
(23.10.2014, 13:49)Kuwer schrieb: ...teste mal (diesmal von mir getestet)...
Ei der Daus - Phänomenalskiiiiiiiii
Soll ich was tippseln, es klappt.
Genau wie ich es mir vorgestellt habe.
1000 Dank dir Uwe, ein Klick reicht aber auch bestimmt

Jetzt muss der Code nur noch in die große Kegelvereinprotokollliste hinzugefügt werden.
Und ab zur nächsten Baustelle von noch sehr vielen.
Ich hoffe auch weiterhin hier freiwillige Helfer zu finden, da nicht jedem Kegeln liegt bzw. erst mal ein wenig Kenntnis von der Spielart und -weise angelesen werden muss

Nochmals Danke für den Schub nach vorne
?mage
to top


Gehe zu:


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