VC++からマクロを動かす – プログラミング – Home

通知
すべてクリア

[解決済] VC++からマクロを動かす


こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

お世話になります。
知識を身に付けたく、他でも同じ質問をしていますお許し下さい。

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

また処理が終了しますと『ハンドルされていない例外は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();

};


引用未解決
トピックタグ
こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

自分の理解をコメントしています。
間違っていましたらご指摘お願いします。

<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(LExcel.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;
}


返信引用
錯和
 錯和
(@錯和)
ゲスト
結合: 18年前
投稿: 5
 

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


返信引用
こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

どうしも今日中に報告しなくてはいけなく、また初心者で聞きすぎたので
もう教えてもらえなとか思い、あせりもあり失礼は承知で移動しました。
申し訳ありません。

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

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

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

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

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

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


返信引用
こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

ITOさんがいわれたとおり、最初の場所で謝罪をしました。
助けてもらえるように努力します。

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

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


返信引用
こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました