|
백호 님이 쓰신 글 :
: 지난 번 슬님의 답변은 잘 보았습니다.
:
: 많은 도움이 되었지만 Excel Component에 대한 도움말이 없다보니
:
: 각 함수들의 사용법이나 파라미터들의 값을 알 수가 없어서
:
: 고생을 하고 있습니다.
:
: 혹시 관련된 메뉴얼이나 예제 아니면 함수들의 사용법과
:
: 역할에 대해서 아시는 것이 있다면 답변 좀 부탁드리겠습니다.
:
: 아무리 찾아봐도 관련자료가 너무 없어 이렇게 다시 글을 올립니다.
:
: 그럼 부탁드리겠습니다.
우선 하려고 하시는 작업이 무엇인지 순서대로 알려주시면
차근차근 일러드리겠습니다^^;
우선... 저도 Excel Component에 관련된 함수들에 대해 많이 알지 못합니다..
알수없는 파라미터값들이 워낙 많아서요^^;;;
어디까지 하셨는지 모르겠으나..
Excel Application ,
Excel Workbooks,
Excel Sheet
이 3가지를 적절히 활용하시면 엑셀에서 하는 모든 작업을 다루실수 있습니다.
순서대로 생각하시면 됩니다. 실제 엑셀 작업하시는것처럼요..
우리가 엑셀 작업할때에
가장 먼저 하는것은
엑셀을 실행시키는 것입니다.^^;; 너무 당연한가요?
그다음 새 파일을 만들어서 작업하거나,
기존의 작업된 파일을 열어서 작업을 하겠죠...
위의 두 과정은 다음과 같습니다.
ExcelWb->ConnectTo(ExcelApp->Workbooks->Add((TVariant) Excel_xp::xlWBATWorksheet , TDefLCID()));
// 새로운 파일을 추가 해서 ExcelApp를 실행한다음 Wb에서 해당 워크북에 연결합니다.
xlWBATWorksheet 새로운 워크시트의 템플릿을 지정해주시면 됩니다. 기본 템플릿입니다.
TDefLCID() 는 현재의 작업을 반환해주는 녀석정도로 생각하시면 될것 같습니다.
이제 새로운 파일을 열었군요..
자 그다음 엑셀에서 무엇을 하시나요?
Ws 워크시트를 선택합니다.
ExcelWs->ConnectTo(ExcelWb->Worksheets->get_Item((TVariant) SheetIndex));
다음과 같이 말이죠...
SheetIndex는 Ws 번호 입니다.
1번부터 시작해서 왼쪽부터 순서대로 입니다.
헌데 저는 워크시트의 "이름"으로 선택을 하고 싶네요...
이름으로 Ws 를 선택하는 방법 아직 모릅니다^^;;
그래서 약간 편법같은 방법을 사용하고 있습니다.
int nCount=ExcelWb->Worksheets->get_Count();
for( int i=1; i <= nCount; i++){
ExcelWs->ConnectTo(ExcelWb->Worksheets->get_Item((TVariant) i));
WideString SheetName=ExcelWs->get_Name();
}
위의 결과는? 짐작 하시겠지만...
Sheet 들의 이름을(목록을) 모두 불러옵니다~
이걸가지고 map이나 dynamic array 같은곳 어디든지 저장하신다면
이름으로 가져올수도 있겠죠...
엑셀을 사용할때의 작업은 모두 "범위(Range)" 중심입니다.
하나의 셀을 선택하더라도
예를 들어 A1을 선택 하더라도 A1:A1과 같은 범위로 표현할수 있습니다.
이곳에 값을 넣을 수 도 있겠죠...
값을 넣을때에는 하나의 셀에 적용됩니다.
ExcelWs->Cells->set_Item((TVariant) Y ,(TVariant) X ,Value);
위와 같죠...
set_item은 Y가 먼저입니다.
Value 는 (TVariant) 타입이구요...
Y는 정수형(1,2,3,4,,,,,)
X는 정수형 (1,2,3,4,,,,) 또는 알파벳(A,B,C,D,,,,,) 을 사용하실수 있습니다.
set_item 을 제외한 거의 모든 작업에 적용되는 함수들은
get_Range((TVariant)"A1",(TVariant)"C3") 같이 쓰입니다.
get_Range는 ExcelRange* 형을 리턴합니다.
예를 들어
get_Range((TVariant)"A1",(TVariant)"A2")->Borders->set_LineStyle((TVariant)xlLineDouble);
처럼 범위에 해당하는 셀에 Border 을 줄수 있습니다.
제가 get_Range를 사용할때 처음 닥쳤던 문제는... X,Y를 모두 숫자로 처리 해야한다는것입니다.
그래야 for나 While 반복문을 사용한 제어가 쉬워지고,, 모든 데이터의 위치 정보가 숫자로 처리된다는거죠...
그래서 저는 다음과같이 사용합니다.
ExcelWs->get_Range(GetCellPos(X1,Y1), GetCellPos(X2,Y2))
GetCellPos(int X,int Y) 는
해당하는 셀의 좌표를 반환합니다.
재귀함수로 구현했습니다^^; 이유는 한번 생각해보시고..
필요하시면 직접 구현해보세요...
get_Range() 를 잘 사용하신다면... 엑셀의 모든 작업이 가능합니다...
물론 함수명을 찾기도 참 어렵습니다.
함수에 들어가는 값은 찾을길이 없어 보이죠...
예를들어 위의 범위로 라인을 그리는 함수에서
xlLineDouble 는 어떤 값을 가지는지 우리는 알지 못합니다.
하지만? 알수 있습니다^^;
xlLineDouble는 제가 직접 define 한 상수 입니다.
#define xlLineDouble -4119
와 같은 값을 가지고 있지요...
Excel에서는 쉬운 엑셀 작업을위해
"매크로" 라는 기능을 제공합니다.
이 "매크로" 는 비주얼베이직 스크립트 형태로 작성되죠..
비주얼베이직은 프로그래밍 언어입니다. 물론.. 디버깅 모드의 컴파일에서는 인터프리터 모드로 작동을 하긴 하지만요...
직접 엑셀을 실행시켜서 함수와 변수명들을 얻을수 있습니다.
도구->매크로->새 매크로 기록 을 누르시면
새로운 매크로를 작성합니다.
매크로를 켜두셨다면...
이제 A1 부터 C3까지의 범위를 선택해서
셀서식의 테두리에 가서 윤곽선만 그리도록 하겠습니다.
다시
도구->매크로->Visual Basic Editor (단축키 Alt + F11)을 누르시면...
모듈 부분에 우리가 했던 윤곽선 작업이 스크립트로 작성되어있습니다~
얼마나 고맙습니까?
저는 이걸 알았을때 눈물을 흘릴뻔^^;;; 했습니다...
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
라인에 F9를 눌러서 중단점을 거신후
F5를 눌러 실행을 해봅시다...
xlNone 에마우스를 가져가시면?
값이 보이죠~ xlNone의 값은 -4142군요^^
이와 같이... 필요한 값들을 하나하나 찾을수 있습니다.
처음에 제가 설명을 시작하면서 새로운 파일을 생성하는것만 보여드렸죠...
이것은... 이미 작업된(생성된)파일을 열어서 작업하는 겁니다. 물론 다른프로그램에서 읽고있다거나 하면 에러납니다
(엑셀은 에러가 굉장히 무섭게 생겼습니다 ㄷㄷㄷ;);
ExcelWb->ConnectTo( ExcelApp->Workbooks->Open( FileName.operator wchar_t *(),
TNoParam(), TNoParam(), TNoParam(), TNoParam(), TNoParam(), TNoParam(),
TNoParam(), TNoParam(), TNoParam(), TNoParam(), TNoParam(), TNoParam(),
TNoParam(), TNoParam(), 0));
FileName 도 TVariant 입니다. 하지만 파라메터는 wchar_t *형으로 넣어주셔야 합니다.
그 다음이 문제입니다....
Open함수는 다음과 같이 막막하게 생겼습니다....
Open(BSTR Filename/*[in]*/, VARIANT UpdateLinks/*[in,opt]*/,
VARIANT ReadOnly/*[in,opt]*/, VARIANT Format/*[in,opt]*/,
VARIANT Password/*[in,opt]*/,
VARIANT WriteResPassword/*[in,opt]*/,
VARIANT IgnoreReadOnlyRecommended/*[in,opt]*/,
VARIANT Origin/*[in,opt]*/, VARIANT Delimiter/*[in,opt]*/,
VARIANT Editable/*[in,opt]*/, VARIANT Notify/*[in,opt]*/,
VARIANT Converter/*[in,opt]*/, VARIANT AddToMru/*[in,opt]*/,
VARIANT Local/*[in,opt]*/, VARIANT CorruptLoad/*[in,opt]*/,
long lcid/*[in]*/,
Excel_xp::ExcelWorkbook** RHS/*[out,retval]*/) = 0; // [1923]
...
저는 뭐가 뭔지 하나도 모르겠습니다^^;;
그래서 전부 ...TNoParam()으로 채웠죠...
TNoParam()은 엑셀에서 기본으로 지원해주는 함수 입니다.
파라미터에 해당하는 값을 알맞게 채워주는 똑똑한 녀석입니다.. 훗;
Default값들을 채워주죠...
자... 마지막으로...
저장을 합니다.
저장은 다음과같이...하시면 만사 오케이...
새로 생성을 하셨든 이미 있는 파일을 여셨든...
SaveAs로 저장하시면 됩니다.
다음과 같이말입니다.^^;;;
ExcelWb->SaveAs(FileName,
TNoParam(),
TNoParam(),
TNoParam(),
TNoParam(),
TNoParam(),
(Excel_xp::XlSaveAsAccessMode) 3/*[in,def,opt]*/,
TNoParam(),
TNoParam(),
TNoParam(),
TNoParam(),
TNoParam(),
TDefLCID());
다 TNoParam()이죠?;; ㅎㅎ
저도 아직 모르는게 많이 있습니다;;
도움이 되었으면 하네요^^;;;
그럼 즐거운 프로그래밍 되시구요^^
모르시는거 있으시면 또 글 남겨주세요~
|