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

Posted

技术标签:

【中文标题】如果语言环境更改,UDF 不适用于单元格引用【英文标题】:UDF does not work with cell references if locale changed 【发布时间】:2015-05-01 15:03:57 【问题描述】:

我编写了一个 C# COM(自动化)插件,我正在使用 Excel 2010 x64 进行测试,在 Windows 7 上运行。它定义了许多用户定义的公式。让我们以一个有两个字符串作为参数的 UDF 为例,首先使用文字调用,然后使用单元格引用:

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

如果区域设置 = 英语,那么这两个都可以。

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

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

第一个(带有文字)仍然有效。第二个现在 工作 = 它只返回 #VALUE! 并且我的托管 UDF 代码甚至没有被调用(使用 Visual Studio 2010 进行调试)。

这是为什么?

【问题讨论】:

区域系统设置暂且不说,区域机器上是xlA1还是xlR1C1公式参考样式? 它是xlA1 参考风格。 但是如果我切换到 R1C1 样式,它的行为是一样的。 【参考方案1】:

我不知道为什么这种行为会因地区设置而异,但无论如何:

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;

这将需要进行大量更改...有人知道为什么英语设置允许类型转换在到达 UDF 之前发生吗?

【讨论】:

【参考方案2】:

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

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

加载项的开头某处

【讨论】:

以上是关于如果语言环境更改,UDF 不适用于单元格引用的主要内容,如果未能解决你的问题,请参考以下文章

Excel公式更改另一个单元格的值?

引用 UDF 中的特定单元格

VBA UDF 多单元格引用

用于识别 Excel 单元格格式模式的 UDF(用户定义函数)

UDF:处理范围和可变数量的参数

如何将不连续的单元格传递给 Excel UDF