質問: VBAでAppActivateのエラー回避の方法 Dim hndl As String hndl "アクティブにするウィンドウ名" AppActivate hndl
回答: もしWordが入っていたら、WordのVBAの機能を流用して調べられます。 以下のコードを標準モジュールにコピペします。 Function ChkAppOpen(s_TitleParts As String) As Boolean Dim o_WrdApp As Object Dim o_WinItem As Object Dim s_Titles As String Set o_WrdApp = CreateObject("Word.Application") For Each o_WinItem In o_WrdApp.Tasks If o_WinItem.Visible = True And 1 < Len(o_WinItem.Name) Then If 1 < InStr(1, o_WinItem.Name, s_TitleParts, vbBinaryCompare) Then s_Titles = s_Titles & o_WinItem.Name Else End If End If Next o_WrdApp.Quit If 1 < Len(s_Titles) Then ChkAppOpen = True Else ChkAppOpen = False End If End Function で、例えば「メモ帳」という語句を含んでいるウィンドウが開いているかどうかを調べたいときは、もしメモ帳が開いていれば、 ChkAppOpen("メモ帳") とやると True が返ってきますし、 開いてなかったり、タイトルの指定を間違うと、 False が返ってきます。 なお、アルファベットの大文字小文字、半角全角は区別されますので、 例えば、 Microsoft Visual Basic - 新規Microsoft Excel ワークシート (2).xls [実行中] - [Module4 (コード)] というウィンドウが開いているかどうかを調べたいときに ChkAppOpen("Basic") は「True」になりますが、 ChkAppOpen("basic") は「True」になりますのでご注意ください。 あと、似たタイトルのウィンドウが複数開いている場合、その区別については、 ChkAppOpen("指定語句") の「指定語句」で違いを出して調べるしかありません。 より高度な区別をしたいときは、そうなるように、中身を書き換えます。 >ウィンドウがあった場合の処理 If ChkAppOpen("Basic") = True Then debug.Print "あるよ。今開いてるよ。なんかできるよ。" Else debug.Print "ないよ。開いてもいないよ。なんもせんどくね。" End If ちょっと遅いので、それが気に入らなかったり、 そもそもWordが入ってなかったら Win32APIなどを使ったほうがいいかしれません。