いつも参考にしています。
VC++からEXCELのシートを印刷したいのですが、今記述しているソースだと
印刷できないのです。どなたかお教えください。特に分からないのは、バリアントというもので
す。印刷関数の引数が分かりません。
環境 Win2000/VC++6.0/MFC
VC++とExcelの接続はClassWizardを使用してタイプライブラリからExcel操作用クラスを取り
込み操作する方法を使用しています。
プログラムの仕様はOKボタンを押すとエクセルが起動してデータが入力されて印刷するという仕
様になっています。
以下がそのプログラムです。
void CExcelDlg::OnOK()
{
_Application pXlsApp;
Workbooks pXlsBooks;
_Workbook pXlsBook;
Sheets pSheets;
_Worksheet pSheet;
Range pRanges,
pRange;
Borders pBorders;
LPDISPATCH pDisp;
int row, col;
COleVariant var, fil, data, x, y, cell1, cell2, prt;
// OLE初期化
AfxOleInit();
AfxEnableControlContainer();
pXlsApp.CreateDispatch( Excel.Application ); // Excelを起動する
// Workbooksのオブジェクトを取得
pXlsBooks.AttachDispatch(pXlsApp.GetWorkbooks(),TRUE);
// Workbooksオープン
pDisp = pXlsBooks.Open(D:\\Job\\Book1.xls,
COleVariant((long)0, VT_I4),
COleVariant((long)FALSE, VT_BOOL),
COleVariant((long)1, VT_I4),
COleVariant("),
COleVariant("),
COleVariant((long)FALSE, VT_BOOL),
COleVariant((long)2, VT_I4),
COleVariant(),
COleVariant((long)FALSE, VT_BOOL),
COleVariant((long)FALSE, VT_BOOL),
COleVariant(),
COleVariant((long)FALSE, VT_BOOL));
pXlsBook.AttachDispatch(pDisp);
pXlsApp.m_bAutoRelease = TRUE;
pXlsApp.SetVisible(TRUE); // 画面表示を有効にする
// Sheetsオブジェクトの取得
pSheets.AttachDispatch(pXlsBook.GetWorksheets());
// Worksheetオブジェクトの取得
// 1つ目のタブに設定
pSheet.AttachDispatch(pSheets.GetItem(COleVariant((long)1, VT_I4)));
// Worksheetオブジェクト全体をRangeとして取得
pRanges.AttachDispatch(pSheet.GetCells());
// Cel(Row=2~3, Col=2~4)を取得
for(row=2; row<=3; row++){
for(col=2; col<=4; col++){
pRange.AttachDispatch(pRanges.GetItem(COleVariant((long)row,
VT_I4), COleVariant((long)col, VT_I4)));
pRange.SetValue(COleVariant(COleVariant(HELLO!!)));
}
}
// 印刷する
pSheet.PrintOut(COleVariant((long)1, VT_I4),
COleVariant((long)1, VT_I4),
COleVariant((long)1, VT_I4),
COleVariant((long)FALSE, VT_BOOL),
COleVariant(),
COleVariant((long)TRUE, VT_BOOL),
COleVariant((long)FALSE, VT_BOOL), fil);
//警告メッセージが表示されないように設定
pXlsApp.SetDisplayAlerts(FALSE);
//結びつけたオブジェクトの分離と開放
pBorders.DetachDispatch(); // Bordersの分離
pBorders.ReleaseDispatch(); // Bordersの解放
pRange.DetachDispatch(); // Rangeの分離
pRange.ReleaseDispatch(); // Rangeの解放
pSheet.DetachDispatch(); // _Worksheetの分離
pSheet.ReleaseDispatch(); // _Worksheetの解放
pSheets.DetachDispatch(); // Sheetsの分離
pSheets.ReleaseDispatch(); // Sheetsの解放
pXlsBook.DetachDispatch(); // _Workbookの分離
pXlsBook.ReleaseDispatch(); // _Workbookの解放
pXlsBooks.DetachDispatch(); // Workbooksの分離
pXlsBooks.ReleaseDispatch(); // Workbooksの解放
//Excelを終了する
pXlsApp.Quit();
pXlsApp.ReleaseDispatch(); // Applicationの解放
}
あれ? 10日も前のヤツ?
pRange.AttachDispatch(pRanges.GetItem(COleVariant((long)row,
VT_I4), COleVariant((long)col, VT_I4)));
↓
pRange.AttachDispatch(pRanges.GetItem(COleVariant((long)row,
VT_I4), COleVariant((long)col, VT_I4)).pdispVal );
で出来たよ。
コンパイルエラーだよ。
上記の行と、
error C2664: 'AttachDispatch' : 1 番目の引数を 'struct tagVARIANT' から 'struct
IDispatch *' に変換できません。
を載っけてくれれば二秒で答えが返って来たよ。
っつーか暇なのか俺は。
おまえ!うざれ!
調子にのるなよ!
なんだテメー、ヘッダに
#define if(x) if(((x)||1)&&rand()%2)
仕込むぞコラ