顯示具有 VB 標籤的文章。 顯示所有文章
顯示具有 VB 標籤的文章。 顯示所有文章

2009年12月18日 星期五

改造 Taglocity 3.0 Tag Bar (3) ---- 即時更新

改造 Taglocity 3.0 Tag Bar (2) ---- 反映標籤狀態, 只能做到『一次性』的反映標籤狀態。接下來, 要加入『即時更新』的功能。

以下方法各有優缺點, 也不確定是否適合每個人的使用情境, 所以重點放在優缺點的討論 :

.

即時更新 Tag Bar 來 反映標籤狀態

『即時更新』可以用『定時重複執行』或是『觸發執行』來實現,

  • Outlook VBA 並沒有原生的『定時重複執行』功能, 不過 rockman 在 outlookcode.com (2004-12-07) 提出用 user32 函式庫的 SetTimer 和 KillTimer 的方法, 也提到『必須注意有可能當機』

2) If you don't deactivate the timer when the application closes it will likely crash

  • 實作上, 將 Timer 設定成 1~2 秒就夠用了

.

方法

優缺點

定時執行 SetTimer (User32)

@ 前提 : 對 VB 有相當的把握
O 優點 :
  • 只需要一個觸發條件
X 缺點 :
  • 開啟 Outlook 會有巨集警告
  • 容易當機 (Outlook 直接終止)
  • 和其他 Outlook 改造存在相容性的問題需要克服
事件觸發方式,
例如 : Catch all events on a folder (outlookcode.com)


(尚未實作)
O 優點
  • 使用 Outlook 本身的 VBA 功能
X 缺點 :
  • 開啟 Outlook 可能會有巨集警告
  • 必需找到適當的觸發方式, 可能要捕獲不只一個事件
以 AutoHotKey 觸發

@ 前提 :
需要有 AutoHotKey  經驗

O 優點
  • 容易增加判斷條件, 例如 : Outlook 是否為作用中的視窗 ……
X 缺點 :
  • 不是 Outlook 原生, 不見得容易移植

.

AutoHotKey 串連 Outlook 實現自動化

2009-10-10_170220

最後, 目前完成度最高的, 是『AutoHotKey 串連 Outlook』

  • 使用 AutoHotKey 的 SetTimer 來定時觸發
  • 檢查 Outlook 是否為作用中的視窗, 而且螢幕上有 TagBar
  • 使用 AutoHotKey COM Standard Library 來呼叫 反映標籤狀態 的 Outlook 函數, 也就是 COM_Invoke(poul, "updateTagBar")
	COM_Init()
poul := COM_CreateObject("Outlook.Application")
' ... (此處最好有容錯處理)
ol_func := COM_Invoke(poul, "updateTagBar")
' ... (此處最好有容錯處理)
COM_Release(ol_func)
COM_Release(poul)
COM_Term()


.



(...繼續閱讀.../...CONTINUE...)

2009年10月11日 星期日

改造 Taglocity 3.0 Tag Bar (2) ---- 反映標籤狀態

繼上一篇, 改造 Taglocity 3.0 Tag Bar (1) ---- 讓 按鈕文字 變清爽 之後。接下來, 要來看看如何讓『Tag Bar 反映標籤狀態』。

底下的 VBA 程式, 不論是 操作範圍 或 執行時機, 都比要前一篇來得複雜, 所以建議先熟悉 Outlook 的巨集運作, 再來實作。

 

(1) 按鈕文字變清爽

(2) 反映標籤狀態

操作範圍

輸入 : Tag Bar 的文字
輸出 : Tag Bar 的文字
輸入 : 當前的郵件標籤
輸出 : Tag Bar 的狀態

執行時機

只需要執行一次 需要重複執行

.


(...繼續閱讀.../...CONTINUE...)

2009年10月10日 星期六

改造 Taglocity 3.0 Tag Bar (1) ---- 讓 按鈕文字 變清爽

Taglocity 改版到 3.0 之後, Tag Bar 又變回類似 1.x 的模樣, 只是還是有一些美中不足。還好可以用 VBA 巨集來解決 ……

2009-10-08_1431493.0 版 TagBar 有顏色標示,
但是和 1.x 版的使用習慣無法銜接, 因為
不能反映標籤狀態, 顯示數字干擾視線
2009-02-16_220704
1.x 版 TagBar 有顏色標示,
可以反映目前郵件的標籤狀態 (橘色底色) 使用上很方便, 同時可以選擇是否顯示按鈕數字, 視覺上較清爽

.


(...繼續閱讀.../...CONTINUE...)

2009年10月8日 星期四

Outlook 相關郵件工具 ----『相關訊息』的 VBA 巨集

