DOBON.NET DOBON.NETプログラミング掲示板過去ログ

複数起動のExcel.Applicationの取得

環境/言語:[Excel 2000 VB.NET]
分類:[.NET]

きいぼーです。

以下のようなソースにて、
起動されているExcelのブック名及びシート名を取得してTextBoxに出す
プログラムを作成したのですが、
Excelが1つしか起動されていない場合は、全てのブック名・シート名が取得できるのですが、
複数Excelが起動されている場合は、
1つのExcelにて開いているブック・シートしか表示されません。

Excel.ApplicationをGetObjectで取得しているのですが、
他に何か方法があるのでしょうか?

すみませんが、ご存知の方お教えください。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Dim nloop, nloop2, nloop3 As Integer
Dim oLoop As Object
Dim oEx As Excel.Application
Dim oBook As Excel.Workbook
Dim oSheet As Excel.Worksheet

TextBox1.Clear()

oEx = GetObject(, "Excel.Application")

For nloop = 1 To oEx.Workbooks.Count
oBook = oEx.Workbooks(nloop)

For nloop2 = 1 To oBook.Worksheets.Count
oSheet = oBook.Worksheets(nloop2)
TextBox1.AppendText(oBook.Name & " : " & oSheet.Name & vbCrLf)
Next
Next
■No5405に返信(きいぼーさんの記事)

 きいぼーさん、こんばんは。深山と申します。

> Excelが1つしか起動されていない場合は、全てのブック名・シート名が取得できるのですが、
> 複数Excelが起動されている場合は、
> 1つのExcelにて開いているブック・シートしか表示されません。
>
> Excel.ApplicationをGetObjectで取得しているのですが、
> 他に何か方法があるのでしょうか?

 少し調べてみたのですけど、それらしいものを見つけることが出来ませんでした。
予め開いているワーク ブックが判っていれば取得できるようでしたが‥‥。

ウィンドウハンドルからOLEオブジェクトの取得をするには?
http://homepage1.nifty.com/MADIA/vb/vb_bbs/200311_03110028.html


 EnumWindows と GetWindowText を使ってウィンドウ タイトルを列挙してやれば
力技で判別できるかも知れません。
きいぼーです。

深山さんこんにちわ、
情報ありがとうございます。

私が行いたいのは、
開いているExcelブックから加工したいブックを選択し、
選択したブックに対し、アプリにてデータを吐き出したいのです。

やはり簡単には行かないようですね。

>  少し調べてみたのですけど、それらしいものを見つけることが出来ませんでした。
> 予め開いているワーク ブックが判っていれば取得できるようでしたが‥‥。
>
> ウィンドウハンドルからOLEオブジェクトの取得をするには?
> http://homepage1.nifty.com/MADIA/vb/vb_bbs/200311_03110028.html
>
>
>  EnumWindows と GetWindowText を使ってウィンドウ タイトルを列挙してやれば
> 力技で判別できるかも知れません。
今回は時間が無い為&社内のToolであるので、
運用で逃げようと思います。(Excelは1つしか起動しないようにしてもらい。)
今後のことも考えてこの件も突き止めようと思いますので、
一旦解決にしておきます。
解決済み!
下記ではだめでしょうか

Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click
Dim localByName As Process() = Process.GetProcessesByName("Excel") 'エクセル
Dim p As Process
'取得したExcelの プロセスID・プロセス名・ウィンドウのキャプション名を表示
For Each p In localByName
Console.WriteLine("{0} / {1} : {2}", p.Id, p.ProcessName, p.MainWindowTitle)
Next
End Sub

   http://www.bcap.co.jp/hanafusa/dotnet/App05.htm#Excel
きいぼーです。
花ちゃんさんありがとうございます。

> Private Sub Button4_Click(ByVal sender As System.Object, _
> ByVal e As System.EventArgs) Handles Button4.Click
> Dim localByName As Process() = Process.GetProcessesByName("Excel") 'エクセル
> Dim p As Process
> '取得したExcelの プロセスID・プロセス名・ウィンドウのキャプション名を表示
> For Each p In localByName
> Console.WriteLine("{0} / {1} : {2}", p.Id, p.ProcessName, p.MainWindowTitle)
> Next
> End Sub
試してみましたが、
Process.GetProcessesByName("Excel") 'エクセル
部分で、「プロセス パフォーマンス カウンタは無効にされているため、要求された情報を実行できません。」との例外が発生してしまいます。
何か立ち上げておく必要があるのでしょうか。。
> 部分で、「プロセス パフォーマンス カウンタは無効にされているため、要求された情報を実行できません。」との例外が発生してしまいます。
> 何か立ち上げておく必要があるのでしょうか。。

