Olecontainerでマクロ付きファイルを開くには?

解決


Hiroshi  2026-06-04 17:18:55  No: 152285

TOLEContainerを使用して.xlsxファイルは問題なく開けるのに.xlsmはエクセル側で「すべて実行」や「信頼できる場所」を設定しているにもかかわらず「マクロを無効にする」ダイアログが表示されて、以降マクロを許可できない。回避策があれば教えていただきたい。なおOleVariant やSetParentによる呼出しではファイルも問題なく開けるし。マクロの実行もできる。


Mr.XRAY  2026-06-05 08:25:21  No: 152286

> 回避策があれば教えていただきたい。

おそらくできません。                                                                       
TOleContainer で扱えるのは OLE 2.0 という古い (?) 形式です。
そのため、TOleContainer には、xlsx ックでは使用できない機能、プロパティ、メソッド類があります。


Mr.XRAY  2026-06-05 09:27:32  No: 152287

> xlsx ックでは
   ↓
xlsx のブックを表示した場合、


hHroshi  2026-06-05 17:32:10  No: 152288

ご意見ありがとうございます。
以前、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にドッキングは表面上出来るようになりました。
全く力業で作法もへったくれもないプログラムです。
一応タイトルバー(最小化や最大化のあるバー)が表示したままなので、どうしたものかと
皆様のご意見をお聞きしたくもう少しスレッドは残しておきます


AAAAA  2026-06-06 03:01:25  No: 152289

ワードパッドに .XLSM 取り込んで マクロ実行しようすると
「マクロを無効にする」ダイアログ 
表示されるね


Hiroshi  2026-06-06 13:16:28  No: 152290

ワードパッドではなくOLEContainerにエクセルを接続してマクロ有効ファイル.xlsmを開くと警告メッセージが開きます。
例えば
  OleContainer1.CreateObjectFromFile(FileName, False);
  // インプレース(フォーム内)でアクティブ化
  OleContainer1.DoVerb(ovShow); 
の場合警告が出ます。その後マクロの有効化は現時点で不可能ですね


AAAAA  2026-06-06 17:09:47  No: 152291

EXCEL を起動しておいた状態で 

  OleContainer1.CreateObjectFromFile('A.xlsm',False);
  OleContainer1.DoVerb(ovShow);



「マクロを無効にする」ダイアログ  が 「有効にする」 「無効にする」に変わった



EXCEL のオプションいじっていたら ダイアログ 自体表示 しなくなりました。
どこいじったかは おぼえてません。(トラストセンター)


AAAAA  2026-06-06 17:18:28  No: 152292

環境は
Windows10 + Office 2019 + Delphi 12
 です


Hiroshi  2026-06-07 02:48:34  No: 152293

AAAAAさん ご意見ありがとうございます。
 OleContainer1.CreateObjectFromFile('A.xlsm',False);
  OleContainer1.DoVerb(ovShow);
の場合、エクセルがファイル名にかかわらず一旦メモリー上(Book1)に展開して「Book1は信頼できるファイルではない。」という結論で「無効」というメッセージが出ている。と思われます。エクセルを起動した状態でDelphiのEXEを実行してトラストセンターの設定を変更するという行為をEXEを使う全てのPC(ユーザー)に行ってもらうというのはリスクが多いし、ほかのPC環境での検証(EXEだけをコピーして実行した場合)も必要なので、今回は06-05のコードでの更なる不具合がないかを検証しようと思います。


Hiroshi  2026-06-07 13:23:12  No: 152294

色々と作ってみましたが、 OleContainerをSetParentで指定してもOleContainerのOleObjectは空なのでOleContainerのコマンドは使えませんでした。PanelにSetParentで指定した場合どうしてもフォーカスのセットがうまく出来ず、ならばOleContainerをつえないかという思い付きでしたが、最終的にはXrayさんのおっしゃるようにOLEとしてのコマンド等が使えないのでこれはあきらめるしかないと思います。もう一度、最初に戻りPanelにSetParentで指定した場合でフォーカスのセットを試そうと思います。お付き合いしていただいた皆様ありがとうございました。


Hiroshi  2026-06-07 15:01:36  No: 152295

たびたびすみません。
Xrayさんの
  FxlfExcelHandle := FindWindow('XLMAIN', nil);
  FxlfExcelXLDESKHandle := FindWindowEx(FxlfExcelHandle, 0, 'XLDESK', nil);
  FxlfExcelBookHandle := FindWindowEx(FxlfExcelXLDESKHandle, 0, 'EXCEL7', nil);
最終的にEXCEL7までフォーカスを落とし込むことでフォーカス移動ができ、連続したコマンド、マクロもエラーなく実行できました。一旦解決とさせていただきます。
皆様、特に参考にさせていただいたXRayさんのプログラム、ありがとうございました。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加