• ベストアンサー

Excel VBA 特定のWindowを前面に

VBAのShellコマンドでコンソールアプリケーションを起動し,その処理が終了してから(終了を待つのはWD.Tasks.Existsを使いました)そのアプリケーションで作成したcsvファイルを開いて処理するプログラムを作りました。 そのアプリケーションは,動いている間,Excelの背面にあるようで画面に表示されません。このアプリケーションが動いている間,それを最前面に表示させたいのですが,方法がありましたらお教えください。

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2015
  • ベストアンサー率49% (258/524)
回答No.3

以下のように引数にvbNormalFocusを指定してもだめですか? Shell "calc.exe", vbNormalFocus

furafurax
質問者

お礼

求めていることぴったりの回答でした。ありがとうございました。shellの引数にあったのですね。「実行中のtaskを前面に表示」ということだけ考えて,shellの使い方に頭が回りませんでした。おかげさまですっきりです。 これまで,Excelの裏で動いていたので,userは進行状況を知らずに待たされることになっていましたが,これを入れることで,コンソールアプリケーションの処理過程が見える様になりました。進行状況がわかるので,いらいら待つことがなくなりました。

その他の回答 (3)

回答No.4

面白そうだったので少し考えて(遊んで)みました。 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は不要です。 ご参考までに。

furafurax
質問者

お礼

課題が見つかると,それを解決する方法を考えるのっておもしろいですよね。こちらの方法はすでにうまくいっています。今後ともよろしくお願いいたします。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

申し訳ございません。 このサイト、「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」のみ書き換えています。

furafurax
質問者

お礼

時間ができたので,ここに来たところぴったりの回答を頂いていました。今回はそちらでやることにします。今後ともよろしくお願いいたします。

furafurax
質問者

補足

いろいろ考えていただきありがとうございます。今ちょっと忙しくなってしまって時間がとれません。時間が取れた時点で試してみたいと思います。今しばらくお待ちください。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.1

まず、こんなサイトを見つけました。 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}」

furafurax
質問者

お礼

http://netwiz.jp/?p=513を見てみたのですが,プロセスIDを得るとことが,分かりません。GetProcIDの引数strIEexeのところです。タスクマネージャーで見るとexplorer.exeはありますが,strIEexeというのが見つかりません。ここでつまずいています。

furafurax
質問者

補足

私はショートカット派なのでAlt+Tabは多用しています。ちなみに,Alt+Escは同じアプリの中の切り替え(例えば複数のマクロの編集の切り替え)にやはり多用しています。Alt+Tabの方法は名案だと思いますが,たくさんのアプリを起動しているのが常なので残念ながら使えません。最初に紹介いただいたURLの方法を検討してみます。

