Excel Macro, inserting internationally valid formula during run-time

前端 未结 6 686
无人共我
无人共我 2020-12-01 15:59

I\'ve got an Excel spreadsheet, with a Macro, that inserts a conditional formatting, like this:

Selection.FormatConditions.Add Type:=xlExpression, Formula1:=         


        
相关标签:
6条回答
  • 2020-12-01 16:26

    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.

    0 讨论(0)
  • 2020-12-01 16:28

    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)).

    0 讨论(0)
  • 2020-12-01 16:40

    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!

    0 讨论(0)
  • 2020-12-01 16:50

    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.

    0 讨论(0)
  • 2020-12-01 16:51

    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; 
    
    0 讨论(0)
  • 2020-12-01 16:52

    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

    0 讨论(0)
提交回复
热议问题