小さなクラスを作る(2)~他のアプリケーションの起動チェック
LotusNotesのメールをExcelVBAで自動作成するときは、そもそも自分のアカウントでNotesに接続していないといけない。
「でも、他のアプリケーションが起動しているかどうかなんて、どうやって判定できるんだろ?」とggっていてわりかしあっさりとたどり着いたのが、Office TANAKA「実行中のタスク一覧(非API)」という記事。
なるほどね~、と思ったので、即導入し、今に至る。
今回は、小さなクラスシリーズの一環として、ノーツが起動しているかどうか判定するクラスを作ってみた。需要があるのかどうかは分かりませんがw
クラスモジュールを挿入して、オブジェクト名を「NotesStartedChecker」とした。英語がおかしい気もするけど。
クラスモジュールに書いたコードは次の通り。
Option Explicit
'フィールド
Private isStarted_ As Boolean
'アクセサ
Public Property Get isStarted() As Boolean '……(1)
isStarted = isStarted_
End Property
'コンストラクタ
Private Sub Class_Initialize() '……(2)
isStarted_ = False
End Sub
'メソッド
Public Sub checkNotesIsStarted(ByVal alertMessage As String)
Dim objWord As Object '……(3)
Set objWord = CreateObject("Word.Application") '……(4)
If objWord.Tasks.Exists("Lotus Notes") = True Then '……(5)
isStarted_ = True '……(6)
'実行中タスクの中にLotus Notesがあれば、何もしない。
objWord.Quit '……(7)
Set objWord = Nothing '……(8)
Else
'実行中タスクの中にLotus Notesがなければ、メッセージを表示して終了
isStarted_ = False
MsgBox alertMessage, vbExclamation
objWord.Quit
Set objWord = Nothing
Exit Sub
End If
End Sub
例によってコードの解説。
- (1)はisStartedプロパティのgetter。Notesが起動しているかどうかを格納する。これぐらいしか持たせるプロパティが思いつかない。
- デフォルト値がFalseなので、(2)は不要だと思いますが、まあ、ないと寂しいのでw
- (3)でWordオブジェクト用の変数を用意する。CreateObjectを使うので、参照設定は不要。よって、不本意ながらObject型。
- (4)でWordのインスタンスを変数にセット。
- (5)がミソ。WordオブジェクトのTasksコレクションの中に、Lotus Notesが入っているかどうかをExistsメソッドで調べる。入っていたらTrueが返る。
- Tasksコレクションの中にLotus Notesが入っていたら、すなわち、Lotus Notesが起動中なら、(6)でisStarted_をTrueにする。
- Wordオブジェクトはもはや用済みなので、(7)で終了させて、
- (8)でオブジェクト変数を解放する。
- Lotus Notesが起動していない場合は、メッセージを表示する。
とまあ、こんな感じ。
標準モジュールに下記のコードを書いて実行してみよう。
Public nsc As NotesStartedChecker
Sub test02()
Set nsc = New NotesStartedChecker
Dim alertMessage As String
alertMessage = "Lotus Notesは起動していません。" & vbCrLf & _
" _________" & vbCrLf & _
" / \ " & vbCrLf & _
"/ /・\ /・\ \" & vbCrLf & _
"|  ̄ ̄  ̄ | ち~んw" & vbCrLf & _
"| (_人_) |" & vbCrLf & _
"| \ | |" & vbCrLf & _
"\ \_| /"
nsc.checkNotesIsStarted alertMessage
End Sub
意味もなく、引数にやたら長い文字列を持たせたことは、許してください。
Lotus Notesは職場のPCにしか入っていないので、自宅のPCで実行すると当然こうなる。
CreateObjectの引数をメソッドの引数として渡すようにしたら、汎用性が高まるのかな。