[cbuilder:40052] TExcelApplicationのExecuteExcel4Macroの使い方について

251 views
Skip to first unread message

Yuki Matsumoto

unread,
Jan 23, 2009, 7:00:42 AM1/23/09
to cbui...@sfdata.ne.jp
お世話になります。
ハルです。


今現在、フォーム内でエクセルを表示するだけのプログラムを作ってい
るのですが、なかなか上手くいきません。
どなたかご助力頂けないでしょうか。

条件は以下のとおりです。
・自作のボタン等の配置が可能な事
・エクセルの編集がある程度可能な事(値の変更等)
・エクセルの標準のメニューの表示無し、マクロの実行不可


開発環境はXP、C++Builder2007/RAD Studio 2007で組んでおります。
直接シートを印刷する、ブック全体を印刷する等の操作の他、ブック内
のシート間を簡単に移動出来る大きめのボタンを配置するなど、操作を
誰にでも使いやすくし、他のプログラムから直接吐き出されるエクセル
データを、制限付きでプレビュー表示させる事を目的として製作してい
ます。
特に、エクセルのバージョンが違っても出来るだけ共通の概観になる事
を目的としています。


全てのメニューバー等を非表示にするために、現在はTOleContainer と、
Office 2000/XP Servers Package を使っています。
(これがそもそもの失敗なのかもしれませんが。)


TOleContainerでファイルを読み込み、DoVerb(ovShow)でコンテナをア
クティブにした後に、通常のコマンドバーを全て非表示にする等の操作
を行っているのですが、Excel 2007では画面上部にリボンと名称を変え
たコマンドバーが配置されており、これらはコマンドバーからのアクセ
スでは非表示に出来ません。

これを非表示にするには、Excel側のマクロを直接組む場合、下記を記
述する事で実行可能です。

Sub HideRibbon()
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"", False)"
End Sub


これを、Office Servers Packageのコンポーネントである、
TExcelApplicationから実行出来るだろうと考えたのですが、
ExecuteExcel4Macroを実行させようと色々試してみたところ、必ずエラ
ー(もしくは完全に反応が無い。違うマクロに変更した場合でも。)に
なってしまいます。

TOleContainerに読み込んだファイルに直接マクロを記述したり、マク
ロ付きのファイルを読み込んでから実行する分には、きちんとリボンの
非表示が動作するのですが、それをソフト側から制御出来ずに困ってい
ます。


BCBでTExcelApplicationを使う場合にコツ等があるのでしょうか。
もし何かあれば、アドバイスの程、宜しくお願い致します。


------
ハル

kanazawa

unread,
Jan 26, 2009, 8:24:28 PM1/26/09
to cbui...@sfdata.ne.jp
バードランドの金沢です。

はずしてたらごめんなさい。
TCppWebBrowserで開いたらどうでしょう?

Yuki Matsumoto さんは書きました:


--
株式会社バードランド

本社:
〒003-0006
北海道札幌市白石区東札幌6条3丁目1-60-603
株式会社バードランド


TEL 080-1865-8214


代表取締役社長
金沢良次

Yuki Matsumoto

unread,
Jan 27, 2009, 12:13:34 AM1/27/09
to cbui...@sfdata.ne.jp
金沢さん


返信ありがとうございます。

>> TCppWebBrowserで開いたらどうでしょう?
TCppWebBrowserを試してみたいと思っていたのですが、HELPの情報が乏
しくあまり使い方がわからなかったもので、保留していました。初期の
導入が出来ないと完成形がイメージできなかったものもあるのですが。

GOOGLE等で"TCppWebBrowser Excel"、等で2chのスレッド等しか記事が
ヒットしなかった事もあり、実態としては作業の合間に作っているもの
でしたので、すぐ情報が得られないのならとあまり精査していませんで
した。

どこか良い解説ページ等ご存知でしょうか。
まだあまりTCppWebBrowser自体に触れられていないので、時間が空き次
第再度TCppWebBrowserの利用も考えてみようと思います。

解決策が見つかり次第こちらからもポストさせて頂きます。
今後とも宜しくお願い致します。


------
ハル

kanazawa

unread,
Jan 27, 2009, 2:02:35 AM1/27/09
to cbui...@sfdata.ne.jp
TO 松本様

TccWebBrowserを貼り付けて、Excelをドラッグ&ドロップすれば
すぐ見えます。

Yuki Matsumoto さんは書きました:

Yuki Matsumoto

unread,
Jan 30, 2009, 1:18:00 AM1/30/09
to cbui...@sfdata.ne.jp
暫く期間が開いてしまいましたが、今日触る時間があったので報告まで。


> TccWebBrowserを貼り付けて、Excelをドラッグ&ドロップすれば
> すぐ見えます。

そもそもOffice12になるとブラウザ上で開く事が出来ないようで、ドラ
ッグ&ドロップでもエクセル自体が開いてしまいます。

CppBrowser->Navigate(file_name)後、エクセルが直接開いてしまいま
す。

そのため、OleContainerを使う他無さそうです。

------
ハル

Yuki Matsumoto

unread,
Jan 30, 2009, 4:02:05 AM1/30/09
to cbui...@sfdata.ne.jp
自己レスです。
下記ソースで呼び出せました。
少し時間がかかりました…。
とりあえず動作させるためだけに書いたコードなのでかなりエラー処理
は端折っています。


Variant __fastcall ExecuteExcel4Macro(WideString string)
{
VARIANTARG VarResult;

TExcelApplication *app = ExlApplication;

OLECHAR *rgszNames = OLESTR("ExecuteExcel4Macro");
UINT cNames = 1;
DISPID rgDispId;

HRESULT ret = app->Application->GetIDsOfNames(
IID_NULL, // 常にIID_NULLを指定
&rgszNames, // 割り当てる名前の配列
cNames, // 割り当てる名前のカウント
GetUserDefaultLCID(), // ロケールコンテキスト
&rgDispId); // 戻り値

if (!FAILED(ret)) {
Variant rgvarg = string; // 実行マクロ
DISPPARAMS DispParams = {rgvarg, NULL, 1, 0};
EXCEPINFO ExcepInfo;
UINT uArgErr;

app->Application->Invoke(
rgDispId, // ExecuteExcel4Macroの識別子
IID_NULL, //
GetUserDefaultLCID(),//
DISPATCH_PROPERTYGET,//
&DispParams, //
&VarResult, // 戻り値
&ExcepInfo, // 例外情報構造体
&uArgErr); // エラー引数のインデックス
}

return VarResult;
}

------
ハル

Reply all
Reply to author
Forward
0 new messages