Frage Excelautomation

  • Montag, 5. November 2012 05:49
     
     

    Hallo Leute,

    eine kleine Mondaymorning-Frage.

    ich soll aus bestimmten Vorgaben eine Exceldatei erzeugen. Also bastel ich eine DBF und kopier sie dann via copy to..type xl5.
    Dann rufe ich sie auf und fülle diverse Felder mit Formeln.

    lcZelle = "Q23"

    loex = CREATEOBJECT('Excel.Application')
    loQuelldat = loEx.workbooks.open("C:\Spielwiese\Test.xls",0)
    loQuelldat.sheets("Test1").activate

    loQuelldat.activesheet.Range(lcZelle).Formula = '=SUMMEWENN( B3:B21 ,"A" , Q3:Q21 )'

    Nun passiert folgendes:

    - Die Kommas werden zu Semikolons (was in Excel sein muss). Aber Semikolons darf ich nicht so übergeben, das gibt Ärger.Nun gut.

    - In der Excelzelle steht entweder der String so korrekt, in der Zelle erscheint aber #Name. Gehe ich dann mit dem Cursor auf die Formelzeile oben
      und drücke Enter dann erkennt Excel irgendwie was das ist und bringt in der Zelle die korreke Berechnung.

    - oder in Excel steht in der Zellenformelzeile : =SUMMEWENN('B3:B21,"A";'Q3:Q21') und es wird natürlich nix berechnet. Warum packt "er" diese
      Hochkommas da mit rein?

    Ich hab schon auf alle möglichen Art versucht den String zu übergeben (mit [ oder als Variable, mit " oder wie oben). Eigentlich liegt mir die Formel in einem Zeichenfeld in einer Dbf  vor.

    Kann einer damit was anfangen. Ich habe hier Excelversion 2007. Laufen soll das auf allen möglichen Versionen. Oder kann man das generell besser
    machen?

    TIA
    Horst

Alle Antworten

  • Montag, 5. November 2012 19:00
     
     

    Macroaufzeichnung in Excel (2010) zeichnet auf:

    ActiveCell.FormulaR1C1 = "=SUM(...)"

    Also solltest Du auch statt Formula FormulaR1C1 füllen und dabei englische Begrifflichkeiten nehmen. SUMMEWENN wäre da z.B. "=SUMIF(...)", Makro aufzeichnen hilft Dir, alles herauszufinden, was Du wissen mußt.

    Tschüß, Olaf.

  • Dienstag, 6. November 2012 18:46
     
     

    wenn keiner mehr reagiert kommt doch noch einer :-))

    Hallo Olaf, sei gegrüßt.

    Ja, ich hatte es nicht erwähnt, die Makroaufzeichnung hatte ich auch schon gemacht  und auch FormularR1C1 eingegeben-leider ohne Erfolg.
    Allerdings war ich nicht auf die Idee gekommen SUMIF anstelle SUMMEWENN zu nehmen da man das ja auch in die Zellenzeile schreibt. Es wird einem klar das dies nur eine Übersetzung ist. Aber auch wenn ich das tue ändert sich nichts. Wenn man sich dann diesen aufgezeichneten Makrostring anguckt
    =SUMIF(R[-21]C[-15]:R[-3]C[-15],""A"",R[-21]C:R[-3]C)
    wird einem zunächst etwas schwindelig   , aber später klar das dies Bezüge sind, Spalten und Reihen vertauscht ,okay. Und das man es leider so nicht übernehman kann. Die Semikolons sind hier immerhin auch schon in Kommas gewandelt, aber wenn man das mit ""A"" so macht gibts Ärger.

    Gut, Ich hab dann einfach die Summenzeile vorher programmtisch angewählt mit select und diese Formel hintergeschickt. Ruft man die Exceltabelle danach wieder auf steht in der Zelle : =SUMMEWENN(#BEZUG!;"A";#BEZUG!) und in der entsprechende Zelle steht irgendeine Zahl. ich kann dann in den zu summerienden Zeilen ändern was ich will, die Zahl ändert sich nicht und ich sehe auch keinen Bezug zu dem diese Zahl passen würde.
    Immerhin wird nicht gemosert.

    Also: so einfach übernehmen is nich. Aber warum sollte es auch so einfach sein??? Man sollt halt noch ein bißchen lesen, bei MS leidet man ja nicht darunter das man zuwenig zum Lesen bekommt:-)))
    Okay, ich hab jetzt noch dringlich ein paar Tage anders zu tun und komm diese Woche nicht mehr dazu. Und dann werd ich mal schauen.

    Hab erstmal Dank für den Tipp

    Grüße aus dem WBL

    Horst

  • Dienstag, 6. November 2012 22:41
     
     

    Hm,

    ich hab's nicht großartig weiter ausprobiert, aber was die doppelten Anführungszeichen angeht (""A"") die stehen für einzelne, in VB kann man Anführungszeichen innerhalb von Anführungszeichen so hinkriegen. 

    .FormulaR1C1 = '=SUMIF(R[-21]C[-15]:R[-3]C[-15],"A",R[-21]C:R[-3]C)'

    sollte schon eher gehen.

    R dürfte für Row, und C für Column stehenund die Indexwerte relativ zur Zelle, in der die Formel steht. Ich kann mir gut vorstellen, daß da auch absolute Zellnamen gehen.

    Naja, wir sehen dann nächste Woche weiter

    Tschüß, Olaf.

  • Freitag, 9. November 2012 14:53
     
     

    Hallo Horst,

    bei mir geht's mit:

    loQuelldat.activesheet.Range(lcZelle).Formula = "=SUMIF(B3:B21,"+'"'+'A'+'"'+", C3:C21 )"

    Sieht komisch aus, ist aber so. ;)
    Das schließt natürlich nicht aus, dass jemand noch einen eleganteren Weg findet.

    Schönes WE.
    Frank.

  • Mittwoch, 14. November 2012 07:36
     
     

    Hallo Frank,

    nu komm ich erst jetzt dazu weil  zwischenzeitlich einiges passiert ist und manchmal die Welt  doch kurz stehen bleibt...

    Also das funktioniert nicht nur bei Dir :-)
    Und sieht wirklich etwas merkwürdig aus. Da wird also die gesamte Bedingung als String übergeben (okay) und jedes Zeichen muss einzeln dazugehängt werden und das Ganze wird offensichtlich in ein bestehendes Gerüst hineingeparst (wenn ich das mal so etwas unbeholfen beschreiben darf).

    wie kommt man denn auf sowas ??

    Aber egal, Komik hin, Eleganz her, es funzt....mal sehen was da noch an Wünschen und Lösungen kommt, ich glaub ich muss mich damit noch intensiver auseinandersetzen.

    Hab recht herzlichen Dank, war wirklich wertvoll

    Grüsse aus dem WBL

    Horst

  • Mittwoch, 14. November 2012 11:17
     
     

    Es gibt neben " und ' auch noch [] als Stringbegrenzer in Foxpro.

    Du kannst Dir das zerfranste zusammensetzen des zu übergebenden Strings mit ...+'"'+'A'+'"'+... ersparen, wenn Du alles in [...] fasst: [=SUMIF(B3:B21,"A",C3:C21)] oder auch '=SUMIF(B3:B21,"A",C3:C21)'

    Daumenregeln: Wenn innerhalb des Strings " vorkommen soll, dann ' als Begrenzer nehmen, wenn ' innerhalb vorkommen soll, dann " nehmen, wenn beides vorkommen sollte, dann [] nehmen und wenn das auch noch im String vorkommen sollte, dann ginge zur Not einerseits noch TEXT...ENDTEXT, aber andererseits natürlich auch Zusammensetzung. Nur ist das die letzte Lösung, nicht die erste.

    Tschüß, Olaf.


  • Mittwoch, 14. November 2012 13:52
     
     

    Huocch nee -  Manno mann

    Jetzt hab ich eine kleine Entwickluing hinter mir.

    Der erste Gedanke war: Ich geh in Rente. Wieso komm ich da nicht drauf , Diese Stringbegrenzer kenn ich natürlich alle.(Auch Text...ENDTEXT)  Und hab mir auch gedacht das das noch einfacher geht. Und Du wirst lachen, ich habe Deinen Vorschlag sogar schon ohne Erfolg vorher so ausprobiert. 

    Aber ich hatte die Tomatenscheiben mal wieder an der falschen Stelle und war voll auf den String und die Formel konzentriert.

    Mir ist folgendes aufgefallen:

    Das Makro benutzt FormulaR1C1. Wenn Du hiermit Frank's Formel oder Deine Vereinfachung nimmst schreibt Excel in die obige Formel =SUMMEWENN('B21':'B3';"A";'Q21':'Q3') und in die Zelle :  #Name? und berechnet nix.

    (beachte die Begrenzer um die Zellen und Reihenangaben, die so nicht sein dürfen)

    Wenn Du aber statt dessen nur Formular = ......schreibst (also ohne R1C1) dann funktioniert es !

    Also Vorsicht bei Makros und Relationen und Microsoftprodukten im allgemeinen und auf der Strasse

    Grüsse aus dem sonnigen WBL

    Horst

  • Freitag, 16. November 2012 09:17
     
     
    Wenn Du aber statt dessen nur Formular = ......schreibst (also ohne R1C1) dann funktioniert es !

    Also Vorsicht bei Makros und Relationen und Microsoftprodukten im allgemeinen und auf der Strasse

    Das ist schon merkwürdig, denn Makroaufzeichung schreibt in FormulaR1C1, allerdings sah die Formel dann ja auch ganz anders aus. Also, Makroaufzeichnung gibt auch nur Hinweise.

    Onlinehilfe zu FormulaR1C1 sagt aus:

    Ruft einen Wert vom Typ String ab, der die Formel des Objekts in der R1C1-Schreibweise und in englischer Sprache darstellt, oder legt diesen Wert fest. here for your reference.

    Also gibt es eine R1C1-Schreibweise und die Formula-Egenschaft ohne diesen Suffix im Namen nimmt üblichere Formeln an:

    Formula:

    Ruft einen Wert vom Typ String ab, der die Formel des Objekts in der A1-Schreibweise und in englischer Sprache darstellt, oder legt diesen Wert fest. here for your reference.

    A1-Schreibweise scheint also die normale zu sein, aber englisch.

    FormulaLocal:

    Ruft einen Wert vom Typ String ab, der die Formel des Objekts in der A1-Schreibweise und in der Sprache des Benutzers darstellt, oder legt diesen Wert fest. here for your reference."

    Und immer schon rechts vor links beachten - auf der Straße.

    Tschüß, Olaf.



  • Freitag, 16. November 2012 11:11
     
     
    Und immer schon rechts vor links beachten - auf der Straße.

         aber nicht überall - aber zumindest local - also in Deutschland..:-)))

         Grüsse aus dem grauen WBL

         Horst