VC++からマクロを動かす

[戻る]
こまったちゃん 2006/07/13(木) 13:10:57
お世話になります。
知識を身に付けたく、他でも同じ質問をしていますお許し下さい。

表題の件でプログラムレビューでつこまれ、何も答えられなかった自分
に反省し、ただコピーるだけでなく、解析する事をしましたが、
分らなかった箇所があったり、間違った解釈をしてるか、教えてもらいたく投稿しまし
た。

また処理が終了しますと『ハンドルされていない例外はBoot.exe(OLE32.DLL)にありま
す』
OnInitDialog();でも::CoInitialize(NULL);すると直ります。2箇所でやらないとダメ
な理由が分りません。

基礎が出来ていなくお忙しい所お手数かけますが
よろしくお願い致します。

COleVariant・・・エクセルなど他のアプリケーションを使用する時に
         しようする。
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/6/oleabs/oleabs.html
http://msdn2.microsoft.com/ja-jp/library/x8be74z8.aspx

_ApplicationPtr・・・エクセルを実体化する為に必要
http://72.14.235.104/search?
q=cache:H4IR8Qghs0AJ:park15.wakwak.com/~opapa/xml/Office.htm+_ApplicationPtr&hl
=ja&gl=jp&ct=clnk&cd=3

VC++6.0
ダイアログベース
Excel 2000

<ヘッダーファイル>
// BootMacro.h: CBootMacro クラスのインターフェイス
//
//////////////////////////////////////////////////////////////////////
#pragma warning(disable : 4146 4192)// この原因もよく分らず・・
#import "C:\Program Files\Microsoft Office\Office\Mso9.dll" no_namespace rename
("DocumentProperties", "DocumentPropertiesXL")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\Vbe6ext.olb" 
no_namespace
#import "C:\Program Files\Microsoft Office\Office\excel9.olb" rename
("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename
("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces
#if !defined(AFX_BOOTMACRO_H__C4BC2D91_FAAE_4125_B957_87EEC0E83C33__INCLUDED_)
#define AFX_BOOTMACRO_H__C4BC2D91_FAAE_4125_B957_87EEC0E83C33__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CBootMacro
{
private:
   Excel::_ApplicationPtr pXL;  // ポインター
   Excel::WorkbooksPtr pBooks;    // ポインター
   HRESULT m_hr;
public:
   CBootMacro();
   virtual ~CBootMacro();
   bool Start(/*CString* test_path1*/);
   bool End();

};

こまったちゃん 2006/07/13(木) 13:13:03
自分の理解をコメントしています。
間違っていましたらご指摘お願いします。

<cppファイル>
// BootMacro.cpp: CBootMacro クラスのインプリメンテーション

#include "stdafx.h"
#include "boot.h"
#include "BootMacro.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

////////////////////////////////////////////////////////////////
// 構築/消滅
////////////////////////////////////////////////////////////////

CBootMacro::CBootMacro()
{
   //com を使う時はイニシャライズをする
   ::CoInitialize(NULL);
   pXL = NULL;
   pBooks = NULL;
}

CBootMacro::~CBootMacro()
{
   // 生成したアプリケーション解放
   pXL.Release();
   ::CoUninitialize();
}

////////////////////////////////////////////////////////////////
// マクロ起動
////////////////////////////////////////////////////////////////

bool CBootMacro::Start(/*CString* test_path1*/)
{
   using namespace Excel;    //名前空間の定義
   COleVariant cdata;

   //Excelの起動
   pXL.CreateInstance(L"Excel.Application");    //アプリケーションの生成

   //WorkBookを追加する(ここがHPを見ましたが理解できていない)
   pBooks = pXL->Workbooks;

   try
   {    // 「_WorkbookPtr pBook これはどこにも使ってないから、この処理はいらな
いのでは」
       // と言われ何も答えられませんでした
       _WorkbookPtr pBook  = pBooks->Open("C:\\SWD\\AutoMation-3
\\Debug\\format5.xls");//ドキュメントを開く
   }
   catch(_com_error& e)
   {    //本来こうしたいのだが↓・・・_com_error* eでもダメ
       //e->Delete();
   }

   //確認メッセージ(MessageBox等)の表示の無効化
   pXL->DisplayAlerts = FALSE;

   //マクロ名を格納(SetString(マクロ名, VT_BSTR(これは決まり?)))
   cdata.SetString("READ_TextFile",VT_BSTR);

   try
   {    // _Run2 関数の仕様がgoogleに載ってなかった
       m_hr = pXL->_Run2(cdata);
   }
   catch(...)//現状はこの形でcatch
   {
           return false;
   }

   return true;
}

////////////////////////////////////////////////////////////////
// マクロ終了
////////////////////////////////////////////////////////////////

bool CBootMacro::End()
{
   //ファイルを閉じる
   pBooks->Close();
   //マクロの終了
   if((m_hr = pXL->Quit()) != 0)
   {
       return false;
   }
   return true;
}

錯和 2006/07/13(木) 13:24:30
なんで移動したの?こういう行為はマルチポストとして非常に礼儀知らずの行為です。
http://forums.belution.com/ja/vc/000/366/60.shtml

こまったちゃん 2006/07/13(木) 13:39:46
どうしも今日中に報告しなくてはいけなく、また初心者で聞きすぎたので
もう教えてもらえなとか思い、あせりもあり失礼は承知で移動しました。
申し訳ありません。

今でも自分で調べているのですが
http://www.ujasiri.com/prglib/vc/excel/vc_excel.html

やはりソースをみただけでは、何も答えられなかった箇所については
わからず、途方にくれています。

マナー違反で申し訳ない行為をしたことは謝罪します。
『申し訳ありませんでした』

理解の間違いがあればアドバイスよろしくお願い致します。

ITO 2006/07/13(木) 13:53:44
>どうしも今日中に報告しなくてはいけなく、また初心者で聞きすぎたので....
これきちんと、
 http://forums.belution.com/ja/vc/000/366/60.shtml
 で説明しないといけないですね。
 事情を説明すれば大丈夫だと思います。
 http://forums.belution.com/ja/vc/000/366/60.shtml
のところでもう一度聞いて見るのもいいと思います。
それで、これ以上回答できないとの話なら、きちんと宣言して、
ここでスレ作ってもいいと思います。

Ban 2006/07/13(木) 13:59:17
> どうしも今日中に報告しなくてはいけなく、
> また初心者で聞きすぎたのでもう教えてもらえなとか思い、
> あせりもあり失礼は承知で移動しました。申し訳ありません。

# 追い詰められてあせる気持ちもわかりますが、今日中に、とかいうのは回答者には
# 関係の無いご自身の都合です。初心者というのも理由にはなりません。
# 聞き方にもよりますが、「失礼を承知でマルチポスト」するよりは同じ掲示板で
# 継続する方が、よほど心象はいいと思います。
# 知っててやるってことは「自分の都合が満たせれば他人に失礼だろうがどうでもい
い」
# と宣言してるようなものですし。
# 各掲示板の他の回答を見てれば、回答者はかなりかぶっていることはわかりますし。

こまったちゃん 2006/07/13(木) 14:20:58
ITOさんがいわれたとおり、最初の場所で謝罪をしました。
助けてもらえるように努力します。

Banさんの言う通りだと思います。今後は二度とこのような事はしません。

申し訳ありませんでした。

こまったちゃん 2006/07/13(木) 16:03:43
[[解決]]
申し訳ありませんでした。

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