Microsoft Office 2010 VBA 的 Application 物件有蟲蟲嗎?
當使用 VBA 開發程式時,通常我們會把一些共用的功能寫到 Module 或寫成 Class 讓整系列的 Office 的 Application 成員都可以用。
例如要取得當下應用程式名稱,以及版本號、組建編號時我們會從 Application 這個物件下手,它是提供這些資訊的主要來源。
可是有些不太合理的事發生了,以下是我用 Office 2010 的觀察結果:
-
Application.Name 屬性:
- Outlook 沒有傳回 Microsoft 這個字樣。
- 其他的 Office 產品都有加上 Microsoft 字樣。
-
Application.Version 屬性:
- Outlook 傳回的是 Major、Minor、Revision、Build 的字串(14.0.0.6109)。
- 其餘都只傳回 Major 和 Minor(14.0)。
-
Application.Build 屬性:
- Word 傳回的字串包括了 Major、Minor 及 Build,但無 Revision 。
- 其餘都只傳回 Build,但 PowerPoint 是用 String 傳回,其他是用 Long 傳回。
- Outlook 無 Build 屬性。
- 做個列表如下:
Application.Name | Application.Version | Application.Build | |
Word | Microsoft Word | 14.0 | 14.0.6024(String) |
Excel | Microsoft Excel | 14.0 | 6106(Long) |
PowerPoint | Microsoft PowerPoint | 14.0 | 6026(String) |
Publisher | Microsoft Publisher | 14.0 | 6026(Long) |
OutLook | Outlook(它沒有 Microsoft 字樣 ) | 14.0.0.6109(它附加了 Build 且有 Revision 號碼) | ---無 Build 屬性--- |
Access | Microsoft Access | 14.0 | 6024(Long) |
附圖為證:
因此有必要寫一個函式用在所有 Office 2010 產品下並用它來取得版本相關的資訊。
程式碼如下:
Function GetOfficeVersion() As String
On Error Resume Next '---預防讀取 Outlook 的 Build 時出錯---
'---取得 Office 是 64 or 32 位元版本---
#If Win64 Then
bit = "64"
#Else
bit = "32"
#End If
'---從 Application 物件取出相關資訊---
pName = Replace(Application.Name, "Microsoft ", "", 1, 1)
pMajor = CLng(Split(Application.Version, ".")(0))
pMinor = CLng(Split(Application.Version, ".")(1))
pRevision = CLng(Split(Application.Version, ".")(2))
If IsEmpty(pRevision) Then pRevision = 0
pBuild = CLng(Split(Application.Version, ".")(3)) '---若為 Outlook 從這裡取得 Build---
If pBuild = 0 Then '------------------------------------若非 Outlook 從這裡取得 Build---
pBuild = CStr(Application.Build)
If InStr(pBuild, ".") Then '------------若內含小數點則取最右端小數點後的數據---
pBuild = Right(pBuild, InStrRev(pBuild, ".") - 1)
End If
End If
ver = pMajor & "." & pMinor & "." & pRevision & "." & pBuild
GetOfficeVersion = pName & " (v" & ver & ") " & bit & "bit"
End Function
在各種 Office 產品下測試看看:
? GetOfficeVersion
Word (v14.0.0.6024) 64bit
? GetOfficeVersion
Excel (v14.0.0.6106) 64bit
? GetOfficeVersion
PowerPoint (v14.0.0.6026) 64bit
? GetOfficeVersion
Publisher (v14.0.0.6026) 64bit
? GetOfficeVersion
Outlook (v14.0.0.6109) 64bit
? GetOfficeVersion
Access (v14.0.0.6024) 64bit
? GetOfficeVersion
Visio (v14.0.0.6106) 64bit