Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1516to1520
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

listbox

listbox
02.10.2016 23:39:46
Thomas
Hallo excelfreunde,
ich fülle mit diesem code eine Listbox.
With ActiveSheet.Range("A1").CurrentRegion + 1
If .Rows.Count > 1 Then
Set mrngData = Intersect(.Cells, .Offset(1))
End If
End With
' Listbox füllen ###################################################
With ListBox1
.ColumnCount = mrngData.Columns.Count + 1
.List = mrngData.Value
' zeilennummer = ListBox1.ListIndex + 1
End With
~f~
weiss jemand von euch wie ich am ende der listbox eine weitere spalte mit den zeilennummern hinzufügen kann?
zur Zeit löse ich das Problem in dem ich am ende der Datentabelle die zeilennummer mit vba eintrage und sie dann in die listbox mit reinhänge. diese zusätzliche spalte in meiner daendabelle bringt mir ständig probleme.
der code dazu ist
~f~
'###### schreibe in die letzte benutzte spalte + 1 die zeilennummer ab hier
'## Achtung sucht die letzte benutzte überschrift wenn daten ohne überschrift vorhanden sind werden diese gelöscht
Dim anzahl_der_spalten As Integer
Dim anzahl_der_zeilen As Integer
Application.DisplayAlerts = False
anzahl_der_spalten = ActiveSheet.Cells(1, Columns.Count).End(xlToLeft).Column ' nimm die letzte benutzte spalte in zeile (überschrift) 1 cells(1
'zeilenbox = ActiveSheet.UsedRange.Rows.Count ' nur zur kontrolle in textbox schreiben
anzahl_der_zeilen = ActiveSheet.UsedRange.Rows.Count
ActiveSheet.Range(Cells(2, anzahl_der_spalten + 1), Cells(anzahl_der_zeilen, anzahl_der_spalten + 1)).ClearContents ' lösche letzte benutzte spalte ab zeile 2
'MsgBox anzahl_der_spalten
Dim formel As String
formel = "=Zeile()" 'diese formel wird geschrieben
'###### schreibe in die letzte benutzte spalte + 1 die zeilennummer ab hier
ActiveSheet.Range(Cells(2, anzahl_der_spalten + 1), Cells(anzahl_der_zeilen, anzahl_der_spalten + 1)).FormulaLocal = formel 'schreibe die zeilennummer als formel in letzte benutzte spalte +1 ab zeile 2
Application.DisplayAlerts = True
Wenn es nicht gehen sollte ist es möglich diese zeilennummer in ein anderes Blatt zu verlagern?
bestn dank sco al für euer interesse.
liebe grüsse thomas

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: listbox
03.10.2016 00:21:46
Daniel
Hi
Spaltenanzahl der Listbox und des zugewiesenen Arrays sollten schon übereinstimmen.
vergrössere daher gleich mRngData um eine Spalte.
...
Set mrngData = Intersect(.Cells, .Offset(1))
Set mrngData = mrngData.Resize(, mrngData.Columns.Count + 1)
dann hast du in der Listbox eine freie Spalte, die du dann per Schleife mit der Zeilennummer füllen kannst:
With ListBox1
.ColumnCount = mrngData.Columns.Count
.List = mrngData.Value
for z = 0 to .listcount - 1
.list(z, .Column.Count - 1) = z + mrngData.Row
Next
End With
damit hast du die Zeilennummern in deiner Listbox, ohne dass du an der Quelldatei was anpassen musst.
Gruß Daniel
Anzeige
AW: listbox
03.10.2016 10:40:12
Thomas
Hallo Daniel,
was würde ich nur ohne dich machen. Hab recht vielen dank es funktioniert soweit.
Aber es ist natürlich so wie du es schon voraus gesehen hast das Filtermacro überschreibt wieder alles.
ich suche nun nach einer Möglichkeit wie ich dem macro sagen kann überschreibe die zeilennummer nicht.
meinst du man hat eine chance diese stelle zu finden. Oder ist dies zu aufwendig? da ich es auch schon seid stunden suche weiss ich das es auf jedenfall nicht einfach ist.
Private Sub Filter(ByRef lst As MSForms.ListBox, ByRef mrngData As Range, ByRef avntConc() As  _
Variant, ByVal strSearchValue As String, ByVal blnCaseSensitive As Boolean)
Dim avntData() As Variant
Dim iavntData1 As Long
Dim iavntData2 As Long
Dim avntResult() As Variant
Dim iavntResult1 As Long
Dim iavntConc As Long
avntData() = mrngData.Value
If strSearchValue  "" Then
ReDim avntResult( _
LBound(avntData, 2) To UBound(avntData, 2), _
LBound(avntData, 1) To UBound(avntData, 1))
strSearchValue = "*" & strSearchValue & "*"
If blnCaseSensitive Then
For iavntConc = LBound(avntConc) To UBound(avntConc)
iavntData1 = iavntData1 + 1
If avntConc(iavntData1, 1) Like strSearchValue Then
iavntResult1 = iavntResult1 + 1
For iavntData2 = LBound(avntData, 2) To UBound(avntData, 2)
avntResult(iavntData2, iavntResult1) = avntData(iavntData1, iavntData2)
Next
End If
Next
Else
strSearchValue = LCase$(strSearchValue)
For iavntConc = LBound(avntConc) To UBound(avntConc)
iavntData1 = iavntData1 + 1
If LCase$(avntConc(iavntData1, 1)) Like strSearchValue Then
iavntResult1 = iavntResult1 + 1
For iavntData2 = LBound(avntData, 2) To UBound(avntData, 2)
avntResult(iavntData2, iavntResult1) = avntData(iavntData1, iavntData2)
Next
End If
Next
End If
If iavntResult1 > 0 Then
ReDim Preserve avntResult( _
LBound(avntResult, 1) To UBound(avntResult, 1), _
LBound(avntResult, 2) To iavntResult1)
lst.Column = avntResult()
Else
lst.Clear
End If
Else
lst.List = avntData()
End If
Call spalte_als_uhrzeit_formatieren
End Sub

