programing

Excel 매크로, 런타임에 국제적으로 유효한 수식을 삽입합니다.

showcode 2023. 4. 25. 23:47
반응형

Excel 매크로, 런타임에 국제적으로 유효한 수식을 삽입합니다.

매크로가 포함된 Excel 스프레드시트를 사용하여 다음과 같은 조건부 형식을 삽입합니다.

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

보시다시피 독일어 수식을 "AND"(즉, "UND")에 사용했는데, 프랑스어 또는 영어 버전의 Excel에서 사용하자마자 이 코드가 작동하지 않습니다.일반적으로 수식은 자동으로 현지화되지만 런타임에 모든 버전에서 작동하는 수식을 삽입하려면 어떻게 해야 합니까?

좋아요, 도와줘서 고마워요. 이걸 풀 수 있게 도와주셨어요.

영어를 그냥 사용하는 것은 정말 불가능합니다.를 들어, 수식을 조작할 때 영어를 사용할 수 있습니다.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에서 열리면 다시 현지화되거나 현지화되지 않습니다.

저는 방금 독일 엑셀 포럼에서 그 문제에 대한 아주 우아한 해결책을 찾았습니다.이것은 더미 셀에 쓰지 않고 임시 명명 범위를 사용합니다.원본 아이디어(credit to 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

이 수식은 항상 현지화된 수식으로 저장되므로 조건부 형식으로 수식을 처리해야 하는 경우 매우 유용합니다(예: 사용하려면 일반 버전이 필요할 수 있음).Application.Evaluate(genericFormula)을 클릭합니다.

공식을 워크북의 (숨긴) 셀에 저장합니다(의 일반 버전).

그런 다음 워크북을 열면 해당 수식이 사용자에 대해 Excel에 의해 자동으로 번역됩니다.

이제 스크립트에서 이 공식만 해부하면 됩니다(첫 번째 괄호("")를 찾아서 왼쪽을 참고하십시오).

다음과 같이 사용합니다.

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

여기서, where where에 wherestrYourFormula워크시트의 공식에서 복사됩니다.

저는 영어 환경만 사용하므로 이것이 작동하기를 바랍니다.

또한 http://vantedbits.blogspot.nl/2010/10/excel-vba-tip-translate-formulas.html을 읽고 VBA의 세포 공식 영문 버전을 사용할 수 있어야 한다고 생각합니다.

이 기능을 사용해 보십시오(영어 버전만 설치되어 있으므로 테스트되지 않음).

국제 버전의 공식은 다음과 같은 방법으로 셀에 기록합니다.Range.Formula그럼 다시 읽어주세요Range.FormulaLocal, 그리고 그 문자열을 에 씁니다.FormatConditions

이 스레드가 오래되었고 누군가 우아한 해결책을 찾아냈을 수도 있지만, 시트를 수정하지 않고 조건 포맷을 적용해야 하는 것과 같은 문제가 있었습니다. 임시 셀 내용이나 명명된 범위를 만들어야 했습니다.모든 사용자가 영어 버전의 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 & ")"

제게는 마법처럼 작용했습니다:)

이것이 문제의 일부만 해결한다는 것을 알지만, 저는 이것이 지역별 설정으로 English Office 설치를 사용하는 많은 국제 회사들에게 적용될 수 있다고 생각합니다.

감사합니다 여러분!저는 그 게시물이 매우 유용하다고 생각했습니다.

제 솔루션은 다른 솔루션들을 조합한 것입니다. 누군가 유용하다고 생각할 때를 대비해서 덧붙입니다.

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 & ")"

도움이 되었으면 좋겠네요!

자세한 내용은 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; 

언급URL : https://stackoverflow.com/questions/13247771/excel-macro-inserting-internationally-valid-formula-during-run-time 입니다.

반응형