Seite 1 von 1
Excel Frage Gruppieren und Summe?
Verfasst: Fr, 18. Okt 2013 9:38
von satmax
Code: Alles auswählen
Hallo,
ich habe da eine Excel Tabelle die in etwa so aufgebaut ist:
Artikel Artikelnummer Eigen1
1SP 2SP 3SP
358 S162 F10 - moos
124 S203 1C0 - silber
124 S203 1C0 - silber
124 S203 209 - black
124 S203 209 - black
124 S203 209 - black
124 S203 209 - black
124 S203 5A7 - champagner
560 S207 Primer
560 S207 Primer
560 S207 1E9 - anthrazit
560 S207 1E9 - anthrazit
114 S208 6S3 - opalgün
1 Zeile= 1 Stück. Ich bräuchte nun eine Summe pro Gruppierter 3 Spalte, Wobei ich auch nur eine Zeile davon sehen muss, also so in etw:
Code: Alles auswählen
aus
124 S203 1C0 - silber
124 S203 1C0 - silber
124 S203 209 - black
124 S203 209 - black
124 S203 209 - black
124 S203 209 - black
wird
124 S203 1C0 - silber 2 Stück
124 S203 209 - black 4 Stück
Danke
Markus
Re: Excel Frage Gruppieren und Summe?
Verfasst: Fr, 18. Okt 2013 10:22
von Magic
Nur mal so am Rande, auch wenn es nicht zur Lösung Deines Problems beiträgt.
Ich habe in der Vergangenheit oft Daten nach Excel übergeben. Und stand quasi immer wieder vor dem gleichen Problem:
wo und wie bereite ich die Daten auf? D.h. wo und wann bilde ich z.B. Summen, Zwischensummern, etc. Wie sieht es aus mit Formatierungen, etc.
Nach vielen Rumprobieren und Testen habe ich folgenden Weg für mich gewählt, denn ich bis Dato nutze:
Nach Excel übergebe ich i.d.R. immer nur Rohdaten und bereite sie dann mittels VBA (Makros) auf. Bei gewünschten Änderungen kann ich schnell reagieren, muss als nicht noch mal das eigentliche Programm anpassen, sondern i.d.R. - solange die Datenquelle sich nicht ändert - nur lediglich Makros in Excel anpassen.
Aus der eigenen Erfahrung kann ich sagen, dass es auch deutlich schneller ist als das Direkte Übergeben aus Xbase++ heraus. Manch anderer mag vielleicht andere Erfahrungen gesammelt haben und empfiehlt daher ein anderes Vorgehen.
Im Einzelnen läuft es in etwa so:
* im Xbase++ Programm werden die benötigten Daten ermittelt
* dann wird im Xbase++ Programm eine .CSV Datei erzeugt mit den Daten die nach Excel übergeben werden sollen
* anschließend (aus Xbase++ heraus) ruf ich in Excel ein Makro auf
* dieses importiert die Daten (also die .CSV Datei) und bereitet sie wie vom Anwender gewünscht auf
Das ganze ist sau schnell, vor allem wenn man Tausende von Daten nach Excel exportieren will/muss.
Ich brauche also keine Excel Zeilen/Spalten/Zellen, etc. aus Xbase heraus ansprechen, muss mir aber im Klaren sein, dass ich mich dann mit VBA auseinander setzen muss. Natürlich ein Vorteil wenn man mit VBA schon früher in Berührung gekommen ist und weißt wie es grundsätzlich läuft.
Re: Excel Frage Gruppieren und Summe?
Verfasst: Fr, 18. Okt 2013 10:41
von georg
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.
Re: Excel Frage Gruppieren und Summe?
Verfasst: Fr, 18. Okt 2013 10:46
von satmax
DAnke für die raschen Tipps! Die Daten sind vorgegeben und nicht von meinem Programm. Ich habe also nur Excel zur Weiterverarbeitung.
Gruß
Markus
Re: Excel Frage Gruppieren und Summe?
Verfasst: Fr, 18. Okt 2013 10:47
von georg
Hallo, Markus -
OfficeAutomation sollte in Deiner Xbase++-Lizenz enthalten sein, während SQLExpress ein 3rd-Party-Produkt ist.
Re: Excel Frage Gruppieren und Summe?
Verfasst: Fr, 18. Okt 2013 14:09
von Wolfgang Ciriack
Mal als Anmerkung, so würde ich das nicht machen, das ist sehr langsam.
FOR nI := 1 TO nLen
oSheet:Cells(nI, 1):Value := aDaten[nI, 1]
...
oSheet:Cells(nI, 4):Value := aData[nI, 4]
NEXT
Besser ist:
Code: Alles auswählen
oRange := oWorkSheet:Range(cRange)
oRange:Select()
oRange:Value := aData
oRange := nil
Re: Excel Frage Gruppieren und Summe?
Verfasst: Fr, 18. Okt 2013 15:53
von georg
Hallo, Wolfgang -
wenn Du jetzt noch zeigst, wie Du cRange beschickst, wäre es richtig rund.
Re: Excel Frage Gruppieren und Summe?
Verfasst: Fr, 18. Okt 2013 15:57
von Koverhage
Hallo Georg,
normal wird das so gemacht
Range("A1:W1")
Schneller kann man die Daten nicht übertragen.
Re: Excel Frage Gruppieren und Summe?
Verfasst: Sa, 19. Okt 2013 1:02
von AUGE_OHR
Koverhage hat geschrieben:Range("A1:W1")
wenn du mit 23 Column auskommst
wenn ich ein 2-Dim Array habe ergibt sich die Anzahl von Spalten.
Code: Alles auswählen
numColumns := LEN( MyArray[1] )
cEnde := ZAHL2CHR(numColumns)
oSheet:range( "A1:"+cEnde+LTRIM(STR(numRows)) ):value := MyArray
FUNCTION ZAHL2CHR(numColumns)
LOCAL nMal
LOCAL cEnde
IF numColumns > 26
nMal := INT(numColumns/26)
cEnde := CHR(nMal+64)+CHR((numColumns-(nMal*26))+64)
ELSE
cEnde := CHR(numColumns+64)
ENDIF
RETURN cEnde
Re: Excel Frage Gruppieren und Summe?
Verfasst: Sa, 19. Okt 2013 1:22
von AUGE_OHR
Magic hat geschrieben:* anschließend (aus Xbase++ heraus) ruf ich in Excel ein Makro auf
könntest du bitte paar Zeilen zeigen wie man ein Excel Makro aufruft, Danke.
Re: Excel Frage Gruppieren und Summe?
Verfasst: Mo, 21. Okt 2013 7:42
von Magic
AUGE_OHR hat geschrieben:könntest du bitte paar Zeilen zeigen wie man ein Excel Makro aufruft
Code: Alles auswählen
/////////////////////////////////////////////////////////////////////////////
// Excel-Datei aus Excel-Vorlage erstellen, dann Makro starten
/////////////////////////////////////////////////////////////////////////////
// Infofeld setzen
poInfoFeld := "Excel wird für die Datenverarbeitung vorbereitet ..."
::aSles[pnSleNumber]:_setData()
// ExcelVorlage kopieren und als .XLS Datei speichern
cExcelFileName := CopyExcelVorlageToXLSFile( MEMVAR->pcExcelVorlage, ;
SubStr( pcFileName, 1, Len( pcFileName ) - 4 ) + ::_CreateCreateTimestamp() + Right( pcFileName, 4 ) )
// Jetzt öffne die Excel Datei und führe ein Makro aus
oExcel := ActiveXObject():create( "Excel.Application" )
IF .NOT. ( oExcel == NIL )
// Excel unsichtbar ausführen
oExcel:visible := .F.
// Interaktion mir User ausschalten
oExcel:interactive := .F.
// Excel Meldungen ausschalten
oExcel:Application:DisplayAlerts := .F.
// Excel-Arbeitsblatt öffnen
oWorkBook := oExcel:workbooks:open( cExcelFileName, xlExclusive )
// Infofeld setzen
poInfoFeld := "Daten werden in Excel importiert ..."
::aSles[pnSleNumber]:_setData()
// Makro starten !!!
oExcel:Application:Run( pcExcelMacro )
// Cursor positionieren
oExcel:RANGE( "A2" ):select()
// Infofeld setzen
poInfoFeld := "Excel wird gespeichert ..."
::aSles[pnSleNumber]:_setData()
// Excel speichern
oWorkBook:saveas( cExcelFileName ) //, xlWorkbookNormal )
// Interaktion mir User einschalten
oExcel:interactive := .T.
// Excel Meldungen einschalten
oExcel:Application:DisplayAlerts := .T.
// Excel Objekt löschen
oWorkBook:destroy()
oExcel:quit()
oExcel:destroy()
ELSE
cTmp := StrTran( pp_FEHLERINMETHODE, "#1###", ProcName() )
cTmp := StrTran( cTmp, "#2###", Alltrim(Str(ProcLine())) )
Private_MsgBox( MEMVAR->gaVersion[ProductName][2], ;
{ {cTmp},{"Fehler bei erzeugen eines Excel-Objekts!"} }, ;
"E" ;
)
_AppQuit( .F. )
ENDIF
Re: Excel Frage Gruppieren und Summe?
Verfasst: Mo, 21. Okt 2013 19:46
von AUGE_OHR
@Magic : Danke