繼上一篇, 改造 Taglocity 3.0 Tag Bar (1) ---- 讓 按鈕文字 變清爽 之後。接下來, 要來看看如何讓『Tag Bar 反映標籤狀態』。
底下的 VBA 程式, 不論是 操作範圍 或 執行時機, 都比要前一篇來得複雜, 所以建議先熟悉 Outlook 的巨集運作, 再來實作。
(1) 按鈕文字變清爽 | (2) 反映標籤狀態 | |
操作範圍 | 輸入 : Tag Bar 的文字 輸出 : Tag Bar 的文字 | 輸入 : 當前的郵件標籤 輸出 : Tag Bar 的狀態 |
執行時機 | 只需要執行一次 | 需要重複執行 |
.
讓 Taglocity 3.0 Tag Bar 反映標籤狀態
為了彈性和容易除錯, 把程式碼拆成幾個部份
- 第一部份 ---- updateTagBar()
- 查出目前 Outlook 的視窗狀況, 只對郵件列表 (Explorer) 作處理, 因為此時才有 Tag Bar。將來如果需要, 可以擴充到單篇郵件 (Inspector)。
- 將多封郵件的標籤連結在一個字串裡
- 呼叫第二部份
- 第二部份 ---- syncTagBar("標籤字串")
- 確認輸入參數為字串, 以避免意外錯誤
- 如果 Tag Bar 可見 (.Visible=True) 才繼續往下
- 取出 .DescriptionText (如果不是空字串), 否則取出 .Caption
** 這是上一篇的伏筆, 因為按鈕文字 (.Caption) 經過處理之後, 可能會和標籤兜不起來, 所以上一篇先將資訊存在平常用不到內部說明欄位 (.DescriptionText) - 移除 按鈕文字開頭的 &2. 或是 12. 等數字, 這樣不管 Tag Bar 有沒有經過『清爽化』的處理, 都可以反映標籤狀態
- 根據標籤, 將按鈕的 .State 欄位設為 msoButtonDown 或 msoButtonUp
實作出來就像這樣, 橘色底色反映標籤狀態
光是以上的程式, 只能做到『一次性』的反映標籤狀態。
雖然有幾種不同的方式可以實現『定時重複執行』或是『觸發執行』, 但各有優缺點, 就留待下一篇再來詳細說明囉。
.
Public Sub updateTagBar()
Dim oSel, oItem As Object
mailTags = ""
Select Case TypeName(Application.ActiveWindow)
Case "Explorer"
Set oSel = Application.ActiveExplorer.Selection
For i = 1 To oSel.Count
Set oItem = oSel.Item(i)
mailTags = mailTags + ", " + oItem.Categories
Next
Case Else
Exit Sub
End Select
syncTagBar (mailTags)
End Sub
Sub syncTagBar(ByRef oInput As Variant)
On Error GoTo ErrorHandler
Select Case TypeName(oInput)
Case "String"
mailTags = oInput
Case Else
mailTags = ""
End Select
Set myTagBar = Application.ActiveExplorer.CommandBars.Item("Taglocity 3.0 Tag Bar")
If Not myTagBar.Visible Then Exit Sub
For i = 1 To myTagBar.Controls.Count
With myTagBar.Controls.Item(i)
If Len(.DescriptionText) > 0 Then
btnTag = .DescriptionText
Else
btnTag = .Caption
End If
' /-- Begin of optional section
c = Left(btnTag, 1)
If InStr(1, "&123456789", c) > 0 Then
p = InStr(1, btnTag, ". ")
If (p > 0) And (p <= 3) Then btnTag = Mid(btnTag, p + 2, 100)
End If
If Left(btnTag, 1) = " " Then btnTag = Mid(btnTag, 2, 100)
' \-- End of optional section
If (Len(mailTags) > 0) And (InStr(1, mailTags, btnTag) > 0) Then
.State = msoButtonDown
Else
.State = msoButtonUp
End If
End With
Next
ErrorHandler:
End Sub
.
0 意見:
發表您的回應張貼留言