2017-01-13 7 views
1

Ich habe mit grundlegender Excel Automatisierung mit der COM-Schnittstelle herum spielen, vor allem IDispatch::Invoke nutzen.Die Verwendung von nicht lokalisierten Formeln in Excel Automatisierung

beteiligt Mein Test eine Formel in einem frisch erstellten Excel-Dokument hinzufügen. eine erdacht Wrapper-Bibliothek verwenden, sieht es wie folgt aus:

sheet.getObject("Range", "A1").set("Value", 23); 
sheet.getObject("Range", "A2").set("Value", 42); 
sheet.getObject("Range", "A3").set("Formula", "=SUMME(A1:A2)"); // WTF? 

Hinweis: Ich bin mit dem (Deutsch) lokalisierte Formel Name SUMME hier anstelle der Kennung SUM wie erwartet. Wenn Sie das gleiche mit dem Makrorecorder in Excel tun, enthält der generierte VBA-Code SUM. Unter Verwendung von SUM in meinem C++ - Code habe ich einen Fehler #NAME? in Excel.

Microsofts documentation for the Range.FormulaLocal Property sagt der folgende:

Ermittelt oder legt die Formel für das Objekt, unter Verwendung der A1-Referenzen in der Sprache des Benutzers.

(Schwerpunkt wurde von mir gemacht). So

Ich hoffte, dass Formula statt FormulaLocal ich mit um diese Lokalisierung Leiden bekommen konnte, aber anscheinend ist dies nicht der Fall ist.

Gibt es irgendeine Weise, die ich nicht lokalisierten Formeln verwenden kann? Ich denke, es gibt eine gut versteckte Umgebung.

+1

Ja, es funktioniert für mich. Ich benutze Excel in Spanisch und die Eigenschaft Formel ist mit englischen Namen zugewiesen und es funktioniert.Keine versteckten Einstellungen, aber ich erinnere mich, dass es bei älteren Excel-Versionen (vor 12, ziemlich alt) nicht funktioniert hat. –

+0

@ CarlosE.Ferro Bedeutet "12" Office 12 oder Office 2007? Ich verwende Excel 2010 hier. – mkluwe

+0

Ja, ich sagte dir, es war ziemlich alt. Excel 2007 hat funktioniert, also weiß ich nicht, warum es bei Ihnen nicht funktioniert. Entschuldigung :-( –

Antwort

0

eine Antwort Hinzufügen zu dokumentieren, was ich herausgefunden:

Abhilfe für Formula

die Formula Eigenschaft zu setzen, gibt es ultimativ ein Aufruf an IDispatch::Invoke, die als

umgesetzt wurde
object->Invoke(
    dispid, 
    IID_NULL, 
    LOCALE_USER_DEFAULT, // <-- "locale context" 
    DISPATCH_PROPERTYPUT, 
    &dispparams, 
    NULL, 
    &excepinfo, 
    &argerr)); 

Ändern LOCALE_USER_DEFAULT-LOCALE_NEUTRAL hat den Effekt, dass die Eigenschaften und beginnen, sich anders zu verhalten. In meinem Deutsch lokalisierte Installation Excel die beiden Anrufe

sheet.getObject("Range", "A3").set("FormulaLocal", "=SUMME(A1:A2)"); 
sheet.getObject("Range", "B3").set("Formula", "=SUM(A1:A2)"); 

jetzt das Gleiche tun.

Derzeit ist dies keine wirkliche Lösung für mein Problem, wie ich in der Regel erwarten die Dinge nicht so dokumentiert Arbeit zu brechen leise hinter meinem Rücken. Beweis: NumberFormat und NumberFormatLocal noch das gleiche tun, das heißt, ich bin den lokalisierten Datumsformat-Codes zu verwenden, erforderlich (z "JJJJ-MM-TT" für ISO 8601) mit beiden Eigenschaften (!).

Abhilfe für NumberFormat

das Format-String zu erstellen: Verwenden Sie die Application.International Property.

+1

Oh, ich vergesse die LOCALE_ID (LCID), die in diesen Anruf geht ... wir haben es vor langer Zeit auf 0 gesetzt. Das ist der Grund warum es hier funktioniert und nicht in deiner Installation. –

+0

@ CarlosE.Ferro Thank Sie für die Bestätigung (und ich kann bestätigen, dass "LOCALE_NEUTRAL == 0" hier). Haben Sie auch mit dem "NumberFormat"? – mkluwe

+0

Nein, wir verwenden Excel-Automatisierung nur für grundlegende Berichterstattung, und wir legen selten das Zellenformat, mit Ausnahme einiger Bereiche, in denen wir alte vordefinierte Tabellenformate anwenden (zum Beispiel XlClassic) Aber für bestimmte Dezimalstellen bauen wir eine Zeichenkette mit Nullen und Excel.International (XlDecimalSeparator) und für Datumsangaben bauen wir Strings wie 'mm-yyyy' und setze sie mit der numberFormat-Eigenschaft –

Verwandte Themen