不特定多数の人が使用するようなマクロでは、そのマクロが実行される環境を配慮する必要があります。たとえば、Excelのバージョンによっては使用できないコマンドがあったり、引数が変更されていることもあります。マクロを実行しようとしているExcel(そのブックを開いているExcel)のバージョンを調べるには、ApplicationオブジェクトのVersionプロパティを使います。次のコードは、Excelのバージョンを表示します。
Sub Sample1()
MsgBox Application.Version
End Sub
Versionプロパティの返り値は次のようになります。
Excelの種類 Versionプロパティ Excel 2007 12.0 Excel 2003 11.0 Excel 2002 10.0 Excel 2000 9.0 Excel 97 8.0 Excel 95 7.0 Excel 5.0 5.0
Excel 2007はベータ版で確認しましたが、まず間違いないでしょう。
また、Versionプロパティの返り値は
文字列 ですので留意してください。たまに下記のようなコードを見ます。
Sub Sample2()
If Application.Version > 10 Then
MsgBox "OK"
Else
MsgBox "NG"
End If
End Sub
このとき「
本来Versionプロパティの返り値は文字列なのだけど、VBAは型キャストを自動的にやってくれるので、手を抜いて文字列と数値で比較させちゃえ 」と正確に認識していないのでしたら、次のように数値に変換してから比較することをお勧めします。こういうところで手を抜くと、Excelがバージョンアップしたときなどに『動かない..._| ̄|○』と慌てる原因になります。
Sub Sample2()
If CInt (Application.Version) > 10 Then
MsgBox "OK"
Else
MsgBox "NG"
End If
End Sub
さてさて、このようにVersionプロパティでExcelのバージョンを判定できるのですが、本稿のテーマは「OSのバージョンを調べる」でした。マクロによっては、Excelのバージョンだけでなく、OSの種類によっても動作が異なる場合があります。Windows XPでは動くけどWindows 98はエラーになる・・・というように。しかし残念ながらOSの種類を判定するコマンドはVBAにありません
(※1) 。APIで取得する方法もありますが、ここではWMI(Windows Management Instrumentation)を使った例をご紹介します。次のコードは、Windowsの種類とバージョン番号を表示します。
Sub Sample3()
Dim Locator, Service, OsSet, os, msg As String
Set Locator = CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer
Set OsSet = Service.ExecQuery("Select * From Win32_OperatingSystem")
For Each os In OsSet
msg = msg & os.Caption & vbCrLf
msg = msg & os.Version
Next os
MsgBox msg, vbInformation
Set Service = Nothing
Set OsSet = Nothing
Set Locator = Nothing
End Sub
(※1) 追記
失礼しました。ありました。忘れてました・・・
ApplicationオブジェクトのOperatingSystemプロパティで取得できます。
こちらの方が、はるかに簡単でしたね。