Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1840to1844
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 Spaltenbreite

ListBox Spaltenbreite
27.07.2021 21:00:31
Milan
Hallo Forum,
ich habe UserForm mit ListBox1 Single und ListBox2 Multi dafür habe ich Code zusammen gewürfelt aber mit Spaltenbreite nimmt nicht ernst.
Spaltenbreiten in ListBox1 sind unterschiedliche Größe und abgeschnitten und zusammen gedrückt ohne eingeblendete Horizontale Scrollbar?. In ListBox2 geht so.
In beiden Tabellen habe ich beim schreiben und löschen von Daten, AutoFit Metode angewendet die mit eine andere UserForm ausgeführt wird.
Kann man in der Code was korrigieren dass es funktioniert?

Private Sub UserForm_Initialize()
Application.WindowState = xlMaximized
With Me
.Height = Application.Height
.Width = Application.Width
End With
Dim lngColumnA As Long
Dim strColumnWidthA As String
Dim iRowA As Integer
iRowA = Worksheets("Adressen").Cells(Rows.Count, 1).End(xlUp).Row - 1   '-1 weil letzte Zeile leer bleibt
With Worksheets("Adressen")
For lngColumnA = 1 To iRowA
strColumnWidthA = strColumnWidthA & CStr(.Columns(lngColumnA).Width + 25) & ";"    '+25 zusätzliche Breite
Next
End With
strColumnWidthA = Left$(strColumnWidthA, Len(strColumnWidthA) - 1)
With ListBox1
.ColumnHeads = True
.ColumnCount = 16
.RowSource = "Adressen!A2:P" & lngColumnA
.ColumnWidths = strColumnWidthA
End With
Dim lngColumnB As Long
Dim strColumnWidthB As String
Dim iRowB As Integer
iRowB = Worksheets("Artikel").Cells(Rows.Count, 1).End(xlUp).Row - 1   '-1 weil letzte Zeile leer bleibt
With Worksheets("Artikel")
For lngColumnB = 1 To iRowB
strColumnWidthB = strColumnWidthB & CStr(.Columns(lngColumnB).Width + 25) & ";"    '+25 zusätzliche Platz damit wird Spalteninhalt nicht abgeschnitten
Next
End With
strColumnWidthB = Left$(strColumnWidthB, Len(strColumnWidthB) - 1)
With ListBox2
.ColumnHeads = True
.ColumnCount = 7
.RowSource = "Artikel!A2:G" & lngColumnB
.ColumnWidths = strColumnWidthB
End With
End Sub
Gruß

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ListBox Spaltenbreite
28.07.2021 11:48:31
oraculix
Versuch mal das. Bin selber Anfänger vielleicht hilft das.
With ListBox1
.ColumnCount = 3 'Du kannst hier Deine Spaltenanzahl einstellen
.ColumnWidths = "7cm;8cm;2cm" ' Hier stellst du für jede Spate Beliebig die Breite ein
.ColumnHeads = False 'Mit True legst Du fest ob die Erste Zeile eingeblendet wird
.RowSource = ""
End With
Gruß
Oraculix
AW: ListBox Spaltenbreite
28.07.2021 15:30:02
Milan
Problem ist, dass ich die relevante Spalten nicht einblenden kann und den Rest ausblenden, aber alle auslesen ist Ok.
Dasswegen lasse ich ColumnCount auf 16, nur automatische Spaltenbreite soll die Code regeln, tut aber nicht richtig und dabei öffnet den Horizontalen Scroller nicht? und die Spalten sind zum Teil überschnitten und alle 16 verteilt auf ListBoxbreite. Bei Übergröße sollte sich Scroller einblenden.
Gruß
Anzeige
AW: ListBox Spaltenbreite
28.07.2021 16:44:11
Yal
Hallo Milan,
Du willst eigentlich die Spaltenbreite lesen, liest aber die Breite über alle Zeilen...
das sollte sein:

iRowA = Worksheets("Adressen").Cells(1, Columns.Count).End(xlToLeft).Column - 1
Achtung: Spaghetti-Code (Copy-Paste-Replace). Folgendes ist kompakter:

