C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■103471 / 4階層)  Excelを開くのを1つだけ
□投稿者/ 魔界の仮面弁士 (3816回)-(2024/11/28(Thu) 20:17:38)
No103456 (魔界の仮面弁士) に追記
> 別プロセスで起動されている場合(特にオートメーション併用時)にも対応したい場合は、
> ROT を辿れば、個々の Workbook オブジェクトにアクセスできるかと。

これでどうかな。
現在開かれている Workbook オブジェクトを全列挙しています。
※あまりテストしてません。

private void button1_Click(object sender, EventArgs e)
{
 var books = ExcelSample.GetWorkbooks();
 foreach (var (name, obj) in books)
 {
  Debug.WriteLine(name);
  Microsoft.Office.Interop.Excel.Workbook book = obj;
  Debug.WriteLine(book.FullName);
  Marshal.ReleaseComObject(obj);
 }
}


//---
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;

internal static class ExcelSample
{
 public static Tuple<string, dynamic>[] GetWorkbooks()
 {
  var list = new List<Tuple<string, dynamic>>();
  if (CreateBindCtx(0, out var ctx) == 0 && ctx != null)
  {
   ctx.GetRunningObjectTable(out var rot);
   rot.EnumRunning(out var enumMoniker);
   enumMoniker.Reset();
   var ms = new IMoniker[1];
   while (enumMoniker.Next(1, ms, IntPtr.Zero) == 0)
   {
    try
    {
     ms[0].GetDisplayName(ctx, null, out var displayName);
#if DEBUG
     ms[0].GetClassID(out var clsid);
     Debug.WriteLine($"{clsid} / {displayName}");
#endif
     rot.GetObject(ms[0], out var comObject);
     if (comObject is Microsoft.Office.Interop.Excel.Workbook)
     {
      list.Add(new Tuple<string, dynamic>(displayName, comObject));
     }
    }
    finally
    {
     Marshal.ReleaseComObject(ms[0]);
    }
   }
   Marshal.ReleaseComObject(enumMoniker);
   Marshal.ReleaseComObject(ctx);
   Marshal.ReleaseComObject(rot);
  }
  return list.ToArray();
 }

 [DllImport("ole32")]
 private static extern int CreateBindCtx(int reserved, out IBindCtx ppbc);
}

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[3]: Excelを開くのを1つだけ /魔界の仮面弁士 返信無し
 
上記関連ツリー

Excelを開くのを1つだけ / screen (24/11/24(Sun) 09:44) #103450
Re[1]: Excelを開くのを1つだけ / WebSurfer (24/11/26(Tue) 09:23) #103451
  └ Re[2]: Excelを開くのを1つだけ / screen (24/11/26(Tue) 20:30) #103452
    ├ Re[3]: Excelを開くのを1つだけ / kiku (24/11/27(Wed) 10:37) #103453
    └ Re[3]: Excelを開くのを1つだけ / 魔界の仮面弁士 (24/11/27(Wed) 13:06) #103456
      └ Excelを開くのを1つだけ / 魔界の仮面弁士 (24/11/28(Thu) 20:17) #103471 ←Now

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信