Excel VBAメモ Windows APIを使わずに今開いているウィンドウのタイトルを取得してみる

必要になったので。
あるところで仕入れたら、Windows APIを使わんでもできるそうな。

ポイントはこれに限るかも。

  • Word.Applicationでタスクリストを取得する
    ※Excelなどには実装されてないらしい…

んで、コード。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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プロシージャ)はこんな感じ。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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

実行したら、こんな感じ。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
スタート
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の実装が変わるか分からんで、永久に使えるかは分かんないけどね…。
んまま、明日の自分へのメモってことで。