必要になったので。
あるところで仕入れたら、Windows APIを使わんでもできるそうな。
ポイントはこれに限るかも。
- Word.Applicationでタスクリストを取得する
※Excelなどには実装されてないらしい…
んで、コード。
Public Function GetProcessNames(ByRef objProcesses As Collection)
' Wordアプリケーションオブジェクトを生成する
Dim objWord As Object
Set objWordProcess = CreateObject("Word.Application")
' タスクリストから表示中のものだけ取得する
Dim objTask As Object
For Each objTask In objWordProcess.Tasks
' continueが使えないのでDo-Loopで回避する
Do
' 非表示のプロセスはスキップする
If objTask.Visible = False Then
Exit Do
End If
' プロセス名を出力引数に追加する
objProcesses.Add objTask.Name
Loop While False
Next
' オブジェクトを破棄する
Set objWord = Nothing
End Function
Public Function GetProcessNames(ByRef objProcesses As Collection)
' Wordアプリケーションオブジェクトを生成する
Dim objWord As Object
Set objWordProcess = CreateObject("Word.Application")
' タスクリストから表示中のものだけ取得する
Dim objTask As Object
For Each objTask In objWordProcess.Tasks
' continueが使えないのでDo-Loopで回避する
Do
' 非表示のプロセスはスキップする
If objTask.Visible = False Then
Exit Do
End If
' プロセス名を出力引数に追加する
objProcesses.Add objTask.Name
Loop While False
Next
' オブジェクトを破棄する
Set objWord = Nothing
End Function
Public Function GetProcessNames(ByRef objProcesses As Collection) ' Wordアプリケーションオブジェクトを生成する Dim objWord As Object Set objWordProcess = CreateObject("Word.Application") ' タスクリストから表示中のものだけ取得する Dim objTask As Object For Each objTask In objWordProcess.Tasks ' continueが使えないのでDo-Loopで回避する Do ' 非表示のプロセスはスキップする If objTask.Visible = False Then Exit Do End If ' プロセス名を出力引数に追加する objProcesses.Add objTask.Name Loop While False Next ' オブジェクトを破棄する Set objWord = Nothing End Function
あと、メソッドを呼ぶためのメソッドっぽいの(VBAでいうSubプロシージャ)はこんな感じ。
Public Sub DoFunction()
' ウィンドウタイトルのリストを生成する
Dim objProcesses As Collection
Set objProcesses = New Collection
' ウィンドウタイトルを取得する
Call GetProcessNames(strTitle, objProcesses)
' オブジェクトを破棄する
Set objProcesses = Nothing
' タイトルをイミディエイトウィンドウに表示する
Dim objName As Variant
objName = ""
For Each objName In objProcesses
Debug.Print objName
Next
End Sub
Public Sub DoFunction()
' ウィンドウタイトルのリストを生成する
Dim objProcesses As Collection
Set objProcesses = New Collection
' ウィンドウタイトルを取得する
Call GetProcessNames(strTitle, objProcesses)
' オブジェクトを破棄する
Set objProcesses = Nothing
' タイトルをイミディエイトウィンドウに表示する
Dim objName As Variant
objName = ""
For Each objName In objProcesses
Debug.Print objName
Next
End Sub
Public Sub DoFunction() ' ウィンドウタイトルのリストを生成する Dim objProcesses As Collection Set objProcesses = New Collection ' ウィンドウタイトルを取得する Call GetProcessNames(strTitle, objProcesses) ' オブジェクトを破棄する Set objProcesses = Nothing ' タイトルをイミディエイトウィンドウに表示する Dim objName As Variant objName = "" For Each objName In objProcesses Debug.Print objName Next End Sub
実行したら、こんな感じ。
スタート
Microsoft Visual Basic - プロセス.xls [実行中] - [ThisWorkbook (コード)]
Microsoft Visual Basic - Book2.xls - [Sheet1 (コード)]
Microsoft Excel - Book2.xls
Microsoft Excel - プロセス.xls
Skype? - xxx@hotmail.com
VBAメモ Windows APIを使わずに階層の深いフォルダーを作成してみる - Mozilla Firefox
Program Manager
スタート
Microsoft Visual Basic - プロセス.xls [実行中] - [ThisWorkbook (コード)]
Microsoft Visual Basic - Book2.xls - [Sheet1 (コード)]
Microsoft Excel - Book2.xls
Microsoft Excel - プロセス.xls
Skype? - xxx@hotmail.com
VBAメモ Windows APIを使わずに階層の深いフォルダーを作成してみる - Mozilla Firefox
Program Manager
スタート Microsoft Visual Basic - プロセス.xls [実行中] - [ThisWorkbook (コード)] Microsoft Visual Basic - Book2.xls - [Sheet1 (コード)] Microsoft Excel - Book2.xls Microsoft Excel - プロセス.xls Skype? - xxx@hotmail.com VBAメモ Windows APIを使わずに階層の深いフォルダーを作成してみる - Mozilla Firefox Program Manager
いつ、VBAの実装が変わるか分からんで、永久に使えるかは分かんないけどね…。
んまま、明日の自分へのメモってことで。