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

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

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

Excelを開くのを1つだけ

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■103450 / inTopicNo.1)  Excelを開くのを1つだけ
  
□投稿者/ screen (6回)-(2024/11/24(Sun) 09:44:28)

分類:[Microsoft Office 全般] 

office 2019 を使っています

パソコン上でエクセルファイルを1つだけ開いて
2つ目以降は開けないように出来ないでしょうか
宜しくお願い致します
引用返信 編集キー/
■103451 / inTopicNo.2)  Re[1]: Excelを開くのを1つだけ
□投稿者/ WebSurfer (2934回)-(2024/11/26(Tue) 09:23:54)
No103450 (screen さん) に返信
> office 2019 を使っています
>
> パソコン上でエクセルファイルを1つだけ開いて
> 2つ目以降は開けないように出来ないでしょうか

なぜ「2つ目以降は開けないように」したいのか、そうすることの目的や理由
をなるべく詳しく書くと、「それはできないけど目的を果たすにはこうしたら
どうか?」というような代案が出てくるかもしれません。

(出てこなかったらスミマセン)

引用返信 編集キー/
■103452 / inTopicNo.3)  Re[2]: Excelを開くのを1つだけ
□投稿者/ screen (7回)-(2024/11/26(Tue) 20:30:04)
No103451 (WebSurfer さん) に返信
> ■No103450 (screen さん) に返信

すみません分かりにくい表現をしてしまいました

C#でプログラムを作っているのですが
入力された文字列を
パソコン上で開いたエクセルのA列を検索して
合致したものがあればB列からP列までのデータを取って来る
と言うものです

エクセルファイルはいくつもあるので開いたエクセルファイルのデータを
取りに行きたいのですが2つ以上開いているとうまく取りにいってくれません

そこで1つだけ開けられるようにしておけばいいのかなと思い聞いてみました

何かいい案があるますでしょうか
宜しくお願い致します
引用返信 編集キー/
■103453 / inTopicNo.4)  Re[3]: Excelを開くのを1つだけ
□投稿者/ kiku (448回)-(2024/11/27(Wed) 10:37:03)
No103452 (screen さん) に返信
> ■No103451 (WebSurfer さん) に返信
>>■No103450 (screen さん) に返信
> C#でプログラムを作っているのですが
作っているアプリはどんなアプリですか?
 ・Formアプリ
 ・WPFアプリ
 ・その他
フレームワークは何ですか?
 ・.NETFrameWork4.8
 ・.NET6
 ・.NET8
 ・その他

> エクセルファイルはいくつもあるので開いたエクセルファイルのデータを
> 取りに行きたいのですが2つ以上開いているとうまく取りにいってくれません

どのようなソースを書いて、
うまく取りにいけないのかを記述すると
ピンポイントで回答があるかもしれないです。

引用返信 編集キー/
■103456 / inTopicNo.5)  Re[3]: Excelを開くのを1つだけ
□投稿者/ 魔界の仮面弁士 (3814回)-(2024/11/27(Wed) 13:06:37)
No103452 (screen さん) に返信
> エクセルファイルはいくつもあるので開いたエクセルファイルのデータを
> 取りに行きたいのですが2つ以上開いているとうまく取りにいってくれません

対象のファイル名が分かっているなら、
 dynamic book = Microsoft.VisualBasic.Interaction.GetObject(xlsxFilePath);
で呼び出せる可能性があります。ただ、今回は望ましくないかな…。

それぞれの Excel が同一プロセスなら、Excel.Application オブジェクトの
Workbooks プロパティで、個々のワークブックにアクセスできます。

別プロセスで起動されている場合(特にオートメーション併用時)にも対応したい場合は、
ROT を辿れば、個々の Workbook オブジェクトにアクセスできるかと。
https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.comtypes.ibindctx.getrunningobjecttable?WT.mc_id=DT-MVP-8907&view=netframework-4.8.1

いずれも COM オブジェクトへのアクセスとなるので、ReleaseComObject を忘れずに。
引用返信 編集キー/
■103471 / inTopicNo.6)  Re[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);
}

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