in jeden fall bin ich dir schon mal sehr sehr dankbar für deine bisherige hilfe.
liebe grüsse thomas
Anzeige
AW: listbox
03.10.2016 12:37:36
Daniel
Am einfachsten wäre es natürlich, du würdest die Zeilennummern als Spalte in der Exceltabelle hinterlegen.
Im Filtermakro musst du auch wieder die Zeilennummern per Schleife eintragen, diesmal nicht in die .List der Listbox, sondern ins Array avntData, direkt nachdem du die Daten aus der Range übernommen hast, dh nach avntData() = mrngData.Value.
Beachte, wenn du die Schleife erstellst, dass im Array die In de Zahlung bei 1 beginnt und nicht bei 0 wie in .List.
Gruß Daniel
AW: Kryptologie
03.10.2016 13:12:33
Gerd
...die In_dex- Zaehlung bei 1 beginnt...
AW: Kryptologie
03.10.2016 18:23:29
Thomas
Hallo Daniel,
Nach 5 Stunden gebe ich es auf, ich bekomme es nicht hin deine Tipps umzusetzen. Mi......st.
das einzige was ich schaffe ist die falsche Zeilennummer zuzeigen.
Ich schaffe es einfach nicht einen schleife im Array zu erstellen.
Private Sub Filter(ByRef lst As MSForms.ListBox, ByRef mrngData As Range, ByRef avntConc() As  _
Variant, ByVal strSearchValue As String, ByVal blnCaseSensitive As Boolean)
Dim avntData() As Variant
Dim iavntData1 As Long
Dim iavntData2 As Long
Dim avntResult() As Variant
Dim iavntResult1 As Long
Dim z
Dim zeilnumer
Dim iavntConc As Long
'###########neu #####################################
' array erweitern
With ActiveSheet.Range("A1").CurrentRegion
If .Rows.Count > 1 Then
Set mrngData = Intersect(.Cells, .Offset(1))
Set mrngData = mrngData.Resize(, mrngData.Columns.Count + 1)
End If
End With
avntData() = mrngData.Value
'#######neu als test ###################################################################
For zeilnumer = 0 To ListBox1.ListCount - 1
ListBox1.List(zeilnumer, ListBox1.ColumnCount - 1) = zeilnumer + mrngData.Row
Next
'#######neu als test bis hier ########################################################### _
If strSearchValue  "" Then
ReDim avntResult( _
LBound(avntData, 2) To UBound(avntData, 2), _
LBound(avntData, 1) To UBound(avntData, 1))
strSearchValue = "*" & strSearchValue & "*"
If blnCaseSensitive Then
For iavntConc = LBound(avntConc) To UBound(avntConc)
iavntData1 = iavntData1 + 1
If avntConc(iavntData1, 1) Like strSearchValue Then
iavntResult1 = iavntResult1 + 1
For iavntData2 = LBound(avntData, 2) To UBound(avntData, 2)
avntResult(iavntData2, iavntResult1) = avntData(iavntData1, iavntData2)
Next
End If
Next
Else
strSearchValue = LCase$(strSearchValue)
For iavntConc = LBound(avntConc) To UBound(avntConc)
iavntData1 = iavntData1 + 1
If LCase$(avntConc(iavntData1, 1)) Like strSearchValue Then
iavntResult1 = iavntResult1 + 1
For iavntData2 = LBound(avntData, 2) To UBound(avntData, 2)
avntResult(iavntData2, iavntResult1) = avntData(iavntData1, iavntData2)
Next
End If
Next
End If
If iavntResult1 > 0 Then
ReDim Preserve avntResult( _
LBound(avntResult, 1) To UBound(avntResult, 1), _
LBound(avntResult, 2) To iavntResult1)
lst.Column = avntResult()
'#######neu als test ################################################################### _
For zeilnumer = 0 To ListBox1.ListCount - 1
ListBox1.List(zeilnumer, ListBox1.ColumnCount - 1) = zeilnumer + mrngData.Row
Next
'#######neu als test bis hier ########################################################### _
Else
lst.Clear
End If
Else
lst.List = avntData()
For zeilnumer = 0 To ListBox1.ListCount - 1
ListBox1.List(zeilnumer, ListBox1.ColumnCount - 1) = zeilnumer + mrngData.Row
Next
End If
Call spalte_als_uhrzeit_formatieren
End Sub