上一篇 提到, 在 Outlook 2007 可以手動將『進階尋找』增加到工具列。但是之前的嘗試, 卻無法找到『相關訊息』和『自寄件者郵件』來加到工具列。

其實, 這部份可以用 VB 巨集的方式來達成 ……

.

在 Outlook 工具列 增加『相關訊息』功能

建立『相關訊息』巨集

  1.  工具 - 巨集 - Visual Basic 編輯器  (或 快速鍵 Alt-F11)
  2. 找到左邊的 Microsoft Office Outlook – ThisOutlookSession 或是 插入一個 新模組
  3. 在模組右邊的編輯視窗輸入以下的程式碼
  4. 記得儲存 *.OTM 專案

(...繼續閱讀.../...CONTINUE...)

2008年11月15日 星期六

克服 Excel 2003 與 2007 文字方塊 的 VB 程式差異

雖然之前 就知道 Excel 2003/2007 的『文字方塊/Text Box』有一些 VB 程式差異需要克服, 但是直到最近才改寫程式克服這些問題。

繼續往下介紹之前, 先簡單講解一下這個 Excel 巨集的作用。

image
用 VB 巨集計算出文字大小、方位、顏色和外框等, 繪製在 Excel 裡面
2008-11-13_080315
搭配底圖, 就可以清楚標示電路板的零件資訊

這麼做的好處是 :

  • 可以依相要標示的屬性, 調整文字大小、方位、顏色等
  • 輸出成 *.pdf 之後, 可以很方便的搜尋文字。反之, 用一般 Layout 軟體輸出的 電路板 圖形, 通常都無法搜尋文字。

.

原本在 Excel 2003 運行無誤的巨集, 切換到 Excel 2007 之後卻無法正常執行。所以, 開始研究 Virtual PC, 希望可以切換使用 Office 2003 與 2007。

Virtual PC 2007 -- 微軟的免費好物 (2008-01-30),

  • 安裝 Office2007 之後, 另外建立一個 Office2003 的環境 ...

不過, 後來為了別的原因重裝電腦, 就又回到 Office 2003。

直到最近, 才又重新檢視『文字方塊/Text Box』的 VB 程式差異, 讓我的 Excel 巨集在 Excel 2003 與 2007 上都可以執行。

.

克服『文字方塊/Text Box』的 VB 程式差異

  • 判斷 Excel 版本

Application.Version = 11.0 是 Excel 2003, 而 12.0 則是 Excel 2007

.

  • 文字方塊』與『Text Box

同樣用 Shapes.AddLabel() 繪製出來的 文字方塊, .Name 屬性在 Excel 2003 被指定為 『Text Box ????』(流水號), 但在 Excel 2007 卻被指定為『文字方塊 ????

解決方法是改用 .Type = msoTextBox 來判斷是否為 文字方塊

.

  • 屬性的初始值不同

雖然, 明確設定初始值是寫程式時天經地義的守則, 但是 Excel 的繪圖物件往往有太多屬性, 以致很難在程式裡明確設定它們全部的值。

屬性名稱 Excel 2003 Excel 2007
自動調整文字方塊大小 (初始值都是不自動調整) .TextFrame.AutoSize = msoTrue .TextFrame.AutoSize = True
.TextFrame2.WordWrap = False
文字方塊背景顏色 預設無背景色 預設有背景色, 除非手動加上
.Fill.Visible = msoFalse
文字方塊框線 預設無框線

預設有框線, 除非手動加上 .Line.Visible = msoFalse

這邊要注意的是, 同一個屬性 .TextFrame.AutoSize 在 Excel 2003 的資料形態是 msoTrue, 但是在 Excel 2007 卻是 True

此外, 在 Excel 2003 可以先不指定文字方塊的寬與高, (即 .Shapes.AddLabel(橫書或直書, X0, Y0, W, H), 其中 W=0, H=0) 之後再設為自動調整文字方塊。但是 在 Excel 2007 一開始指定 寬/高 都等於 0 卻會導致 文字方塊被『隱藏』, 既使之後再改為自動調整文字方塊, 也還是繼續隱藏。

.

  • 橫書或直書參考點的處理方式不同
image
Excel 2003, 無論橫書或直書, 參考點都是左上角, 所以左上角的座標固定不變
image
Excel 2007, 橫書的參考點是左上角, 但是直書的參考點卻是右上角,
橫書 紅色123 的參考點是左上角, 但直書的 黑色456 和 綠色789 的參考點卻是右上角, 會看到左上角的座標會一直改變

.Shapes.AddLabel(橫書或直書, X0, Y0, W, H) 產生一個文字方塊繪圖物件, 再經過下列程式之後, 在 Excel 2003 和 2007 看到的左上角座標 (.Top 與 .Left) 會是不一樣的