何も要りません。
一度、このコードだけのプログラムを試して見てください。

現在使用されているコードとの関係で(2重起動防止等)エラーが発生して
いるかもしれません。

念のため投稿したコードをペーストして試して見ましたが、Excelが起動されて
いなければなにも起こらずExcelを起動していると下記のように表示されます。
1716 / EXCEL : Microsoft Excel - Book1

エラーに関しては、WEBで エラーメッセージをキーワードに検索して見てください。
色々でてくるので心当たりの部分を見てください。(下記かも)
http://www.ubiquitous-media.com/support/mdle/mdle_admin_a.html?id=mdle_admin_f01#question_f1
きいぼーです。
環境について記載していませんでしたので、
OS Windows2000
.Netのバージョンは、2002です。

以上
2004/08/10(Tue) 20:26:27 編集(投稿者)
2004/08/10(Tue) 20:23:55 編集(投稿者)

<pre><pre>> OS Windows2000

なら http://support.microsoft.com/default.aspx?scid=kb;ja;436445 

一度、投稿したコードだけのプログラムを作って動作確認してみて下さい。
それでエラーが発生するようなら、上記MSの対策を実施してから再度確認
してみて下さい。
きいぼーです。

花ちゃんさん
返事が遅れましてすみません。

> 一度、このコードだけのプログラムを試して見てください。
職場の環境ではNGでした。
同じエラーが発生します。

職場のPCは、Windows2000でSP3が適用ですが、
許可されたパッチしか当てることができません。
教えていただいたレジストリをみたのですが、
キー自体がありませんでした。

自宅での環境で試した場合は、
問題なく
> 1716 / EXCEL : Microsoft Excel - Book1
のように表示されました。

パッチの許可を取るのも面倒なようですので、
他に方法は無いでしょうか?
■No5612に返信(きいぼーさんの記事)

 きいぼーさん、こんばんは。深山です。

> 教えていただいたレジストリをみたのですが、
> キー自体がありませんでした。

>> http://support.microsoft.com/default.aspx?scid=kb;ja;436445
のリンクにある http://support.microsoft.com/default.aspx?scid=kb;JA;248993 の内容は
試されてますでしょうか?
 パフォーマンスカウンタを無効にしてるレジストリは複数存在する可能性があります。
# 既に試されてるようでしたらすいませんm(__)m
きいぼーです。

深山さんレスありがとうございます。

しかしながら、
キーの検索をかけても存在しませんでした。
詳しい状況や目的がはっきり解らないので何ですが?
まず、最初に取得した分のExcelのBookはファイルのパスが取得できるので
変数にでも控えておき、シート名を取得後、一時そのExcelを終了させれば
次のExcelが取得できるかと思いますが、起動しておく必要があるなら
保存しておいたパスから、全シート名を取得後起動するのでだめでしょうか

又、シート名の取得が目的ならExcelを起動せずとも取得したいファイル名
(フルパス)が解れば、ADO 等で取得できます。
(ファイル名の取得はエクスプローラからドラッグ&ドロップで複数取得
してもいいし、他にも色々方法があります)
きいぼーです。
花ちゃんさんすみません。

> 詳しい状況や目的がはっきり解らないので何ですが?
> まず、最初に取得した分のExcelのBookはファイルのパスが取得できるので
> 変数にでも控えておき、シート名を取得後、一時そのExcelを終了させれば
> 次のExcelが取得できるかと思いますが、起動しておく必要があるなら
> 保存しておいたパスから、全シート名を取得後起動するのでだめでしょうか
以前にも書いてはいたのですが、
やりたいことを整理しますと、
Excelで資料作成中に本アプリにて作業中のExcelシートに対し、
データベースからのデータ貼り付けなどの作業を行いたいのです。
そのために起動しているExcelブックの一覧を出して選択させたいのです。

しかし、社内用Toolであるために一旦解決済みにしておき後日解決させたいと
思います。

深山さん、花ちゃんさん、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板