VC++からEXCELのシートを印刷したい

[戻る]
天然 2003/11/10(月) 12:15:59
いつも参考にしています。
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の解放
}

秋衛門 2003/11/21(金) 13:20:13
あれ? 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 *' に変換できません。

を載っけてくれれば二秒で答えが返って来たよ。
っつーか暇なのか俺は。

冬衛門 2003/11/22(土) 15:47:14
おまえ!うざれ!
調子にのるなよ!

秋衛門 2003/11/26(水) 14:41:27
なんだテメー、ヘッダに
#define if(x) if(((x)||1)&&rand()%2)
仕込むぞコラ

古いスレッドには追加発言できません。