繁体   English   中英

在Excel自动化中使用非本地化公式

[英]Using non-localized formulae in Excel automation

我一直在使用COM接口进行基本的Excel自动化,主要使用IDispatch::Invoke

我的测试涉及在新创建的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?

注意:我在这里使用(德语)本地化公式名称SUMME ,而不是预期的标识符SUM 在Excel中使用宏录制器执行相同操作时,生成的VBA代码包含SUM 在我的C ++代码中使用SUM ,我最终得到一个#NAME? Excel中的错误。

Microsoft的Range.FormulaLocal属性文档说明如下:

使用用户语言的 A1样式引用返回或设置对象的公式。

(重点是我)。

所以我希望使用Formula而不是FormulaLocal我可以解决这些本地化问题,但显然事实并非如此。

有什么办法可以使用非本地化公式吗? 我猜有一些隐藏的设置。

添加答案来记录我发现的内容:

Formula解决方法

要设置Formula属性,最后会调用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仍然做同样的事情(!),这意味着我需要使用两种属性的本地化日期格式代码(例如ISO 8601的"JJJJ-MM-TT" )。

NumberFormat解决方法

要构建格式字符串:使用Application.International属性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM