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