如果语言环境已更改,则UDF不适用于单元格引用

我写了一个C#COM(自动化)加载项,我正在使用运行在Windows 7上的Excel 2010 x64进行testing。它定义了许多用户定义的公式。 我们来看一个具有两个string作为参数的UDF示例,首先用文字调用,然后用单元格引用:

=MyFunction("A","B") =MyFunction(A1,B1) 

如果区域设置=英文,那么这两个工作。

如果将区域设置设置为法语并重新打开工作簿,则Excel将公式更改为:

 =MyFunction("A";"B") =MyFunction(A1;B1) 

第一个(文字)仍然有效。 第二个现在不起作用=它只是返回#VALUE! 而且我的pipe理的UDF代码甚至没有被调用(使用Visual Studio 2010进行debugging)。

为什么是这样?

我不知道为什么这个行为根据地区的不同而不同,但无论如何:

UDF签名是这样的:

 public object MyFunction(string arg1, string arg2) { 

然后我只是在代码中使用arg1和arg2。 正如我所说,这与英文语言环境中的单元格引用一起工作。 在法国语言环境中,如果我把它重构成如下所示的样子:

 public object MyFunction(object ref1, object ref2) { string arg1 = (ref1 is Range) ? (string)((Range)ref1).Value : (string)ref1; string arg2 = (ref2 is Range) ? (string)((Range)ref2).Value : (string)ref2; 

这将需要相当多的改变…任何人都知道为什么英文设置允许types转换到达UDF之前发生?

您需要明确设置en-US文化,以便UDF在不同的语言环境中正确工作,例如

 System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

在加载项开始的某个地方