none
Excel-Automatisierung

    Frage

  • ich habe mich leider bisher noch nie mit Excel-Automatisierung beschäftigt und kenne mich mit Excel selber auch nicht gut aus, habe aber jetzt die Aufgabe, aus einem sehr komplexen Excel-Sheet Daten auszulesen und Daten einzusetzen.

    Der Kunde hat das Excel-Sheet über Jahre hinweg entwickelt und will damit auch weiter arbeiten. Es besteht aus ca 70 Spalten, die in lesbarer Größe voll ausgeklappt noch nicht mal auf meine 3 nebeneinander stehenden Monitore passen, etlichen Zwischen-Überschriften etc., aber nur wenige berechenbare Felder.

    Ich will jetzt das nun im Wesentlichen als VFP-Tabelle(n) einlesen, Änderungen machen können und zurückschreiben können. Zudem muss das Schema konfigurierbar sein, da u.U. auch mal Änderungen an der Excel-Sheet-Struktur gemacht werden. Laufen soll das mit Excel 2007,2010,2013.

    Kann mir jemand einen Tipp geben, wie ich da am Besten einsteige (möglichst, ohne dass ich einen Excel-Anwenderkurs belegen muss)?

    Gruß,

    Winfried

    Donnerstag, 14. März 2013 12:23

Antworten

  • Hallo WiWo,

    eigentlich bin ich hundemüde aber morgen komm ich nicht dazu Dir was zu schreiben.
    Hoffe ich kriege was Verständliches zusammen.

    Ein bißchen lesen musst Du dazu schon. Ich bin eingestiegen mit dem Buch "Microsoft Office Automation with Visual FoxPro" von Tamar E. Granor und das war okay. Ich würd das auch heute noch befürworten obwohl es mittlerweile sehr alt ist (2000) aber das Prinzip an die Sache ranzugehen ist davon unberührt und die grundlegenden Befehle und Objektnamen auch. Es ist damit auch ziemlich schnell gegangen und hat meine Notwendigkeiten  gut abgedeckt. (Nein , ich will Dir nicht meine Restblätter verkaufen:-), ich finds wirklich gut).

    Excel besteht aus Objekten und das Wesentliche ist es, sich dieses Excel-Objektmodel klar zu machen und die Hierarchien  heraus zu finden. Öffnen tust Du die Excelapplikation mit
    oExcel = CREATEOBJECT('Excel.Application') und kannst dann über oExcel auf die einzelnen Objekte zugreifen. Eine Tabelle beispielsweise ist dem Applicationsobjekt untergeordnet und wird angesprochen mit oExcel.workbooks. Diese hat dann wie alles Methoden und Events. Zum Öffnen
    gibt es die Methode open und also: oExcel.workbooks.open("tabelle1.xlsx"). na und dann machste noch mit oExcel.visible = .T. das Licht an.

    Wenn Du nach dem Excel-Objektmodell googelst bekommst Du alles mögliche. beispielhaft vielleicht:

    http://openbook.galileocomputing.de/vb_net/msvb040001.htm#Rxxmsvb040001274ZugriffaufExcelArbeitsmappen

    http://msdn.microsoft.com/de-de/library/wss56bz7%28v=vs.80%29.aspx

    Hier musst Du Dir am besten das raussuchen was für Dich am besten beschrieben ist.

    Du kannst ruhig auch die VBA -Sachen  anschauen. Die Objekte und Klassen usw sind ja identisch.
    Eine kleine Hilfe könnte sein die Makroprogrammierung innerhalb Excel zu benutzen und sich die aufgezeichneten Makros anzuschauen bzw. diese Texte ebenfalls zu benutzen.

    Ja, und so sind Tabelle, Tabellenblätter , Spalten und Reihen und schliesslich die Zellen alles Objekte
    und über deren Methoden und Properties kannst eben lesen und steuern.

    Und einen Tipp mittenraus(aber ich hab damals lange danach gesucht und nur als Tipp bekommen):
    irgendwann musst Du alle Zeilen und Spalten abgrasen und suchst dann nach den Properties die Dir
    die Maxanzahl angeben:

    with oExcel
        lnLastRow=.ActiveCell.SpecialCells(11).Row
        lnLastCol=.ActiveCell.SpecialCells(11).Column
    ENDWITH

    Aber Vorsicht, ich erleb das hin und an das aus irgendwelchen Gründen eine Tabelle ca 200 Zeilen
    hat und dann steht in Zeile 14678 irgendein Buchstabe. dann gilt als Maximalzeile diese Zahl.

    Aber das sind Probleme die später kommen, versuch einfach zunächst Dir das ExcelObjektmodell
    klar zu machen. Aber am Anfang nur das Notwendigste. Das ganze Modell ist viel zu aufwendig.
    Und das Notwendigste sind die oben genannten Objekte.

    hth etwas

    Horst


    • Als Antwort markiert WiWo Dienstag, 19. März 2013 14:49
    Donnerstag, 14. März 2013 21:28

