質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

3回答

9661閲覧

PowerShellで複数プロセス起動している時のExcelを操作したい

kamikazelight

総合スコア305

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

3クリップ

投稿2018/09/06 23:57

編集2018/09/07 02:37

前提・実現したいこと

powershellでExcel操作の補助をしたいです。

Excelが複数プロセス起動している状態で
その中で最前面にあるExcelのcomオブジェクトか
全てのExcelのcomオブジェクトを取得したいです。
お願いします。

発生している問題・エラーメッセージ

最初に見つかったExcelのcomオブジェクトしか
取得できない

該当のソースコード

powershell

1 $Excel = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Excel.Application')

試したこと

powershell

1[Microsoft.VisualBasic.Interaction]::GetObject('', 'Excel.Application') -as [Microsoft.Office.Interop.Excel.ApplicationClass]

こちらも試してみましたが特定のExcelしか取得できないうえに
Excel起動してない時に勝手にプロセスが立ち上がってしまいました。

--追記--
sysjojo 様より教えて頂いた内容を確認してみましたが
実行出来ませんでした。
"1" 個の引数を指定して "GetObject" を呼び出し中に例外が発生しました: "ActiveX コンポーネントを作成できません。"

powershell

1[reflection.assembly]::LoadWithPartialName("'Microsoft.VisualBasic") 2$Processes = [Microsoft.VisualBasic.Interaction]::GetObject('Excel.Application') 3foreach($procxls in $Processes){ 4echo $procxls; 5}

実行環境

--追記--
Windows 10
Excel 2016 64bit

推定利用環境

--追記--
Windows 8 以降
Excel 2013以降 64bit 又は 32bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Running Object Tableからオブジェクトを取得する(例:開かれているExcelのブックの一覧を取得する) - Qiita

適当コードですが一例として。

なお、Running Object Tableの制限か自分の知識不足かわかりませんが、OneDrive上などネットワークから開いたブックは取得できません。

投稿2018/09/07 14:05

編集2018/09/08 00:24
imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2018/09/08 14:47

見るのが遅くなってしまいすみませんでした。 まだ実行確認は出来ていませんが 内容見る限り行けそうです。 ありがとうござうました。
guest

0

"Running Object Table" というキーワードで調査するとよいでしょう。

投稿2018/09/07 09:19

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2018/09/08 14:57

ありがとうございました。 また次もお願い致します。
guest

0

操作するところまでは確認していませんがこれでいかがですか。
[reflection.assembly]::LoadWithPartialName("'Microsoft.VisualBasic")
~~$Processes = [Microsoft.VisualBasic.Interaction]::GetObject('Excel.Application') ~~
foreach($procxls in $Processes){
echo $procxls;
}
試したこと、に記載されていたのを見落としていました。
また、確認時の手順が誤っていたので動かないコードを提示してしまいました。
重ね重ね失礼いたしました。

投稿2018/09/07 00:30

編集2018/09/07 02:43
sysjojo

総合スコア325

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamikazelight

2018/09/07 02:42 編集

すみません。 エラー表示が出て実行できませんでした。 他に読み込みが必要なものなどがあるのでしょうか? 実行環境を載せていなかったので追記しました。 --追記 GetObject('Excel.Application') のぶぶんですが GetObject('','Excel.Application') でしょうか?
sysjojo

2018/09/07 02:46

提示したコードを試す前に、 $Processes = Get-Process "Excel" で起動しているプロセスは取れるからいけるのでは?といろいろ弄っていたので上記コードがエラーになっていませんでした。 コードが誤っていました。失礼しました。
kamikazelight

2018/09/07 02:53

ありがとうございます。 プロセスからcomオブジェクトの取得とか 出来ないか 探してみます。
sysjojo

2018/09/07 03:09 編集

https://qiita.com/nukie_53/items/a3f5a313b3524f9261ca こちらのページに出来ていそうな感じで書かれていたので試してみたのですが、私の環境では実行するとGetObjectの度に新しいExcelのプロセスが上がっているように見えてご希望の動作ではないような気がしました。ファイルを開いているExcelのプロセスが無いとエラーになるので、既存のプロセスが関係してそうですが、ファイル名を予め指定しているのはご希望の動作とは違う気がしますし。 ご参考まで。
kamikazelight

2018/09/07 03:06

すみません これは確認済みなのですが 特定のExcelプロセスしか取得できませんでした。 ブック名が決まっていればいいのですが、決まっていないので [Microsoft.VisualBasic.Interaction]::GetObject($ブックの名前, '') や [System.Runtime.InteropServices.Marshal]::BindToMoniker($ブックの名前) も使えないです。
sysjojo

2018/09/07 03:10

参考にならず失礼しました。
sysjojo

2018/09/07 03:20

上記ページですが、$xlAppMarshalで起動中のプロセスの情報が取れてそうに思いますが使えないですか?変数に値が代入された後、 foreach ($wb in $xlAppMarshal.Workbooks) { echo $wb.name } のようなコードを入れるとブックの名前は取れました。
kamikazelight

2018/09/07 04:08 編集

ブックのプロセスが同じなら取得できます。 私が知りたいのはプロセスが分かれてしまっている時の取得方法です。 「Winキー + R」を押して ファイル名を指定して実行 の画面に 「excel /x」と打ち込むと新規プロセスでExcelを立ち上げることが出来ます。 その状態で$xlAppMarshal.Workbooks.Countを確認するとよくわかると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問