【Excel VBA】VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する

【Excel VBA】VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する

VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する

この記事では、Microsoft Office 上の全てのVBA環境で利用可能な「MakeToastNotification」というユーザー定義関数を紹介します。

この関数を標準モジュール等に追加すると、Windowsオペレーティングシステムで一般的に利用されている以下のようなトースト通知をタスクトレイに簡単に表示できます。

【Excel VBA】VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する


このトースト通知は、Windowsオペレーティングシステムで用いられる以下のような特徴を持った通知形式の一つで、ユーザーに重要な情報やアクションを伝えるため、画面右下で焼きあがったトーストのようにせり上がって表示される小さな通知メッセージです。

項番 特徴 説明
1 表示時間 トースト通知は通常、一定の表示時間が設定されており、一定期間表示された後に自動的にフェードアウトします。表示時間は通知の種類や重要度によって異なる場合があります。
2 直感的な操作 トースト通知は、ユーザーがそれに対して直感的な操作を行えるように設計されています。通知内にはボタンやリンクが含まれている場合があり、ユーザーはそれらをクリックして関連アクションを実行できます。
3 カスタマイズ可能性 アプリケーションやシステムは、トースト通知の外観や動作をカスタマイズすることができます。通知のデザイン、テキスト、アイコン、音声などを自由に変更することができます。
4 非侵略性 トースト通知はデスクトップ上の一角に表示されるため、ユーザーの作業を邪魔することなく重要な情報を伝えることができます。通知が表示された場合でも、ユーザーは通常の作業を継続することができます。


このトースト通知はデスクトップ上で他の作業をしている最中でも表示されるため、ユーザーに注意を促すことができ、アプリケーションやシステムからの重要なイベントや更新情報、新着メッセージ、アラームなどの通知によく使用されています。

このトースト通知についての公式情報は必要に応じて「トースト通知」から確認できます。

この情報が読者の皆様のお役に立てることを願っています。

【Excel VBA】VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する
しらかば堂

この関数は、2023年5月22日午前11:54 の
りゅうりゅう@VBAer×ココナラPRO認定(@blacklist_ryu)
さんの以下の投稿を元に、これを一般化、関数化して作成したものです。

【Excel VBA】VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する
しらかば堂

この記事の投降後、2023年5月25日午後02:01に
根元 亮治@ルートアシスト(@rootassist)
さんから @relu さんによる、以下のスニペット(プログラムコードの断片や部分です。通常、再利用可能なコード片として使用され、特定の機能や処理を実行するために他のコードに組み込まれます)記事を紹介頂きましたので併せてご紹介しておきます。
この記事中で直接反映できませんがトースト通知恐るべしです。

解決できること

この関数を標準モジュール等に追加すると、VBAツールの実行状況を1行のステートメントでタスクトレイに簡単にトースト通知できます。

読んでほしい方

VBAでツールの開発をしている方、ツール開発にスマートなユーザーインターフェースを取り入れたい方には必見の内容です。

MakeToastNotification関数 の紹介

説明

この「MakeToastNotification」関数は、Windowsのタスクトレイにトースト通知するための関数です。

但し Windows の設定で通知がOFF設定になっているとトースト通知が表示されないので

Windowsの「スタート」メニューから、歯車アイコンを選択し

設定 > システム > 通知とアクション

を順に選び、通知とアクション セクションの中で、通知の設定が オン になっていることを確認してください。

【Excel VBA】VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する

参照オブジェクト

このユーザー定義関数を利用するための参照オブジェクトはありません。

利用例

例えば VBAコードの中で以下のように


Sub Test_MakeToastNotification()
    
    Call MakeToastNotification("状況連絡", "処理1が終了しました。")
    
    Call MakeToastNotification("状況連絡", "処理2が終了しました。")
    
End Sub


記述すると、画面右下のWindowsのタスクトレイにそれぞれ

【Excel VBA】VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する
【Excel VBA】VBAの処理状況をPowerShell経由でタスクトレイにトースト通知する


といったトースト通知が表示されます。

引数

属性 入力条件 意味
タイトル 文字型 必須 トースト通知のタイトルとなる文字列を””で囲んだ文字列で指定します。
テキスト 文字型 必須 トースト通知の本文となる文字列を””で囲んだ文字列で指定します。

戻り値

意味
0 正常終了
1 異常終了

VBAコード

