I've got an Excel spreadsheet, with a Macro, that inserts a conditional formatting, like this:
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=UND($A3=""" & lastName & """; $B3=""" & firstName & """)"
As you can see, I've used the German formula for "AND" (i.e. "UND"), and obviously, this code doesn't work as soon as I use it on a French or English version of Excel. Usually formulas are localized automatically, but how can I insert a formula during run-time that will work on ALL versions?
Thanks everyone! I found the post very useful.
My solution is a combination of others, I add it in case somebody finds it useful.
Hope this helps!
Please refer to the link for more explanation: https://bettersolutions.com/csharp/excel-interop/locale-culture.htm
Store (a trivial version of) the formula in a (hidden) cell in your workbook.
Then when you open the workbook that formula will be translated automatically by excel for the user.
Now you just have to dissect this formula in your script (find the opening bracket "(" and take the past left of that:
Use something like:
strLocalizedFormula = Mid(strYourFormula, 2, InStr(1, strYourFormula, "(") - 2)
where
strYourFormula
will be a copy from the formula from your worksheet.I hope this works as I only use an English environment.
Also from reading this: http://vantedbits.blogspot.nl/2010/10/excel-vba-tip-translate-formulas.html I am thinking you should (only) be able to use the english version of a cell formula from VBA.
Ok, thanks for helping me with this, you've helped me crack this one.
It is indeed not possible to just use English. One can use English when operating on a formula, eg. by setting coding
Range("A1").formula="AND(TRUE)"
, but this does not work withFormatConditions
.My solution is a function that writes a formula temporarily to a cell, reads it through the
FormulaLocal
property, and returns the localized formula, like so:The returned formula can be used on
FormatConditions
, which will be re-localized or un-localized when the document is later opened on a different-language version of Excel.Maybe try this (untested as I only have English version insatlled)
Write your international version of the formula to an out of the way cell using
Range.Formula
. Then read it back fromRange.FormulaLocal
, and write that string to theFormatConditions
I just found a very elegant solution to the problem in a German Excel forum. This doesn't write to a dummy cell but rather uses a temporary named range. I used the original idea (credit to bst) to write a translating function for both directions.
Convert localized formula to English formula:
Convert English formula to localized formula:
This is very handy if you need to deal with formulas in conditional formatting, since these formulas are always stored as localized formulas (but you could need their generic version, e.g. to use
Application.Evaluate(genericFormula)
).