Alle Antworten

  • Hallo WiWo,

    eigentlich bin ich hundemüde aber morgen komm ich nicht dazu Dir was zu schreiben.
    Hoffe ich kriege was Verständliches zusammen.

    Ein bißchen lesen musst Du dazu schon. Ich bin eingestiegen mit dem Buch "Microsoft Office Automation with Visual FoxPro" von Tamar E. Granor und das war okay. Ich würd das auch heute noch befürworten obwohl es mittlerweile sehr alt ist (2000) aber das Prinzip an die Sache ranzugehen ist davon unberührt und die grundlegenden Befehle und Objektnamen auch. Es ist damit auch ziemlich schnell gegangen und hat meine Notwendigkeiten  gut abgedeckt. (Nein , ich will Dir nicht meine Restblätter verkaufen:-), ich finds wirklich gut).

    Excel besteht aus Objekten und das Wesentliche ist es, sich dieses Excel-Objektmodel klar zu machen und die Hierarchien  heraus zu finden. Öffnen tust Du die Excelapplikation mit
    oExcel = CREATEOBJECT('Excel.Application') und kannst dann über oExcel auf die einzelnen Objekte zugreifen. Eine Tabelle beispielsweise ist dem Applicationsobjekt untergeordnet und wird angesprochen mit oExcel.workbooks. Diese hat dann wie alles Methoden und Events. Zum Öffnen
    gibt es die Methode open und also: oExcel.workbooks.open("tabelle1.xlsx"). na und dann machste noch mit oExcel.visible = .T. das Licht an.

    Wenn Du nach dem Excel-Objektmodell googelst bekommst Du alles mögliche. beispielhaft vielleicht:

    http://openbook.galileocomputing.de/vb_net/msvb040001.htm#Rxxmsvb040001274ZugriffaufExcelArbeitsmappen

    http://msdn.microsoft.com/de-de/library/wss56bz7%28v=vs.80%29.aspx

    Hier musst Du Dir am besten das raussuchen was für Dich am besten beschrieben ist.

    Du kannst ruhig auch die VBA -Sachen  anschauen. Die Objekte und Klassen usw sind ja identisch.
    Eine kleine Hilfe könnte sein die Makroprogrammierung innerhalb Excel zu benutzen und sich die aufgezeichneten Makros anzuschauen bzw. diese Texte ebenfalls zu benutzen.

    Ja, und so sind Tabelle, Tabellenblätter , Spalten und Reihen und schliesslich die Zellen alles Objekte
    und über deren Methoden und Properties kannst eben lesen und steuern.

    Und einen Tipp mittenraus(aber ich hab damals lange danach gesucht und nur als Tipp bekommen):
    irgendwann musst Du alle Zeilen und Spalten abgrasen und suchst dann nach den Properties die Dir
    die Maxanzahl angeben:

    with oExcel
        lnLastRow=.ActiveCell.SpecialCells(11).Row
        lnLastCol=.ActiveCell.SpecialCells(11).Column
    ENDWITH

    Aber Vorsicht, ich erleb das hin und an das aus irgendwelchen Gründen eine Tabelle ca 200 Zeilen
    hat und dann steht in Zeile 14678 irgendein Buchstabe. dann gilt als Maximalzeile diese Zahl.

    Aber das sind Probleme die später kommen, versuch einfach zunächst Dir das ExcelObjektmodell
    klar zu machen. Aber am Anfang nur das Notwendigste. Das ganze Modell ist viel zu aufwendig.
    Und das Notwendigste sind die oben genannten Objekte.

    hth etwas

    Horst


    • Als Antwort markiert WiWo Dienstag, 19. März 2013 14:49
    Donnerstag, 14. März 2013 21:28
  • Hallo WiWo,

    als ich mich mit so einem Problem herumgeschlagen habe, hatte ich keine Literatur. Ich habe mich hauptsächlich in Intellisens durchgehangelt. Probier es einmal im Befehlsfenster.

    Hier mal ein Code-Beispiel, ich exportiere einen Cursor in Excel und ändere die Spaltenüberschriften.

    lcExpName = PUTFILE('', 'export.xls', 'xls')
    lcExcelTemp = SYS(2023)+'tmpexpo.xls'
    COPY TO (lcExcelTemp) TYPE XL5
    oleApp = CREATEOBJECT("Excel.Application")
    oleApp.Workbooks.Add(lcExcelTemp)
    loSheet = oleApp.ActiveSheet
    loSheet.Cells(1,5).Value = THISFORM.gridx.Column3.header1.CAPTION
    loSheet.Cells(1,6).Value = THISFORM.gridx.Column4.header1.CAPTION
    loSheet.Cells(1,7).Value = THISFORM.gridx.Column5.header1.CAPTION
    loSheet.Cells(1,8).Value = THISFORM.gridx.Column6.header1.CAPTION
    loSheet.Cells(1,9).Value = THISFORM.gridx.Column7.header1.CAPTION
    loSheet.Cells(1,10).Value = THISFORM.gridx.Column8.header1.CAPTION
    loSheet.Cells(1,11).Value = THISFORM.gridx.Column9.header1.CAPTION
    loSheet.Cells(1,12).Value = THISFORM.gridx.Column10.header1.CAPTION
    loSheet.Cells(1,13).Value = THISFORM.gridx.Column11.header1.CAPTION
    loSheet.Cells(1,14).Value = THISFORM.gridx.Column12.header1.CAPTION
    loSheet.SaveAs(lcExpName)
    oleapp.Workbooks.CLOSE
    DELETE FILE (lcExcelTemp)
    RELEASE loSheet,oleApp
    


    Guss Uli

    Freitag, 15. März 2013 07:58
  • Moin, moin

    für mich ein Must have ist das office automation Buch von hentzenwerke.

    Hier ein paar Basics :

    try
     oExcel = GetObject(,'Excel.Application')
    catch
       oExcel = CreateObject('Excel.Application')
    endtry

    If Vartype(oExcel) != "O"

      * fehler
      Return .F.
    ENDIF
    doevents force

    * Ab hier hilft intellisense ungemein, gib mal in der Kommandozeile oexcel. ein

    oWorkbook = oExcel.Workbooks.Open(oapp.cimppath + "Kosten.xls")

    oWorkbook.worksheets[2].Select && Tabelle2

    xwert = oexcel.cells(nRow, nCol).value && bzw. umgekehrt für zuweisung

    xwert = oexcel.cells(nRow, nCol).text && bzw. umgekehrt für zuweisung

    oexcel.save()

    oexcel.quit()

    release oexcel, oworkbook

    Für manches braucht man einen "Range" (A0:B7) im gegensatz zu den cells (zeile,spalte). Kann man aber !"umrechnen"

    z.B. * cells to range
    * oe.range(oe.cells(1,1),oe.cells(1,1)).font.bold = 1

    * range to cells
    * nSpalte = oe.range(or).column

    hth

    Gruesse

    tom

    Freitag, 15. März 2013 09:02
  • Hallo Tom,

    das ist doch das Buch welches ich meinte - von Granor /Martin, oder?-
    kann glaube ich auch bei der DFPUG bestellt werden.
    (Wenn es denn vorrätig ist (wahrscheinlich nicht mehr)-sonst würd ich auch die Hentzenwerke
    empfehlen).
    Hat auch den Vorteil das auch die Automatisierung der anderen Office Anwendungen
    beschrieben ist.

    Grüsse aus dem sonnigen WBL

    Horst

    Freitag, 15. März 2013 09:56
  • Danke für Eure Antworten.

    Ich hab inzwischen en bisschen mit der Automatisierung rumgespielt und dadurch ist auch die Scheu vor der Materie kleiner geworden. Vermutlich ist meine Aufgabenstellung auch gar nicht so komplex; ich muss nur das Arbeitsblatt zellenweise durchsuchen um die darin vorhandene(n) Tabelle(n) zu ermitteln und zu pflegen. Durch die Größe und der farbigen Komplexität der Arbeitsblätter war ich etwas verschreckt worden. Die Anwender machen damit eben irgendwie auch alles, was ich mit einem Datenbanksystem machen würde. Das sind langjährige Excel-Spezies, aber nun stoßen sie doch an Grenzen, wollen aber ihre bisherige Linie nicht verlassen sondern nur so was wie ein Add-on.

    Gruß,

    Winfried

    Montag, 18. März 2013 12:39
  • Hallo Wiwo,

    was Du da beschreibts ist eigentlich ein typisches Szenario. So eine lange gepflegte Excelliste
    kommt immer bunt und gewaltig daher. Ich kann die Anwender auch verstehen da sie sich selber eine gute Übersicht und Berechnungen verschaffen können ohne programmieren zu müssen. Und mal eben eine Zahl zu ändern und zu sehen wie sich alles mitändert ohne Programmierung ist schon okay. In gewissen Grenzen hat das Ganze so ja auch einen Vorteil, aaaber es gibt natürlich einen gewaltigen Nachteil und da will ich Dich aus meiner Erfahrungskiste heraus mal vorwarnen:

    Es gibt natürlich keine Feldbezeichnungen und Anwender ändern in aller Unschuld mal eben die Tabellen indem sie (sehr beliebt) eine Spalte einfügen weil der neue Wert dort optisch auch am besten passt. Dann steht der ursprüngliche Wert aus z.B. Spalte F nun in Spalte G. Wenn Du dann programmtisch alles einliest gibt's natürlich die falschen Werte und am besten ist es wenn z.B. Berechnungen gemacht werden und keiner merkt das es die falschen Zahlen sind. Also achte drauf das da feste Verabredungen bestehen oder aber die erste Zeile z.B. als Feldüberschrift benutzt wird. Sonst gibts garantiert irgendwann Chaos.

    Also viel Spass mit den Dingern

    Horst

    Dienstag, 19. März 2013 11:53
  • Danke Horst, ich werd's mir hinter die Löffel schreiben..

    Ich hab inzwischen alles auch ganz gut durchgespielt; mehr mache ich erst, wenn der Auftrag in trockenen Tüchern ist.

    Gruß,

    Winfried

    Montag, 25. März 2013 09:00