OSのバージョンを調べる


不特定多数の人が使用するようなマクロでは、そのマクロが実行される環境を配慮する必要があります。たとえば、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プロパティで取得できます。こちらの方が、はるかに簡単でしたね。