liebe grüsst thomas
Anzeige
AW: Kryptologie
03.10.2016 20:55:55
Daniel
Hi
in diesem Code scheibest du die Range-daten ja nicht direkt in die Listbox, sondern erstmal in ein Zwischenarray, das Array avntData()
dieses Array überarbeitest du dann in einem weitern Zwischenarray avntResult und dieses übergibst du dann an die Listbox.
damit das mit den Zeilennnummern so funktioniert, musst du die Zeilennummern in das Array avntData schreiben, direkt nachdem du die Daten aus der Range übernomment hast, denn nur dann passen die Zeilen noch zum Array.
also so:

avntData() = mrngData.Value
'#######neu als test ###################################################################
For zeilnumer = 1 To Ubound(avntData, 1)
avntData(zeilnumer, Ubound(avntData, 2) = zeilnumer + mrngData.Row - 1
Next
'#######neu als test bis hier ########################################################### _
_
########

dieser Code schreibt dann die Zeilennummer in die letzte Spalte des Arrays.
den rest des Makros lässt du wie gehabt.
btw eigenlich kannst du das ganze Übertragen der Wert in die Listbox im Initialize-Event auch weglassen, wenn das sowieso im Filtermakro nochmal machst, einmal reicht doch.
Gruß daniel
Anzeige
es paaaast !! besten dank Daniel
03.10.2016 21:27:41
Thomas
Hallo Daniel,
du hast ganz schön Geduld mit mir.
Du bist ein fundskerl.
hab vielen vielen dank für deine klasse hilfe.
liebe grüsse thomas
I

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige