TOLEContainerを使用して.xlsxファイルは問題なく開けるのに.xlsmはエクセル側で「すべて実行」や「信頼できる場所」を設定しているにもかかわらず「マクロを無効にする」ダイアログが表示されて、以降マクロを許可できない。回避策があれば教えていただきたい。なおOleVariant やSetParentによる呼出しではファイルも問題なく開けるし。マクロの実行もできる。
> 回避策があれば教えていただきたい。
おそらくできません。
TOleContainer で扱えるのは OLE 2.0 という古い (?) 形式です。
そのため、TOleContainer には、xlsx ックでは使用できない機能、プロパティ、メソッド類があります。
> xlsx ックでは
↓
xlsx のブックを表示した場合、
ご意見ありがとうございます。
以前、XRayさんの「plExcelEx」を参考にExcel2013以降のエクセルでも動くテンプレートのようなものを作って現在も使用中です。
この場をお借りして、大変勉強になった事を御礼申し上げます。
AIにも聞いてみましたがすったもんだした挙句「無理」と言われました。
一応、自分なりに色々と行った結果を
まず、OlevariantのSetParntを使った場合は問題なかったので
Excel起動(非表示) xlApp := CreateOleObject('Excel.Application');
xlApp.Visible := False; xlApp.AutomationSecurity := 1;
// ファイルを開く
xlBook := xlApp.Workbooks.Open(FilePath, False, False);
// リボン非表示(非表示状態で実行)
xlApp.ExecuteExcel4Macro('SHOW.TOOLBAR("Ribbon",False)');
xlApp.DisplayFormulaBar := False; // 数式バーを非表示
xlApp.DisplayStatusBar := False; // ステータスバーを非表示
// ウィンドウハンドル取得
FExcelHWnd := HWND(NativeUInt(xlApp.Hwnd));
// OLEContainerに埋め込み
Winapi.Windows.SetParent(FExcelHWnd, HWND(OleContainer1.Handle));
// 表示
xlApp.Visible := True;
ShowWindow(FExcelHWnd, SW_SHOWMAXIMIZED);
と言う無理やりOLEContainerを親にしてしまう。
と、マクロが有効なままエクセルをOLEContainerにドッキングは表面上出来るようになりました。
全く力業で作法もへったくれもないプログラムです。
一応タイトルバー(最小化や最大化のあるバー)が表示したままなので、どうしたものかと
皆様のご意見をお聞きしたくもう少しスレッドは残しておきます
ワードパッドに .XLSM 取り込んで マクロ実行しようすると
「マクロを無効にする」ダイアログ
表示されるね
ワードパッドではなくOLEContainerにエクセルを接続してマクロ有効ファイル.xlsmを開くと警告メッセージが開きます。
例えば
OleContainer1.CreateObjectFromFile(FileName, False);
// インプレース(フォーム内)でアクティブ化
OleContainer1.DoVerb(ovShow);
の場合警告が出ます。その後マクロの有効化は現時点で不可能ですね
EXCEL を起動しておいた状態で
OleContainer1.CreateObjectFromFile('A.xlsm',False);
OleContainer1.DoVerb(ovShow);
で
「マクロを無効にする」ダイアログ が 「有効にする」 「無効にする」に変わった
で
EXCEL のオプションいじっていたら ダイアログ 自体表示 しなくなりました。
どこいじったかは おぼえてません。(トラストセンター)
環境は
Windows10 + Office 2019 + Delphi 12
です
AAAAAさん ご意見ありがとうございます。
OleContainer1.CreateObjectFromFile('A.xlsm',False);
OleContainer1.DoVerb(ovShow);
の場合、エクセルがファイル名にかかわらず一旦メモリー上(Book1)に展開して「Book1は信頼できるファイルではない。」という結論で「無効」というメッセージが出ている。と思われます。エクセルを起動した状態でDelphiのEXEを実行してトラストセンターの設定を変更するという行為をEXEを使う全てのPC(ユーザー)に行ってもらうというのはリスクが多いし、ほかのPC環境での検証(EXEだけをコピーして実行した場合)も必要なので、今回は06-05のコードでの更なる不具合がないかを検証しようと思います。
色々と作ってみましたが、 OleContainerをSetParentで指定してもOleContainerのOleObjectは空なのでOleContainerのコマンドは使えませんでした。PanelにSetParentで指定した場合どうしてもフォーカスのセットがうまく出来ず、ならばOleContainerをつえないかという思い付きでしたが、最終的にはXrayさんのおっしゃるようにOLEとしてのコマンド等が使えないのでこれはあきらめるしかないと思います。もう一度、最初に戻りPanelにSetParentで指定した場合でフォーカスのセットを試そうと思います。お付き合いしていただいた皆様ありがとうございました。
たびたびすみません。
Xrayさんの
FxlfExcelHandle := FindWindow('XLMAIN', nil);
FxlfExcelXLDESKHandle := FindWindowEx(FxlfExcelHandle, 0, 'XLDESK', nil);
FxlfExcelBookHandle := FindWindowEx(FxlfExcelXLDESKHandle, 0, 'EXCEL7', nil);
最終的にEXCEL7までフォーカスを落とし込むことでフォーカス移動ができ、連続したコマンド、マクロもエラーなく実行できました。一旦解決とさせていただきます。
皆様、特に参考にさせていただいたXRayさんのプログラム、ありがとうございました。
| ツイート |
|