Hier sind einige Funktion, die Daten zwischen einem Grid und einem Zweidimensionalem Array austauschen.
Leider ist MS fest davon überzeugt, das ich nach der 499ten Zeile in dem Grid keinen Speicher mehr haben kann (Dabei hab ich noch über 200 MB realen Speicher frei). Deshalb habe ich mir erlaubt MaxRows auf 498 zu setzten. Das sind dann genau 700 Spalten und 499 Zeilen, weil das Grid jeweils bei 0 anfängt zu zählen.
Die Funktion cmdGen_Click habe ich der Vollständigkeit halber mal beigefügt. Sie erzeugte für mich ein Beispiel Grid.
GridToArray kopiert alle Zellenwerte in ein Zweidimensionales Array.
ArrayToGrid kopier ein Zweidimensionales Array in ein Grid (Vorher musst Du aber noch die Rows & Cols des Grids auf die richtigen werte setzten)
Wenn Du noch Fragen hast, oder Dir noch etwas fehlt, melde Dich einfach noch mal.
Option Explicit
Dim SimTab() As Double
'Dim oTime As New BSTimer
Const MaxRows = 499
Const MaxCols = 700
Private Sub cmdGen_Click()
Dim i, ii As Long
Dim sRow As String
Screen.MousePointer = vbHourglass
MSFlexGrid1.Visible = False
' Nur damit die nächste Anweisung keinen Fehler ergibt
MSFlexGrid1.FixedRows = 0
MSFlexGrid1.Rows = 0
MSFlexGrid1.Cols = MaxCols
' Kopfzeile erstellen
sRow = "Spalte 0" & vbTab
For i = 1 To MaxCols
sRow = sRow & "Spalte " & i & vbTab
Next
MSFlexGrid1.AddItem sRow
' Nun die 498 Rows erstellen
For i = 0 To MaxRows - 1
DoEvents
' Jede Zelle erhält einen zufälligen Double Wert
sRow = Format(CDbl((1500 * Rnd)), "###0.00")
For ii = 1 To MaxCols - 1
sRow = sRow & vbTab & Format(CDbl((1500 * Rnd)), "###0.00")
Next ii
' Den erstellten String als neue Row anhängen
MSFlexGrid1.AddItem sRow
Next i
' Nun haben wir ein Grid mit 498 Zeilen & 699 Spalten
' (Die Zäler des MsFlexGrid beginnen jeweils bei 0. Deshalb auch
' nur 699 Spalten!)
MSFlexGrid1.FixedRows = 1
MSFlexGrid1.Visible = True
Screen.MousePointer = vbNormal
End Sub
Private Sub cmdToArray_Click()
'oTime.StartTimer
Call GridToArray(Me.MSFlexGrid1, SimTab())
'oTime.StopTimer
'Debug.Print "Time: " & oTime.ReachedTime
'Debug.Print "Durchschnitt: " & oTime.Average & " für " & oTime.Counter & "" & _
"Durchläufe"
End Sub
Sub GridToArray(oGrid As MSFlexGridLib.MSFlexGrid, sMArray() As Double)
' Entragen des gesamten Grids in ein Mehrdimensionales Array
Dim lRowCount As Long
Dim lColCount As Long
Screen.MousePointer = vbHourglass
' Array Dimensionieren
ReDim sMArray(0 To MaxRows - 1, 0 To MaxCols - 1)
' Schleife um alle Rows (bei 1 beginnen, weil die Kopfzeile nicht ins array
' soll)
For lRowCount = 1 To oGrid.Rows - 1
' Schleife um alle Cols in das Array zu bekommen
For lColCount = 0 To oGrid.Cols - 1
'Debug.Print MSFlexGrid1.TextMatrix(lRowCount, lColCount)
sMArray(lRowCount - 1, lColCount) = MSFlexGrid1.TextMatrix(lRowCount, _
lColCount)
Next
Next lRowCount
Screen.MousePointer = vbNormal
End Sub
Sub ArrayToGrid(oGrid As MSFlexGridLib.MSFlexGrid, sMArray() As Double)
' Entragen des gesamten Grids aus ein Zweidimensionalen Array
Dim lRowCount As Long
Dim lColCount As Long
Screen.MousePointer = vbHourglass
oGrid.Visible = False
' Schleife um die erste Dimension
' Ich habe eine Kopfzeile vorgesehen deshalb Start bei 1
For lRowCount = 1 To UBound(sMArray(), 1)
' Schleife um die zweite Dimension
For lColCount = 0 To UBound(sMArray(), 2)
'Debug.Print MSFlexGrid1.TextMatrix(lRowCount, lColCount)
oGrid.TextMatrix(lRowCount, lColCount) = sMArray(lRowCount - 1, lColCount)
Next
Next lRowCount
oGrid.Visible = True
Screen.MousePointer = vbNormal
End Sub
Anstatt in der Funktion ArrayToGrid mit MSFlexGrid1.TextMatrix zu arbeiten _
kannst Du
das auch mit der Add Methode des Grids machen, dann musst du vorher die Anzahl _
der
Zeilen nicht festlegen.
Beispiel:
oGrid.Rows = 1 ' Kopfzeile
Dim sRow As String
For lRowCount = 1 To UBound(sMArray(), 1) + 1 ' +1 wegen der Kopfzeile
' Schleife um alle Cols in das Array zu bekommen
sRow = sMArray(lRowCount - 1, 0) & vbTab
For lColCount = 1 To UBound(sMArray(), 2)
sRow = sRow & sMArray(lRowCount - 1, lColCount) & vbTab
Next
oGrid.AddItem sRow
Next lRowCount Cu
Tolwyn |