Hallo,
bei dem Tipp, auf dem Du bezug nimmst, handelt es sich um ein anderes Ziel. Dieser Code soll bewirken, dass die Spalten optimal hinsichtlich der gegenwärtigen Einträge eingestellt wird. Bei fast 4000 Datensätzen kann ich mir schon vorstellen, dass es seine Zeit dauert, bis die optimalen Spaltenbreiten ermittelt sind.
Bei meinem Beispiel geht es darum, die Spalten prozentual einzustellen, was dann unabhängig von den Daten geschieht. Demzufolge muss mein Code nicht erst den breitesten Text in einer Spalte ermitteln und davon die erforderliche Spaltenbreite ableiten. Das bedeutet, mein Code müsste bei 4000 Zeilen genauso schnell zum Ergebnis kommen als bei nur 5 Zeilen. Probiere es einfach mal aus.
Inzwischen habe ich meinen Code noch geringfügig verändert. Auf grund von Rundungsdifferenzen kann es bei der prozentualen Einstellung vorkommen, dass zwischen letzter Spalte und senkrechtem Rollbalken ein kleine Lücke gibt. Deshalb hatte ich die letzte sichtbare Spalte noch einmal angepasst. Beim veränderten Code kann ich nun eine Spalte als Argument übergeben und genau diese wird am Ende des Codes angepasst, also geringfügig breiter oder schmaler gemacht.
Public Sub ColWidthProzent(Grid As sevDataGrid.Grid, _
ByVal ColWidthArray As Variant, _
nCol As Integer)
' Prüfung, ob Arrays übergeben wurden
If Not IsArray(ColWidthArray) Then Exit Sub
Dim MaxW%, n%, i%
Dim ColW As Long
' maximal verfügbare Breite berechnen
' und in der Variable MaxW speichern
With Grid
' FixedCol?
MaxW = .Width - 4 * Screen.TwipsPerPixelX
If .FixedCol Then MaxW = MaxW - .FixedColWidth
' ScrollBar?
If .ScrollBars <> SB_HORIZONTAL And .ScrollBars <> SB_NONE Then _
MaxW = MaxW - GetSystemMetrics(SM_CXVSCROLL) * Screen.TwipsPerPixelX
' GridLines?
n = 0
For i = 1 To .Cols
If .Columns(i).Visible Then
MaxW = MaxW - (.CellSpacing * 2) * Screen.TwipsPerPixelX
End If
Next i
' Spaltenbreiten berechnen und einstellen
ColW = 0
For n = 1 To .Cols
If ColWidthArray(n - 1) > 0 Then
.Columns(n).Width = (MaxW * ColWidthArray(n - 1)) \ 100
ColW = ColW + .Columns(n).Width
Else
.Columns(n).Visible = False
End If
Next n
' Spalte anpassen
ColW = ColW - .Columns(nCol).Width
.Columns(nCol).Width = MaxW - ColW
End With
End Sub Der Aufruf dieser Funktion erfolgt mit folgendem Code. Die Prozentwerte für die einzelnen Spalten werden als Array übergeben, die zum Schluss anzupassende Spalten als Spaltenindex.
Dim cWidth As Variant
cWidth = Array(30, 25, 25, 20, 0)
ColWidthProzent BaustelleDlg.Grid1, cWidth Viel Spaß beim Ausprobieren und vielleicht gibst Du mal bekannt, wie das Geschwindigkeitsverhalten bei Deinen 4000 Zeilen ist.
Gruß
Wolfgang |