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

VBA

必要になったので。
あるところで仕入れたら、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

あと、メソッドを呼ぶためのメソッドっぽいの(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

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

スタート
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の実装が変わるか分からんで、永久に使えるかは分かんないけどね…。
んまま、明日の自分へのメモってことで。