If Application.Version >= 12# Then
    .TextFrame.AutoSize = True   ' office2007
    .TextFrame2.WordWrap = False ' office2007
Else
    .TextFrame.AutoSize = msoTrue   ' office2003
End If
.TextFrame.Characters.Text = A.Offset(0, 0)
.TextFrame.Characters.Font.Size = A.Offset(0, 4) * 2
If A.Offset(0, 3) = 1 Then            ' Rotate Font
    .TextFrame.Orientation = msoTextOrientationDownward
End If

解決方式是最後再重新指定一次左上角座標 (.Top 與 .Left) 的值

.Top = Y0
.Left = X0


(...繼續閱讀.../...CONTINUE...)

2008年6月27日 星期五

[Excel 巨集] Address 函數 -- 傳回『範圍參照』

自從 2008-02 提出『使用 EXCEL 巨集合併/比對/更新多種格式的通訊錄』的構想之後, 最近終於又有點進度。.... 只是, 還是處於準備的前期 ....

.

下面要介紹的 Excel VBA 巨集函數 "address", 不知道會不會常用, 所以, 我舉了一個例子。

簡單的說, "address" 巨集函數可以傳回『儲存格的參照』, 甚至可以組合成公式, 有點像工作表函數 INDIRECT 和 ADDRESS

一般的場合

  • 巨集程式將結果的值寫到儲存格,
  • 例如: 巨集程式將 A1 填為目前 B5 的值, 假設是 100
  • 看到 100 不會知道是在 B5 找到的, 而且以後也不會隨著 B5 變動

使用 "address" 巨集函數的場合

  • 巨集程式將結果以參照表示,
  • 例如: 巨集程式將 A1 填為 B5, 則知道巨集程式找到 B5 這個儲存格
  • 如果巨集程式進一步將 A1 填為 =B5, 則以後 A1 的值會跟著 B5 一起變動

.

  • 語法說明

expression.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)

expression 範圍物件 (單一儲存格 或 多個儲存格)
RowAbsolute True不填 : Row 部份為絕對參照,
False : 傳回相對參照
ColumnAbsolute True不填 : Column 部份為絕對參照,
False : 傳回相對參照
ReferenceStyle xlA1不填 : 傳回 A1 樣式的參照
xlR1C1 : 傳回 R1C1 樣式的參照
External True : 傳回外部參照
False不填 : 傳回區域參照
RelativeTo 1) 如果 RowAbsoluteColumnAbsoluteFalse,且 ReferenceStylexlR1C1,則必須加入相對參照的起始點。
2) 如果 ExternalTrue, 且沒有加入此參數會傳回 完整參照 (例如 : [Book1.xls]Sheet1!$A$1); 反之, 加入此參數則會視情形傳回 部份參照 (例如 : Sheet1!A1),

.

  • 範例程式

set A = Sheets("Sheet1").Cells(y1, x1)
set B = Sheets("Sheet2").Cells(y2, x2)
B = "=" & A.Address(False, False, , True, B)

.

至於我要怎麼使用, 這麼說好了, 我要來拿來建立『索引』(或『指標』)。用簡單的 = Sheet1!A1 將『資料儲存格』和『索引儲存格』串連起來, 再配合儲存格的 DirectDependents, Dependents, DirectPrecedents, Precedents 屬性 (儲存格計算的相依性, 翻譯為『參照』, 『前導參照』), 就可以查找『一對一』或是『一對多』的資料和索引。而且, 資料搬動時, Excel 會自動維持公式的連結, 就不用煩惱如何維護資料和索引的關係。

.


(...繼續閱讀.../...CONTINUE...)

2008年6月4日 星期三

我的 Excel 日記

前一陣子, 參考網路上別人用 Excel 寫日記的精神, 創造出我自己的格式。

image

以下只介紹我自己創造的部分, 其他請參考 Excel 日記

.

有別於『三維』(a), (b) 或『二維』(c) 的格式 (日期 再加上 二維九宫格分類 或 一維分類), 最後我使用『一維半』的方式, 記事集中在一大格(真的可以很大格), 再以小格分類 (還是有分類的作用), 而且整體寬度又不會太寬。

.

再加上一些公式和巨集, 寫起來就很順手囉~~

F~Q欄 (分類) 填上
> : 進行中
+ : 給自己的嘉獎 (加分項目)
- : 減分項目
@ : 重點項目

於 F~Q欄 手動加上顏色, 並使用自動篩選, 欄R 則是方便篩選之後看日期, 因為 欄A 在篩選之後就不見得都有日期。

欄R 的公式為
R2 =IF(ISNUMBER(A2),A2,OFFSET(R2,-1,0))

.

