Skip to content

Eschamali/TaskbarProgress_VBA

Repository files navigation

TaskbarProgress_VBA

VBAから、タスクバー拡張機能の以下の機能にアクセスするDLLファイルを提供します。マクロで、タスクバーに変化を持たせたいときにどうぞ。

DEMO

  • SetProgressState
  • SetProgressValue
シチュエーション例 動作イメージ
データ準備→処理中→終了 alt text
処理中→一時中断→再開 alt text
処理中→エラー→終了 alt text

タスクバー ボタンに表示される進行状況インジケーターの種類と状態を設定できます。

  • SetOverlayIcon
シチュエーション例 動作イメージ
検索中… alt text
ファイル移動中… alt text
処理中→エラー→終了 alt text

こんな感じで、ステータスの表現が可能です。
プログレスバーと合わせて表現すると良いと思います。

Features

  • DLLインポートにより、数行で手軽に進捗状況とステータスの表現が可能です。ユーザーフォーム作ってプログレスバーを埋め込んで、呼び出して… という手間が省けます。
  • ステータスに使えるアイコンソースファイルは、下記に対応しています
    • .icoファイル: 単独のアイコンファイル。
    • .exeファイル: 実行ファイル内に埋め込まれたリソースアイコン。
    • .dllファイル: DLL内に埋め込まれたリソースアイコン。

Requirement

以下で検証済みです。

  • Microsoft 365 Excel 64bit
  • Windows 10 , 11 64bit

タスクバーのプログレスバー自体は、Windows 7から実装されたものですが当本人、所有していないためWin 10未満のOSは、未検証です…
Office製品も同様です。

Load DLL

WindowsAPIの「LoadLibrary関数」を使って、読み込みます。

hDll = LoadLibrary("TaskbarProgress.dll")

実際に使う場合は、"Excelファイル(.xlsm)の存在するディレクトリ"というような動的な場所を設定する仕組みで読み込むことをおすすめします。

'動的にDLLを取得するためのWinAPI
Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr

Private Sub Workbook_Open()

    Dim hDll As LongPtr
    Dim sFolderPath As String
    
    'DLLファイルを保存するフォルダパスを設定
    sFolderPath = ThisWorkbook.Path
    
    'DLLファイルを読み込む
    hDll = LoadLibrary(sFolderPath & "\" & "TaskbarProgress.dll") 'DLLファイルフルパス

    debug.print hDll
End Sub

hDll の中身が、0 以外であれば読み込み、成功です。

Usage

使用する際はまず、このように定義します。Office 2010以降なら、32bit,64bit 共通で下記で読み込み可能です。

Declare PtrSafe Sub SetTaskbarProgress Lib "TaskbarProgress.dll" (ByVal hwnd As LongPtr, ByVal current As Long, ByVal maximum As Long, ByVal Status As Long)
Declare PtrSafe Sub SetTaskbarOverlayIcon Lib "TaskbarProgress.dll" (ByVal hwnd As LongPtr, ByVal dllPath As LongPtr, ByVal iconIndex As Long, ByVal description As LongPtr)

SetTaskbarProgress

サンプルコード

Sub TaskbarProgressTest()
    Dim hwnd As LongPtr
    Dim current As Long
    Dim maximum As Long
    Dim Status As Long
    
    ' ウィンドウハンドルを取得
    hwnd = Application.hwnd
    
    ' 進捗の設定
    current = 50
    maximum = 100
    Status = 2
    
    ' DLL関数の呼び出し
    SetTaskbarProgress hwnd, current, maximum, Status
End Sub

上記のサンプルを実行すると、このようになります。
alt text

引数の説明

名称 説明
hwnd 適用させるウィンドウハンドルを指定。
基本は、Application.hwnd を指定します。
current 現在の進捗値
maximum 最大(ゲージMax)とする値
Status プログレスバーの状態(0,1,2,4,8 のいずれか)

Status について

説明はこちらから引用しています

説明 イメージ
0 TBPF_NOPROGRESS
進行状況の表示を停止し、ボタンを通常の状態に戻します。
alt text
1 TBPF_INDETERMINATE
進行状況インジケーターのサイズは拡大しませんが、タスク バー ボタンの長さに沿って繰り返し循環します。
alt text
2 TBPF_NORMAL
進行状況インジケーターのサイズは、完了した操作の推定量に比例して左から右に大きくなります。
alt text
4 TBPF_ERROR
進行状況インジケーターが赤に変わり、進行状況をブロードキャストしているいずれかのウィンドウでエラーが発生したことを示します。
alt text
8 TBPF_PAUSED
進行状況インジケーターが黄色に変わり、進行状況は現在いずれかのウィンドウで停止されていますが、ユーザーが再開できることを示します。
alt text

SetTaskbarOverlayIcon

サンプルコード

Sub SetOverlayIconFromDLLExample()
    Dim hwnd As LongPtr
    Dim dllPath As String
    Dim iconIndex As Long
    Dim description As String
    
    ' ウィンドウハンドルを取得
    hwnd = Application.hwnd
    
    ' 任意のアイコンデータがあるフルパス(ico,dll,exe に対応)
    'dllPath = "C:\Program Files\Microsoft Office\root\Office16\XLICONS.EXE"
    dllPath = "C:\Windows\System32\shell32.dll"
    'dllPath = "C:\Users\user\Downloads\sample.ico"

    ' アイコンのインデックス(DLL,exe内のアイコン番号)
    iconIndex = 240
    
    ' アイコンの説明テキスト
    description = "Custom Icon from DLL"
    
    ' DLL関数を呼び出し、タスクバーにオーバーレイアイコンを設定
    SetTaskbarOverlayIcon hwnd, StrPtr(dllPath), iconIndex, StrPtr(description)
End Sub

上記のサンプルをWin 11で実行すると、このようになります。
alt text

引数の説明

名称 説明
hwnd 適用させるウィンドウハンドルを指定。
基本は、Application.hwnd を指定します。
dllPath 任意のアイコンデータがあるフルパス
文字列へのポインターを利用するため、StrPtrを経由する必要があります
iconIndex アイコンのインデックス(DLL,exe内のアイコン番号)
icoファイルの場合は、この設定を無視します。
description アクセシビリティ用の代替テキスト
文字列へのポインターを利用するため、StrPtrを経由する必要があります

なお、dllPath を省略したり、空文字、False で渡されると、ステータスアイコンを除去します。

Attention

DLL側の処理は、ある程度のエラー処理を施していますが、決して完璧ではありません。
そのため、DLLの関数を直接呼ぶのではなく、VBAの標準モジュール内のプロシージャを介して、呼び出すことを推奨します。最近のPCであれば、誤差レベルです。
また、Win32APIの文字列関係はほとんど文字列へのポインターによって取得されるため、毎度 StrPtr を記述するのは大変なので、プロシージャを介した作りにするといいでしょう。

About

VBAからWindows Taskbar ProgressBarの制御を行える拡張機能ファイル(.dll)です

Topics

Resources

License

Stars

Watchers

Forks