Excel宏,在运行时插入国际有效的公式

时间:2012-11-06 09:10:42

标签: excel vba excel-vba excel-formula internationalization

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

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

正如您所看到的,我使用了德语公式“AND”(即“UND”),显然,这个代码在法语或英语版本的Excel上使用时不会立即生效。 通常公式是自动本地化的,但是如何在运行时插入一个适用于所有版本的公式?

7 个答案:

答案 0 :(得分:14)

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

确实不可能只使用英语。在操作公式时可以使用英语,例如。通过设置编码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上打开文档时,该公式将被重新本地化或取消本地化。

答案 1 :(得分:5)

我刚刚在德语Excel论坛中找到了一个非常优雅的solution to the problem。这不会写入虚拟单元格,而是使用临时命名范围。我用原来的想法(信用到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

如果您需要处理条件格式中的公式,这非常方便,因为这些公式始终存储为本地化公式(但您可能需要其通用版本,例如使用{{1} })。

答案 2 :(得分:4)

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

然后,当您打开工作簿时,excel会自动为用户翻译公式。

现在你只需要在你的脚本中剖析这个公式(找到开头括号"("并从左边开始:

使用类似:

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

其中strYourFormula将是工作表中公式的副本。

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

另见阅读: http://vantedbits.blogspot.nl/2010/10/excel-vba-tip-translate-formulas.html 我想你应该(只)能够使用VBA的英文版单元格公式。

答案 3 :(得分:2)

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

使用Range.Formula将您的国际版公式编写到一个单元格中。然后从Range.FormulaLocal读回来,并将该字符串写入FormatConditions

答案 4 :(得分:0)

请参阅相关链接以获取更多解释: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; 

答案 5 :(得分: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 安装的国际公司。

答案 6 :(得分:-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 & ")"

希望这有帮助!