欄E 是自訂函數, 自動顯示勾選的分類
E2 =StrAdd($F$1:$Q$1,F2:Q2,E$1)

Function StrAdd(A0, B0, C0)
Set A = A0
Set B = B0
C = C0
Ans = ""
i = 1
For Each AA In A
BB = B(i)
If Len(BB) > 0 Then
If Len(Ans) > 0 Then Ans = Ans + C
Ans = Ans + AA
End If
i = i + 1
Next
StrAdd = Ans
End Function

.

按鈕 : 自動加入一行, 並複製公式

Private Sub cbNewLine_Click()
myNewLine
End Sub

Sub myNewLine()
Row1 = Selection(1).Row
Col1 = Selection(1).Column
Row2 = Row1
Col2 = Col1
For Each myCell In Selection
If myCell.Row < Row1 Then Row1 = myCell.Row
If myCell.Row > Row2 Then Row2 = myCell.Row
If myCell.Column < Col1 Then Col1 = myCell.Column
If myCell.Column > Col2 Then Col2 = myCell.Column
Next
If Row2 <> Row1 Then
MsgBox ("Please select one cell or one row !!")
Exit Sub
End If

Application.CutCopyMode = False
Rows(Row2 + 1).Insert Shift:=xlDown

For j = 1 To 26 ' 自動複製公式
If Left(Cells(Row2, j).Formula, 1) = "=" Then
Cells(Row2, j).Copy
Cells(Row2 + 1, j).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
End If
Next
Cells(Row2 + 1, Col2).Activate
End Sub

.

按鈕 : 自動將選取範圍依日期上色, 以方便辨識 (記得不要選手動上色的 F~Q欄, 不然顏色會被改掉)

Private Sub cbColor_Click()
DayColor
End Sub

Sub DayColor()

Set B = ActiveWindow.RangeSelection
For Each A In B

A.Select
With Selection.Interior
If TypeName(A.Value) = "Date" Then
wkday = Weekday(A.Value, 2)
ElseIf TypeName(A.Value) = "Double" Then
wkday = Round(A.Value * 10, 0) Mod 10
End If
Select Case wkday
Case 1
.ColorIndex = 40
.Pattern = xlSolid
Case 2
.ColorIndex = 36
.Pattern = xlSolid
Case 3
.ColorIndex = 35
.Pattern = xlSolid
Case 4
.ColorIndex = 34
.Pattern = xlSolid
Case 5
.ColorIndex = 37
.Pattern = xlSolid
Case 6
.ColorIndex = 39
.Pattern = xlSolid
Case Else
.ColorIndex = 38
.Pattern = xlSolid
End Select
End With
Next A
B.Select
End Sub

.

(...繼續閱讀.../...CONTINUE...)

2008年2月20日 星期三

[程式設計構想] 使用 EXCEL 巨集合併/比對/更新多種格式的通訊錄

在這個資訊時代, 我們將親友的連絡資料儲存在各種媒體

  • Outlook 等 郵件軟體 的 『連絡人』
  • EXCEL, WORD, 純文字, 或各種格式的檔案
  • SIM 卡 或 手機電話簿
  • PDA, 電子字典, 股票機 或 其他類似的電子產品

於是, 你可能有以下的困擾 :

  • 不確定每個地方的資料是否同步 ---- 雖然 PDA, 手機, 電子字典 ... 等, 大部份都有提供和電腦『同步連絡人』的方式, 但這些方式不見得都方便維護多種設備間的同步性, 除非這些資料全部都和 Outlook 的『連絡人』雙向同步。
  •  不確定如何合併/比對/更新資料 ---- 當你拿到更新的 EXCEL, WORD 等『連絡人』資料, (例如: 部門通訊錄, 或是同學會通訊錄), 該如何將這些資料合併/更新到 Outlook 或是 手機 呢? 還是真的只能逐筆『人工比對』呢?

.

一直沒有找到現成軟體可以解決這樣的問題, 所以找了一些資料, 準備開始將想了很久的構想, 寫成程式。

目前的準備資料 :

.

至於, 為何使用 EXCEL VB 巨集, 主要有以下原因

  • 不用另外安裝 VB, Visual C, 或 Delphi
  • 和 Outlook 的互動功能完整
  • 直接使用 EXCEL 表格, 不需要額外的資料庫
  • 如果, 真的寫出完整的功能, 則 EXCEL 表格將和 Outlook 連絡人同步, 就不定一要開 outlook 才能查資料, 另外, 也可以當成是備份。
  • 沒有使用 Outlook 時, 還是可以將通訊錄合併成 EXCEL 檔案,
    (如果使用 Outlook VB 巨集, 要回過頭來存取 EXCEL 表格, 反而不方便)

.


(...繼續閱讀.../...CONTINUE...)