我有一个带有宏的Excel电子表格,它插入条件格式,如下所示:
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=UND($A3=""" & lastName & """; $B3=""" & firstName & """)"
正如您所看到的,我使用了德语公式“AND”(即“UND”),显然,这个代码在法语或英语版本的Excel上使用时不会立即生效。 通常公式是自动本地化的,但是如何在运行时插入一个适用于所有版本的公式?
答案 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 & ")"
希望这有帮助!