2017-01-13 4 views
1

私は、COMインターフェイスを使用して基本的なExcelオートメーションを使っていました。主にIDispatch::Invokeを利用しています。Excelオートメーションでローカライズされていない式を使用する

私のテストでは、新しく作成されたExcelドキュメントに式を追加しました。考案されたラッパーライブラリを使用すると、それは次のようになります。

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

お知らせ:私の代わりに予想通りの識別子SUMの、ここでは(ドイツ語)ローカライズされた式の名前SUMMEを使用しています。 Excelでマクロレコーダーと同じ処理を行う場合、生成されるVBAコードにはSUMが含まれています。私のC++コードでSUMを使用すると、Excelに#NAME?というエラーが発生します。

Microsoftのdocumentation for the Range.FormulaLocal Propertyは、次の言葉:

返すか、ユーザーの言語でA1スタイルの参照 を使用して、オブジェクトの数式を設定します。

(強調は私によってなされた)。

FormulaLocalの代わりにFormulaを使用すると、これらのローカライズの苦境を乗り越えることができましたが、明らかにこれは当てはまりません。

ローカライズされていない式を使用する方法はありますか?私はいくつかのよく隠された設定があると思います。私が見つけたものを文書化するために答えを追加

+1

はい、それは私のために働く。私はスペイン語でExcelを使用しており、プロパティの式には英語の名前が割り当てられています。隠された設定はありませんが、それは以前のExcelバージョン(12より前、かなり古いもの)で動作しなかったことを覚えています。 –

+0

@ CarlosE.Ferro "12"はOffice 12をOffice 2007ともいうのですか?私はここでExcel 2010を使用しています。 – mkluwe

+0

はい、私はそれはかなり古いと言いました。 Excel 2007は機能しているので、なぜそれがあなたのもので動作しないのかわかりません。申し訳ありません:-( –

答えて

0

回避策Formula

ためFormulaプロパティを設定するには、ultimatively

として実装されていました IDispatch::Invokeへの呼び出し、あります
object->Invoke(
    dispid, 
    IID_NULL, 
    LOCALE_USER_DEFAULT, // <-- "locale context" 
    DISPATCH_PROPERTYPUT, 
    &dispparams, 
    NULL, 
    &excepinfo, 
    &argerr)); 

LOCALE_USER_DEFAULTからLOCALE_NEUTRALに変更すると、 FormulaFormulaLocalの動作が異なるようになります。私のドイツのローカライズされたExcelのインストールでの二つの呼び出し

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

は今、同じことを行います。

現在のところ、これは私の問題の本当の解決策ではありません。通常、私の背中の裏側で静かに壊れてしまったことが文書化されていると思います。証明:NumberFormatNumberFormatLocalは同じことを行う(!)ので、両方のプロパティでローカライズされた日付フォーマットコード(ISO8601の場合は"JJJJ-MM-TT"など)を使用する必要があります。 NumberFormat

ため

回避策は、フォーマット文字列を構築するには、次のApplication.International Propertyを使用してください。

+1

ああ、私はLOCALE_ID(LCID)の呼び出しに忘れてしまいました...私たちはずっと前にそれを0にしました。それがあなたのインストールではなくここで働いた理由です。 –

+0

@ CarlosE.Ferroあなたは確認のために(ここでは 'LOCALE_NEUTRAL == 0 'を確認できます)' NumberFormat'も扱っていますか? – mkluwe

+0

いいえ、Excelオートメーションは基本的なレポート作成にのみ使用しています。 (XlClassicなど)を適用するいくつかの範囲を除きます。 しかし、具体的な小数点については、ゼロを使用して文字列を作成し、Excelを使用します.International(XlDecimalSeparator)および日付については、 'mm-yyyy'を指定し、numberFormatプロパティで設定します –

関連する問題