2017-01-13 5 views
1

저는 주로 IDispatch::Invoke을 사용하는 COM 인터페이스를 사용하여 기본 Excel 자동화를 사용하여 놀았습니다.Excel 자동화에서 지역화되지 않은 수식 사용

내 테스트에는 새로 만든 Excel 문서에서 수식을 추가하는 것이 포함되었습니다. 고안 랩퍼 라이브러리를 사용하면, 그것은 다음과 같습니다

sheet.getObject("Range", "A1").set("Value", 23); 
sheet.getObject("Range", "A2").set("Value", 42); 
sheet.getObject("Range", "A3").set("Formula", "=SUMME(A1:A2)"); // WTF? 

공지 사항 : 내가 대신 예상대로 식별자 SUM의 여기 (독일어) 지역화 식 이름 SUMME을 사용하고 있습니다. Excel에서 매크로 레코더를 사용하여 동일한 작업을 수행 할 때 생성 된 VBA 코드는 SUM입니다. 내 C++ 코드에서 SUM을 사용하면 Excel에서 #NAME? 오류가 발생합니다.

반환 또는 A1 스타일 참조 사용자의 언어로 를 사용하여 대상의 수식을 설정 : 마이크로 소프트의 documentation for the Range.FormulaLocal Property

은 다음을 말한다.

(강조 표시)

그래서 FormulaLocal 대신 Formula을 사용하여 이러한 현지화 문제를 해결할 수 있기를 기대했지만 사실은 그렇지 않습니다.

지역화되지 않은 수식을 사용할 수있는 방법이 있습니까? 나는 숨겨진 곳이 있다고 생각합니다. 내가 발견 한 내용을 문서로 답변을 추가

+1

네, 저에게 좋습니다. 저는 스페인어로 Excel을 사용하고 있으며 속성 수식에 영어 이름이 할당되어 작동합니다.숨겨진 설정은 없지만 이전 Excel 버전에서는 작동하지 않는다는 것을 기억합니다 (이전의 12 세 이전, 꽤 오래된 버전). –

+0

@ CarlosE.Ferro "12"는 Office 12라고도하는 Office 2007을 의미합니까? Excel 2010을 사용하고 있습니다. – mkluwe

+0

예, 꽤 오래되었다고 말씀 드렸습니다. Excel 2007에서 작동하므로 왜 작동하지 않는지도 모르겠습니다. 죄송합니다 :-( –

답변

0

:

해결 Formula

Formula 속성을 설정하려면, ultimatively

로 구현 된 IDispatch::Invoke를 호출, 거기에
object->Invoke(
    dispid, 
    IID_NULL, 
    LOCALE_USER_DEFAULT, // <-- "locale context" 
    DISPATCH_PROPERTYPUT, 
    &dispparams, 
    NULL, 
    &excepinfo, 
    &argerr)); 

LOCALE_USER_DEFAULT에서 LOCALE_NEUTRAL으로 변경하면 속성 FormulaFormulaLocal이 다르게 동작하기 시작합니다. 내 독일어 현지화 엑셀 설치에서 두 통화

sheet.getObject("Range", "A3").set("FormulaLocal", "=SUMME(A1:A2)"); 
sheet.getObject("Range", "B3").set("Formula", "=SUM(A1:A2)"); 

지금 같은 일을한다.

현재 내 문제의 진정한 해결책은 아닙니다. 일반적으로 내 허리 뒤로 조용히 깨지도록 문서화 된대로 작동하지 않을 것으로 예상하기 때문입니다.. 증명 : NumberFormatNumberFormatLocal은 여전히 ​​똑같습니다 (!). 두 속성을 모두 사용하여 지역화 된 날짜 형식 코드 (예 : "JJJJ-MM-TT", ISO 8601)를 사용해야합니다. NumberFormat

에 대한

해결 방법은 형식 문자열을 구축하려면 다음 Application.International Property를 사용합니다.

+1

아, 그 전화에 들어간 LOCALE_ID (LCID)를 완전히 잊어 버렸습니다 ... 우리는 오래전에 그것을 0으로 만들었습니다. 그게 당신이 설치 한 곳이 아니라 여기에서 일한 이유입니다. –

+0

@ CarlosE.Ferro (여기서 나는'LOCALE_NEUTRAL == 0'을 확인할 수 있습니다.)'NumberFormat'도 다루었습니까? – mkluwe

+0

아니요, 우리는 기본적인보고를 위해서만 Excel 자동화를 사용하고 거의 셀 형식을 설정하지 않습니다. 예를 들어, XlClassic과 같은 오래된 사전 정의 된 테이블 형식을 적용하는 일부 범위를 제외하고 그러나 특정 소수 자릿수에서는 0을 사용하여 문자열을 만들고 excel.International (XlDecimalSeparator) 및 날짜에 대해 'mm-yyyy'를 만들고 numberFormat 속성으로 설정합니다. –