25

我有一个带有宏的 Excel 电子表格,它插入条件格式,如下所示:

Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=UND($A3=""" & lastName & """; $B3=""" & firstName & """)"

如您所见,我使用了德语公式来表示“AND”(即“UND”),显然,一旦我在法语或英语版本的 Excel 上使用此代码,它就无法正常工作。通常公式会自动本地化,但是如何在运行时插入适用于所有版本的公式?

4

7 回答 7

16

好的,谢谢你帮我解决这个问题,你帮我破解了这个。

确实不可能只使用英语。对公式进行操作时可以使用英语,例如。通过设置编码Range("A1").formula="AND(TRUE)",但这不适用于FormatConditions.

我的解决方案是一个将公式临时写入单元格的函数,通过FormulaLocal属性读取它,然后返回本地化的公式,如下所示:

Function GetLocalizedFormula(formula As String)
' returns the English formula from the parameter in the local format
  Dim temporary As String
  temporary = Range("A1").formula
  Range("A1").formula = formula
  Dim result As String
  result = Range("A1").FormulaLocal
  Range("A1").formula = temporary
  GetLocalizedFormula = result
End Function

返回的公式可用于FormatConditions,当文档稍后在不同语言版本的 Excel 上打开时,将重新本地化或取消本地化。

于 2012-11-06T15:46:33.767 回答
10

我刚刚在德语 Excel 论坛中找到了一个非常优雅的解决方案。这不会写入虚拟单元格,而是使用临时命名的 range。我使用最初的想法(归功于 bst)为两个方向编写了一个翻译函数。

将本地化公式转换为英文公式:

Public Function TranslateFormula_LocalToGeneric(ByVal iFormula As String) As String
    Names.Add "temporaryFormula", RefersToLocal:=iFormula
    TranslateFormula_LocalToGeneric = Names("temporaryFormula").RefersTo
    Names("temporaryFormula").Delete
End Function


将英文公式转换为本地化公式:

Public Function TranslateFormula_GenericToLocal(ByVal iFormula As String) As String
    Names.Add "temporaryFormula", RefersTo:=iFormula
    TranslateFormula_GenericToLocal = Names("temporaryFormula").RefersToLocal
    Names("temporaryFormula").Delete
End Function

如果您需要处理条件格式的公式,这将非常方便,因为这些公式始终存储为本地化公式(但您可能需要它们的通用版本,例如使用Application.Evaluate(genericFormula))。

于 2015-10-13T18:45:48.280 回答
5

将公式存储(简单版本)在工作簿的(隐藏)单元格中。

然后,当您打开工作簿时,该公式将由 Excel 自动为用户翻译。

现在你只需要在你的脚本中剖析这个公式(找到左括号“(”并将过去的左边取走:

使用类似的东西:

strLocalizedFormula = Mid(strYourFormula, 2, InStr(1, strYourFormula, "(") - 2)

strYourFormula工作表中公式的副本在哪里。

我希望这可行,因为我只使用英语环境。

同样通过阅读:http: //vantedbits.blogspot.nl/2010/10/excel-vba-tip-translate-formulas.html 我认为您应该(仅)能够使用英文版的单元格公式VBA。

于 2012-11-06T09:32:10.747 回答
2

也许试试这个(未经测试,因为我只有英文版)

使用 .将您的国际版本的公式写入一个偏僻的单元格Range.Formula。然后从 读取它Range.FormulaLocal,并将该字符串写入FormatConditions

于 2012-11-06T10:42:42.490 回答
0

我知道这个线程已经很久了,有人可能已经找到了一个优雅的解决方案,但我只是遇到了同样的问题,我需要应用条件格式而不修改工作表、创建临时单元格内容或命名范围。所有用户使用的都是英文版的Excel,所以公式中用到的函数是一样的,只是地域设置不同,所以参数分隔符也不同;在挪威语中,它是“;” 而不是“,”,就像欧洲其他地方一样,我猜。

例如,我需要自动创建条件格式,使用 Excel 公式作为以下标准:

.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & "),B" & I & ">=" & Ul1 & ")"

其中“Ul1”是在上一步中定义的值,它对解决方案并不重要。

但是,我需要能够在具有挪威语和英语设置的计算机上运行它

我在这里找到了 Andrew Pulsom 的一个非常简短的解决方案:https ://www.mrexcel.com/board/threads/french-vba-vs-english-vba.729570/ 。他只是把参数分隔符变成了一个变量:

If Application.International(xlDecimalSeparator) = "," Then
    Sep = ";"
Else
    Sep = ","
End If

Cl1 = "=AND(ISNUMBER(B" & I & ")" & Sep & "B" & I & "<" & Ul1 & ")"

对我来说就像一个魅力:)

我知道这只能解决部分问题,但我认为这可能适用于许多使用具有本地区域设置的英语 Office 安装的国际公司。

于 2021-02-03T13:28:48.740 回答
-1

谢谢大家!我发现这篇文章非常有用。

我的解决方案是其他人的组合,我添加它以防有人发现它有用。

Dim tempform As String
Dim strlocalform1 As String
Dim strlocalform2 As String

' Get formula stored in WorksheetA Cell O1 =IFERROR(a,b)
tempform = Worksheets("Sheet").Range("O1").Formula

' Extract from the formula IFERROR statement in local language.
strlocalform1 = Mid(tempform, 2, InStr(1, tempform, "(") - 1)

' Extract from the formula separator , (comma) in local settings.
strlocalform2 = Mid(tempform, InStr(1, tempform, "a") + 1, 1)

' Add formula in local language to desired field.
pvt.CalculatedFields.Add Name:="NewField", Formula:="=" & strlocalform1 & "FORMULA" & strlocalform2 & ")"

希望这可以帮助!

于 2016-08-23T15:47:01.327 回答
-1

更多解释请参考链接:https ://bettersolutions.com/csharp/excel-interop/locale-culture.htm

CultureInfo baseCulture = System.Threading.Thread.CurrentThread.CurrentCulture; 
Thread.CurrentThread.CurrentCulture = new CultureInfo(xlapp.LanguageSettings.LanguageID(Office.MsoAppLanguageID.msoLanguageIDUI)); 
// do something 
System.Threading.Thread.CurrentThread.CurrentCulture = baseCulture; 
于 2018-03-12T10:55:34.390 回答