I can't seem to figure out how to concatenate an asterisk into a vba formula or a string for that matter.
it just always results in an error.
You need to do the concatenation outside the sumproduct formula. This should work:
TryOutputModelTab.Range("F2").Formula = "=SUMPRODUCT(D$2:D$" & LastUsedRowOnOutputModelTabA & ") & ""*"""
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?
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 with FormatConditions.
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:
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
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.
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:
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
Convert English formula to localized formula:
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
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)).
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.
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 from Range.FormulaLocal, and write that string to the FormatConditions
I know this thread is ages old, and someone may have found an elegant solution, but I just had the same problem where I needed to apply conditional formatting without modifying the sheet, creating temporary cell contents or named ranges. All users use English language versions of Excel, so the functions used in the formulas are the same, but the regional settings vary by location, and therefore also the parameter separater; In Norwegian, it's ";" instead of ",", much like the rest of Europe, I guess.
For example, I needed to automatically create conditional formatting, using Excel formula for the following criterion:
.FormatConditions.Add xlExpression, Formula1:="=AND(ISNUMBER(B" & I & "),B" & I & ">=" & Ul1 & ")"
Where "Ul1" is a value defined in a previous step, and it's not important for the solution.
However, I needed to be able to run this on computers with both Norwegian and English settings
I and found a very short and simple solution from Andrew Pulsom here: https://www.mrexcel.com/board/threads/french-vba-vs-english-vba.729570/. He just made the parameter separator into a variable:
If Application.International(xlDecimalSeparator) = "," Then
Sep = ";"
Else
Sep = ","
End If
Cl1 = "=AND(ISNUMBER(B" & I & ")" & Sep & "B" & I & "<" & Ul1 & ")"
Worked like a charm for me :)
I know that this only solves part of the problem, but I assume that this could apply to many international companies which use English Office installations with local regional settings.
Thanks everyone! I found the post very useful.
My solution is a combination of others, I add it in case somebody finds it useful.
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 & ")"
Hope this helps!
Please refer to the link for more explanation: 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;
I have a nested loop that generates a string something like this:
worksheet1!E3;worksheet1!E33;worksheet1!E63;worksheet2!E3;worksheet2!E33;worksheet2!E63;
I need to pass this string to a specified cell as a part of a formula. The final formula should be like: =SUM(<string>).
I get:
Run-time error '1004' Application-defined or object-defined error
My code looks something like this:
Dim query as String
query = "worksheet1!E13;worksheet1!E43;"
Worksheets("example").Activate
Range("A1").Formula = "=SUM(" + query + ")"
The error occurs on the last line of the sample code.
Hope this help you. it worked for me. Just using Comma instead of Semicolon
Dim query as String
query = "worksheet1!E13,worksheet1!E43"
Worksheets("example").Activate
Range("A1").Formula = "=SUM(" + query + ")"
So, As example, if a user with French regional setting, which have the list separator ; saves a file, then a user with US regional settings that had a list separator , opens the same file, Excel will adjust the French list separators in the formulas automatically.
When writing VBA, though, you will need to use the US-English conventions for the list separator, which is the comma. or you can use FormulaLocal instead.
[EDIT]:
Instead, you can use directly the local Formula, using FormulaLocal
As example ( SUM in Frensh formula is SOMME )
Range("A1").FormulaLocal = "=Somme(A2;A5)"
I tried to use .FormulaArray to get the smallest value in a column, but unfortunatly it does not work.
This is my code for the formula:
Worksheets("Test Sim").Range("B9").FormulaArray = "{=MIN(IF(B2:B8>0;B2:B8;""""))}"
If i write it without the curly braces runtime error 1004 appears, if i write it with them my table looks like this:
As you can see in B9 it will not show the number 9. what do i have to change that this will work?
You don't need the {} and when entering formulas via code you need to use the "US-style" comma separator.
Worksheets("Test Sim").Range("B9").FormulaArray = "=MIN(IF(B2:B8>0,B2:B8,""""))"
I'm trying to write in a cell this string "=>".
Macro gives "error 1004".
Macro works correctly if I write "=>x" where x stands for another character.
What am I doing wrong?
Thanks
You can format it as text before entering the value:
With ActiveSheet.Range("A1")
.NumberFormat = "#"
.Value = "=>"
End With
The issue here is that Excel understands => as the beginning of a formula because it starts with an equal sign, and you get the error because the formula is incomplete.
If you want to force Excel to understand it as text add a single quote as first character:
Range("A1").Value = "'=>"
Excel will not show the quote ' but it will recognize the cell content as text instead of a formula.