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

1 意見:

發表您的回應
  1. 通達人 提到...

    看來挺好用的,目前的工作還用不到。

張貼留言