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