- ベストアンサー
Excel VBA 特定のWindowを前面に
VBAのShellコマンドでコンソールアプリケーションを起動し,その処理が終了してから(終了を待つのはWD.Tasks.Existsを使いました)そのアプリケーションで作成したcsvファイルを開いて処理するプログラムを作りました。 そのアプリケーションは,動いている間,Excelの背面にあるようで画面に表示されません。このアプリケーションが動いている間,それを最前面に表示させたいのですが,方法がありましたらお教えください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
以下のように引数にvbNormalFocusを指定してもだめですか? Shell "calc.exe", vbNormalFocus
その他の回答 (3)
- tsubu-yuki
- ベストアンサー率46% (179/386)
面白そうだったので少し考えて(遊んで)みました。 http://officetanaka.net/excel/vba/tips/tips61.htm を参考(ほぼパクり)させていただいております。 Sub Sample() Dim WD, task Set WD = CreateObject("Word.Application") Shell "notepad", vbNormalFocus ’ メモ帳起動 ' 無限ループします(中断はCTRL+PAUSE/BREAKキー) ExtCheck: n = 0 ' 判定用変数nを初期化 For Each task In WD.Tasks ' 起動中の全タスクを総ナメ ' メモ帳が起動していたら変数nに+1 If task.Visible = True And InStr(task.Name, "メモ帳") > 0 Then n = n + 1 End If Next If n > 0 Then ’ nが0を超えていたら(メモ帳が一つでも起動していたら) GoTo ExtCheck ' ExtCheckに飛ぶ(無限ループ開始) End If ' メモ帳が起動していなかったら、ループから解放 WD.Quit Set WD = Nothing MsgBox "終了" End Sub タスク名はタスクマネージャーで確認できるものを使います。 上記の場合、InStrを使っていますから、 「メモ帳」を含むタスクが起動していたら無限ループです。 タスク名が完全にわかるのであれば、InStrは不要です。 ご参考までに。
お礼
課題が見つかると,それを解決する方法を考えるのっておもしろいですよね。こちらの方法はすでにうまくいっています。今後ともよろしくお願いいたします。
- Prome_Lin
- ベストアンサー率42% (201/470)
申し訳ございません。 このサイト、「VBScript」のサイトでしたね。 私、勘違いをしていました。 私も、今、あちこちサイトをかなり探して、試したのですが、「VBA」では、「インターネットエクスプローラー」や「エクセル」限定なら、動くマクロはあったものの、どのソフトでも対応したマクロは、試してみても、ことごとく、ダメでした。 「インターネットエクスプローラー」や「エクセル」限定のマクロでも、ダメなものも多くあり、ガッカリしました。 ちょっと、疲れ果ててきたので、あきらめて、元のサイトにもどり、「VBScript」として「~.vbs」として保存し、試したところ、「Word(WINWORD.EXE)」でも「Outlook(OUTLOOK.EXE)」でも、はたまた、マクロソフトでなくても(私の試したのは「EmEditor.exe」)、立ち上がっているソフトが、前面にきました。 そこで相談なのですが、以下のプログラムを「~.vbs」として保存し、エクセルの「VBA」の方から、 Shell "WScript.exe ""D:\Programming\OK_04.vbs""" というように(もちろん、質問者の環境に合わせてください)、「~.vbs」を呼び出して頂けないでしょうか? Const strIEexe = "EmEditor.exe" Dim intProcID call ActiveIE sub ActiveIE() Dim objWshShell GetProcID(strIEexe) Set objWshShell = CreateObject("Wscript.Shell") objWshShell.AppActivate intProcID Set objWshShell = Nothing End Sub Function GetProcID(ProcessName) Dim Service Dim QfeSet Dim Qfe Set Service = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer Set QfeSet = Service.ExecQuery("Select * From Win32_Process Where Caption='"& ProcessName &"'") intProcID = 0 For Each Qfe in QfeSet intProcID = Qfe.ProcessId Exit For Next GetProcID = intProcID <> 0 End Function 1行目の「Const strIEexe = "EmEditor.exe"」の「EmEditor」の部分をご希望のソフトにしてみてください。 サイトのプログラムそのものをコピー&ペーストし、「EmEditor」のみ書き換えています。
お礼
時間ができたので,ここに来たところぴったりの回答を頂いていました。今回はそちらでやることにします。今後ともよろしくお願いいたします。
補足
いろいろ考えていただきありがとうございます。今ちょっと忙しくなってしまって時間がとれません。時間が取れた時点で試してみたいと思います。今しばらくお待ちください。
- Prome_Lin
- ベストアンサー率42% (201/470)
まず、こんなサイトを見つけました。 http://netwiz.jp/?p=513 一番下が、まとめたプログラムです(Activateしているだけ?)。 ただ、私がやるのでしたら、 Set w = CreateObject("WScript.Shell") w.SendKeys "%{Tab}" です。 もちろん、邪道ではありますが、エクセルとそのソフトしか動いていないのであれば、有効です。 「Alt+Tab」(「Alt」(「オルト」と読みます)キーを押しながら「Tab」キーを押す)は、起動しているソフトの切り替えですが、この場合は、2つだけで、3つ以上起動している場合は、最初に起動したソフトは対象外になります。 私は、仕事で、頻繁にこの「Alt+Tab」を使っています。 ちなみに、3つ以上の場合は、「Alt+Esc」だそうです(これは私は使わないので、覚えてませんでした)。「%{Esc}」
お礼
http://netwiz.jp/?p=513を見てみたのですが,プロセスIDを得るとことが,分かりません。GetProcIDの引数strIEexeのところです。タスクマネージャーで見るとexplorer.exeはありますが,strIEexeというのが見つかりません。ここでつまずいています。
補足
私はショートカット派なのでAlt+Tabは多用しています。ちなみに,Alt+Escは同じアプリの中の切り替え(例えば複数のマクロの編集の切り替え)にやはり多用しています。Alt+Tabの方法は名案だと思いますが,たくさんのアプリを起動しているのが常なので残念ながら使えません。最初に紹介いただいたURLの方法を検討してみます。
お礼
求めていることぴったりの回答でした。ありがとうございました。shellの引数にあったのですね。「実行中のtaskを前面に表示」ということだけ考えて,shellの使い方に頭が回りませんでした。おかげさまですっきりです。 これまで,Excelの裏で動いていたので,userは進行状況を知らずに待たされることになっていましたが,これを入れることで,コンソールアプリケーションの処理過程が見える様になりました。進行状況がわかるので,いらいら待つことがなくなりました。