Excel Frage Gruppieren und Summe?

Alles was nicht wirklich Programmierung ist, aber auch nicht Plaudereien im Raucherraum

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Excel Frage Gruppieren und Summe?

Beitrag 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
Gruß
Markus
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Excel Frage Gruppieren und Summe?

Beitrag 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.
Gruß,
Magic
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Excel Frage Gruppieren und Summe?

Beitrag 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.
Zuletzt geändert von georg am Fr, 18. Okt 2013 11:22, insgesamt 1-mal geändert.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Excel Frage Gruppieren und Summe?

Beitrag 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
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Excel Frage Gruppieren und Summe?

Beitrag von georg »

Hallo, Markus -


OfficeAutomation sollte in Deiner Xbase++-Lizenz enthalten sein, während SQLExpress ein 3rd-Party-Produkt ist.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Excel Frage Gruppieren und Summe?

Beitrag 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
Viele Grüße
Wolfgang
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Excel Frage Gruppieren und Summe?

Beitrag von georg »

Hallo, Wolfgang -


wenn Du jetzt noch zeigst, wie Du cRange beschickst, wäre es richtig rund.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Excel Frage Gruppieren und Summe?

Beitrag von Koverhage »

Hallo Georg,

normal wird das so gemacht

Range("A1:W1")

Schneller kann man die Daten nicht übertragen.
Gruß
Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel Frage Gruppieren und Summe?

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel Frage Gruppieren und Summe?

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Excel Frage Gruppieren und Summe?

Beitrag 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
Gruß,
Magic
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Excel Frage Gruppieren und Summe?

Beitrag von AUGE_OHR »

@Magic : Danke
gruss by OHR
Jimmy
Antworten