MakeToastNotification

このVBA関数は、Windowsのタスクトレイにトースト通知を送信するための関数で、最後にこの関数の戻り値として成功コード0を返します。

Function MakeToastNotification(ByVal msg_title As String, ByVal msg_text As String) As Integer
    
    ' 成功コードと失敗コードを定数として設定する
    Const C_SUCCESS As Integer = 0
    Const C_FAILURE As Integer = 1
    
    Dim cmd As String
    
    ' PowerShellコマンドの一部を定数として設定する
    Const C_CMD1 = "powershell -Command ""Add-Type -AssemblyName System.Windows.Forms;" & _
                   "$toast = New-Object System.Windows.Forms.NotifyIcon;" & _
                   "$toast.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'); " & _
                   "$toast.BalloonTipTitle = '"
    
    Const C_CMD2 = "'; " & _
                   "$toast.BalloonTipText = '"
    
    Const C_CMD3 = "'; " & _
                   "$toast.Visible = $True; " & _
                   "$toast.ShowBalloonTip(0)"""
    
    ' PowerShellコマンドを構築する
    cmd = C_CMD1 & msg_title & C_CMD2 & msg_text & C_CMD3
    
    ' PowerShellスクリプトを実行する
    Call VBA.Shell(cmd, vbHide)
    
    ' 成功コードを返す
    MakeToastNotification = C_SUCCESS
    
End Function

MakeToastNotificationの簡単な説明

行番号 説明
1 関数名と関数の戻り値の型(Integer:整数型)、値参照型の入力パラメータmsg_titlemsg_text の名前、型(String:文字列型)を定義しています。
3-5 このプログラムの中で利用する定数C_SUCCESS(0:成功)、C_FAILURE(1:失敗)を定義しています。ここでは29行目でこの関数の戻り値が 成功であることが明確にわかるように定数定義しています。
7-20

PowerShellに渡すコマンド文字列格納用変数 cmd、およびこのコマンドのうち固定パターンとして決まっている文字列パターン C_CMD1、C_CMD2、C_CMD3 を定数定義しています。

22-23 入力パラメータ msg_title、msg_text と文字列パターン C_CMD1、C_CMD2、C_CMD3 を使ってPowerShellに渡すコマンド文字列 cmd を組み立てています。
25-26 cmdを引数として PowerShell スクリプトを実行します。
28-31 この関数の戻り値に C_SUCCESS(0:成功) を設定して関数を終わります。

Powershell 部分の詳細説明

ユーザーとしてこのMakeToastNotificationを使う際にはブラックボックスとして知る必要はないのですが、ご参考に23行目で組み上がったPowerShellに渡すコマンド文字列 cmd の中身にも触れておきましょう。

ステートメント 説明
powershell -Command PowerShellを実行するためのコマンドで、実際に実行するコマンドを””で囲みます。
また””の間で更に”という文字を使用するときは””などの表現でエスケープ表現を使います。
Add-Type -AssemblyName System.Windows.Forms; System.Windows.Formsアセンブリを追加します。これにより、Windowsフォームの機能を使用できるようになります。
$toast = New-Object System.Windows.Forms.NotifyIcon;

NotifyIconオブジェクトを作成します。これはタスクトレイのアイコンを表します。

$toast.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon
(‘C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe’);

PowerShellのアイコンを設定します。ExtractAssociatedIconメソッドを使用して、指定されたパスに関連付けられたアイコンを取得します。
$toast.BalloonTipTitle = ‘%msg_title%’; トースト通知のタイトルを設定します。先ほど定義したmsg_title変数の値が使われます。
$toast.BalloonTipText = ‘%msg_text%’; トースト通知の本文を設定します。先ほど定義したmsg_text変数の値が使われます。
$toast.Visible = $True; NotifyIconを可視化します。
$toast.ShowBalloonTip(0) トースト通知をタスクトレイに表示します。引数の0は通知が表示される時間を指定します。0を指定すると通知が自動的に閉じるまで表示されます。

まとめ

この記事では、Microsoft Office 上の全てのVBA環境で利用可能な「MakeToastNotification」というユーザー定義関数を紹介しました。

この関数を標準モジュール等に追加すると、Windowsオペレーティングシステムで一般的に利用されているトースト通知を簡単に表示できます。

この情報が読者の皆様のお役に立てることを願っています。

ライブラリ一覧