[英]Excel Automation - Filter COM events using FindConnectionPoint
[英]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
会导致属性Formula
和FormulaLocal
行为开始不同。 在我的德语本地化Excel安装中,两个调用
sheet.getObject( "Range", "A3" ).set( "FormulaLocal", "=SUMME(A1:A2)" );
sheet.getObject( "Range", "B3" ).set( "Formula", "=SUM(A1:A2)" );
现在做同样的事情。
目前,这不是我的问题的真正解决方案,因为我通常期望没有记录的事情在我背后默默地打破 。 证明: NumberFormat
和NumberFormatLocal
仍然做同样的事情(!),这意味着我需要使用两种属性的本地化日期格式代码(例如ISO 8601的"JJJJ-MM-TT"
)。
NumberFormat
解决方法
要构建格式字符串:使用Application.International属性 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.