Hallo, Markus -
da gibt es viele Ansätze. Ich würde die Tabelle via SQLExpress und einem "SELECT A, B, C COUNT(*) FROM Blatt GROUP by A, B, C ORDER BY A, B, C" einlesen und über SQLExpress auch wieder ausgeben. Das setzt eine SQLExpress-Lizenz voraus.
Als Alternative kann man das auch über Office Automation machen, das könnte so aussehen:
Code: Alles auswählen
oExcel := CreateObject("Excel.Application")
oBook := oExcel:workBooks:open(cXFile)
oExcel:displayAlerts := .F.
oExcel:visible := .T.
oSheet := oBook:activeSheet
cGroup := Chr(0)
cTest := "X"
aDaten := {}
nRow := 4 // Startzeile, in der die Daten beginnen
nCount := 0
WHILE cTest <> NIL
cTest := oSheet:Cells(nRow, 1)
IF cTest <> cGroup // Gruppenwechsel
IF cGroup <> Chr(0) // für Chr(0) gibt es keine Werte, die gebraucht werden
AAdd(aDaten, {..., nCount})
nCount := 0
cGroup := cTest
ENDIF
ENDIF
nCount ++
nRow ++
END
Damit hast Du am Ende der Daten ein Array, aDaten, das die Werte enthält, die in das Zielarbeitsblatt reinlaufen sollen.
Wenn die Daten auf ein neues Blatt sollen:
Code: Alles auswählen
oSheet:AddAfter(oSheet:Count)
oSheet:Cells(1, 1):Value := "Spalte 1"
oSheet:Cells(1, 2):Value := "Spalte 2"
oSheet:Cells(1, 3):Value := "Spalte 3"
oSheet:Cells(1, 4):Value := "Anzahl"
nLen := Len(aDaten)
FOR nI := 1 TO nLen
oSheet:Cells(nI, 1):Value := aDaten[nI, 1]
...
oSheet:Cells(nI, 4):Value := aData[nI, 4]
NEXT
Sollte so theoretisch funktionieren.