関連するQ&A

  • VBAで開いているフォルダーを最前面に表示

    Excel VBAで指定したフォルダーを開きたいのですが、 Shell "Explorer.exe "・・・を使用すると幾つもフォルダーが開きます。 フォルダーが開いているかのチェックはできるのですが、 後ろに隠れているフォルダーを最前面に表示する方法がわかりません。

  • [VBA] UserForm を Excel の Window の前面に表示させない方法

    Excel VBA において UserForm がデフォルトではワークシートの前面に 必ず表示されるのですが、ユーザーからどうしても邪魔だという要望があり、 対応せざるを得ない状況となってしまいました。 そこで、Excel ワークシートの Window の背面に持っていけるように するにはどのようにしたら良いでしょうか。 ワークシート上に UserForm で使っているボタンを設置するという代替案は ここでは除外させて下さい。 どなたかよろしくお願い致します。

  • VBAにてメッセージボックスを最前面に表示させる

    エクセルVBAにて、指定時刻になったらメッセージボックスを、最前面に表示させるプログラムを作成中です。 時刻の指定は、ontimeメソッドの使用でできました。 しかし、最前面(他のアプリケーションを開いていても、メッセージボックスが手前に表示される)がどうしてもできません。。 VBだとAPI関数を使って、フォームを常に最前面表示はできました。 メッセージボックスで、このような表示方法は実現可能なのでしょうか? どなたか教えて下さい。よろしくお願いします。

  • ウインドウの最前面表示

    指定された日時になると、メッセージウインドウを表示するソフトを作成中ですが、そのウインドウのOnInitDialog()でShowWindow(SW_SHOW)をコールしても、その時に起動しているアプリケーションによっては、最前面に表示されません。(エクスプローラやIEの前面には表示されるが、VC++では背面に表示されます。) アプリケーションによっては無理なのでしょうか? (警告ウインドウとしても使用したいので、最前面に表示したいのですが...。) 環境  WindowsXP  Visual C++6.0

  • 指定したアプリケーションをモニターの画面の最前面に出したい。

    お世話になります。 C++6.0 MFCで開発しております。 今、 (1)A.exeのボタンを押すとB.exeを起動 (2)B.exeが終了するとA.exeに終了通知をして、A.exeに処理を戻す。 処理をしているのですが、 (2)のA.exeに処理を戻した後、A.exeが最前面に表示されないのです。 A.exe以外にも、Wordやその他のアプリケーションを開いていた場合、 (2)の時点で、モニター上には、A.exeが最前面に表示したいのですが、 Wordやその他のアプリケーションが最前面に表示されます。 お手数ですが、どのようにすれば、他のアプリと同時起動している際に、 A.exeをモニターの最前面に表示できるか教えていただきたく思います。 以上よろしくお願いします。

  • フォームウィンドウを最前面に表示したい(ACCESS)

    ACCESS VBAを使っています。 あるタイミングで、あるフォームを表示させたいのです。 OpenFormを使ってみると、確かにフォームを開くことはできたのですが、実際は既に表示されているWindowの背面に開かれているので、目で確認することはできないのです。 新しいフォームを最前面に表示するにはどのようにしたらよいのでしょうか?

  • VBAで指定したブックを前面に表示するには

    ブックAとブックBがあります。 ブックAのマクロの途中、InputBoxでブックBのセルを選択させて 処理終了後に再びブックAを前面に表示するには どうしたら良いでしょうか? 下記コードを実行したところ、 ブックBが前面になって終了してしまいます。 InputBoxの挙動が関係している気がするのですが、原因がわかりませんでした。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー Sub テスト() '※このマクロはブックAに書かれてます Dim rng As Range On Error Resume Next Set rng = Application.InputBox( _ Prompt:="ブックBのセルを選択してください。", _ Type:=8) On Error GoTo 0 If rng Is Nothing Then Exit Sub '~ '~ ここで処理をする '~ MsgBox "処理完了" ThisWorkbook.Activate 'ここでブックAを前面に出したい End Sub ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー ExcelはOffice365(バージョン 1902)です。 よろしくお願いします。

  • エクセルVBAのボタン操作について

    sheet1にコマンドボタン(CommandButton1)を貼り付けて sheet2にもコマンドボタン(CommandButton1)を貼り付けています。 sheet1のコマンドボタンを押すとVBAで処理をして sheet2を表示後 自動的にsheet2のコマンドボタンにかかれたVBAの処理をしたいのですがうまくいきません。 教えてください。 環境windows2000 office 2000 sheet1のボタンの最後 Sheets("2").Select ActiveSheet.Shapes("CommandButton1").Select でうまくいきません。

  • VBScriptからEXCELのVBAコマンドを実行するには?

    VBScriptからEXCELのVBAコマンドを実行するにはどうしたら良いでしょう? 例) Set P_OBJEXCEL = CreateObject("Excel.Application") ※ここで EXCEL VBA の Chdir "N:\"を行いたい W_INFILE = P_OBJEXCEL.Application.GetOpenFilename("EXCEL(*csv),*.csv",,"入力ファイル") P_OBJEXCEL.Application.Quit 環境→EXCEL2000+Windows2000+IE6 目的→入力ファイルを取得ため、N:\配下をGetOpenFileNameにて開きたい ※EXCELのデフォルトパスを変更したくないため 何かヒントを御願いします

  • EXCEL VBA で他のアプリケーションを開く方法について

    EXCEL VBAで他のアプリケーションを開く方法について教えていただきたいことがあります。 現在開いているエクセルのブックと同じフォルダにある、"AAA"という名称のsqc形式のファイル(EAST社のSkyLink Ver9.0のコマンドファイルです)をVBAで開く。 SHELL関数で開くと思っていたのですが、 Sub Test() Dim MyPath As String, MyTask As Double MyPath = ActiveWorkbook.Path & "\" MyTask = Shell(MyPath & "AAA.sqc") SendKeys "%FO", True End Sub とすると 「プロシージャの呼び出し、または引数が不正です」 というメッセージが出てしまいます。 如何せんSHELL関数を使うのが初めてでして、色々調べても どうしても解決策にたどり着きません。 どうぞよろしくお願いいたします。

専門家に質問してみよう