今現在、フォーム内でエクセルを表示するだけのプログラムを作ってい
るのですが、なかなか上手くいきません。
どなたかご助力頂けないでしょうか。
条件は以下のとおりです。
・自作のボタン等の配置が可能な事
・エクセルの編集がある程度可能な事(値の変更等)
・エクセルの標準のメニューの表示無し、マクロの実行不可
開発環境は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を使う場合にコツ等があるのでしょうか。
もし何かあれば、アドバイスの程、宜しくお願い致します。
------
ハル
はずしてたらごめんなさい。
TCppWebBrowserで開いたらどうでしょう?
Yuki Matsumoto さんは書きました:
--
株式会社バードランド
本社:
〒003-0006
北海道札幌市白石区東札幌6条3丁目1-60-603
株式会社バードランド
TEL 080-1865-8214
代表取締役社長
金沢良次
返信ありがとうございます。
>> TCppWebBrowserで開いたらどうでしょう?
TCppWebBrowserを試してみたいと思っていたのですが、HELPの情報が乏
しくあまり使い方がわからなかったもので、保留していました。初期の
導入が出来ないと完成形がイメージできなかったものもあるのですが。
GOOGLE等で"TCppWebBrowser Excel"、等で2chのスレッド等しか記事が
ヒットしなかった事もあり、実態としては作業の合間に作っているもの
でしたので、すぐ情報が得られないのならとあまり精査していませんで
した。
どこか良い解説ページ等ご存知でしょうか。
まだあまりTCppWebBrowser自体に触れられていないので、時間が空き次
第再度TCppWebBrowserの利用も考えてみようと思います。
解決策が見つかり次第こちらからもポストさせて頂きます。
今後とも宜しくお願い致します。
------
ハル
TccWebBrowserを貼り付けて、Excelをドラッグ&ドロップすれば
すぐ見えます。
Yuki Matsumoto さんは書きました:
> TccWebBrowserを貼り付けて、Excelをドラッグ&ドロップすれば
> すぐ見えます。
そもそもOffice12になるとブラウザ上で開く事が出来ないようで、ドラ
ッグ&ドロップでもエクセル自体が開いてしまいます。
CppBrowser->Navigate(file_name)後、エクセルが直接開いてしまいま
す。
そのため、OleContainerを使う他無さそうです。
------
ハル
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;
}
------
ハル