Private Sub UserForm_Initialize()
Dim C As Long
Dim i As Integer
Dim LetzteSpalte As Long
Dim BreitenListe As String
Dim WsName As String
Application.WindowState = xlMaximized
Me.Height = Application.Height
Me.Width = Application.Width
For i = 1 To 2
BreitenListe = ""
WsName = Array("", "Adressen", "Artikel")(i)
With Worksheets(WsName)
LetzteSpalte = .Cells(1, Columns.Count).End(xlToLeft).Column - 1 '-1 weil letzte Zeile leer bleibt
For C = 1 To LetzteSpalte
BreitenListe = BreitenListe & ";" & CStr(.Columns(C).Width + 25)    '+25 zusätzliche Breite
Next
End With
BreitenListe = Mid(BreitenListe, 2)
With Me.Controls("ListBox" & i)
.ColumnHeads = True
.ColumnCount = 16
.RowSource = WsName & "!A2:P" & LetzteSpalte
.ColumnWidths = BreitenListe
End With
Next
End Sub
Variablen auf Deutsch führt zu einer bessere Lesbarkeit: Trennung zwischen was VBA und was eigene Definition ist.
VG
Yal
Anzeige
AW: ListBox Spaltenbreite
28.07.2021 17:48:19
Milan
Es ist genial, funktioniert ausser eine kleinigkeit.
Ist es möglich für
ListBox1 -

.RowSource = WsName & "!A2:P" & LetzteSpalte
so lassen
ListBox2 -

.RowSource = WsName & "!A2:G" & LetzteSpalte
ergänzen
Vielen Dank
AW: ListBox Spaltenbreite
28.07.2021 19:47:19
Yal
Hallo Milan,
dann habe ich auch eine Denkfehler:

.RowSource = WsName & "!A2:P" & LetzteSpalte
ist nicht korrekt, weil die letzte Zeile und nicht die letzte Spalte verwendet werden soll.

Private Sub UserForm_Initialize()
Dim Z As Range
Dim Elt
Dim Rng As Range
Dim LetzteSpalte As Long
Dim BreitenListe As String
Application.WindowState = xlMaximized
Me.Height = Application.Height
Me.Width = Application.Width
For Each Elt In Array(Array("Adressen", "ListBox1"), Array("Artikel", "ListBox2"))
With Worksheets(Elt(0))
BreitenListe = ""
Set Rng = .Range(.Range("A2"), .Range("XFD2").End(xlToLeft).Offset(0, -1)) '-1 weil letzte Zeile leer bleibt
For Each Z In Rng.Cells
BreitenListe = BreitenListe & ";" & (Z.Width + 25)    '+25 zusätzliche Breite
Next
Set Rng = .Range(Rng, .Range("A9999").End(xlUp))
End With
With Me.Controls(Elt(1))
.ColumnHeads = True
.ColumnCount = Rng.Columns.Count
.RowSource = Elt(0) & "!" & Rng.Address
.ColumnWidths = Mid(BreitenListe, 2)
End With
Set Rng = Nothing
Next
End Sub
In dieser neuen Version setzte ich auf Objekte anstatt deren Eigenschaften. So in:
Set Rng = .Range(.Range("A2"), .Range("XFD2").End(xlToLeft).Offset(0, -1))
oder
.ColumnCount = Rng.Columns.Count
Lasst es im Schritt-Modus bei geöffnetem Direkt Lokal-Fenster laufen. So kannst Du beobachten, welche Wert eine Variable gerade hat.
Markiere Elt(0) & "!" & Rng.Address und rechtsklicke auf "Überwachung hinzufügen".
Zum Test kannst Du auch
Array(Array("Adressen", "ListBox1"), Array("Artikel", "ListBox2"))
eine Variable zuweisen, um zu sehen, wie es sich abbildet (Lokal-Fenster).
Dass Du den horizontale Bildlaufleiste für den ListBox1 nicht siehst., liegt daran, dass es unter den Rahmen für ListBox2 liegt.
VG
Yal
Anzeige
AW: ListBox Spaltenbreite
28.07.2021 22:29:44
Yal
Hallo Milan,
es liegt an diese letzte Spalte, die nicht berücksichtigt werden sollte, weil leer.
Dann sind es nicht 16 Spalten, sondern nur 15 (intern von 0 auf 14 nummeriert)
Ersetze:

Set Rng = .Range(.Range("A2"), .Range("XFD2").End(xlToLeft).Offset(0, -1)) '-1 weil letzte Zeile leer bleibt
durch

Set Rng = .Range(.Range("A2"), .Range("XFD2").End(xlToLeft))
dann sollte funktionieren wie gewünscht.
Übrigens: funktioniert so auch

.Range("E13:Y19","I43:Y43","I44:M44","T44:Y44","AL18:AT18").ClearContents
Achte auf ein sauberes Einrücken des Codes. Es ist für die Lesbarkeit wichtiger als unnötige Leerzeilen dazwischen.
Zwischen "For" und "Next": alles ein Tab nach rechts, zwischen "If" und "End If" auch (Ausnahme: "Else"), usw.
VG
Yal
Anzeige
Gelöst
28.07.2021 23:01:59
Milan
Hallo Yal,
alles funktioniert bestens, ich wünsche mir für so viel Mühe dich zum Essen in Restaurant einladen.
Unglaublich.
Vielen Dank
Vielen Dank für die Rückmeldung. oT
29.07.2021 00:03:38
Yal

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige