小さなクラスを作る(2)~他のアプリケーションの起動チェック

LotusNotesのメールをExcelVBAで自動作成するときは、そもそも自分のアカウントでNotesに接続していないといけない。

「でも、他のアプリケーションが起動しているかどうかなんて、どうやって判定できるんだろ?」とggっていてわりかしあっさりとたどり着いたのが、Office TANAKA「実行中のタスク一覧(非API)」という記事。

なるほどね~、と思ったので、即導入し、今に至る。

今回は、小さなクラスシリーズの一環として、ノーツが起動しているかどうか判定するクラスを作ってみた。需要があるのかどうかは分かりませんがw

f:id:akashi_keirin:20170305080556j:plain

クラスモジュールを挿入して、オブジェクト名を「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

意味もなく、引数にやたら長い文字列を持たせたことは、許してください。

f:id:akashi_keirin:20170305084024j:plain

Lotus Notesは職場のPCにしか入っていないので、自宅のPCで実行すると当然こうなる。

CreateObjectの引数をメソッドの引数として渡すようにしたら、汎用性が高まるのかな。

@akashi_keirin on Twitter