Excel VBA プラットフォーム（OS）判定

# はじめに

Excel（VBA）が動作するプラットフォーム（OS）として、大きく `Windows`と`Mac`の 2つがあります。
また、`Windows`の中でも、32ビット版と64ビット版のExcelが選べます。

`Windows`と`Mac`では、OS依存のAPIはまったく異なりますし、パスの区切り文字も異なります。

- `Windows` バックスラッシュ`\`（円マーク）
- `Mac` スラッシュ`/`

動作システムのパスの区切り文字は、プラットフォーム（OS）を判定せずとも、<br>[`Application.PathSeparator`](https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.pathseparator)で取得できます。

<br>しかし、プラットフォーム（OS）の判定が必要になるだろう、次のような場面が想定されます。
- 現在実行しているプラットフォームを判定して、使用するAPIを切り分ける<br>（32ビット版と64ビット版、WindowsとMac、など）
- 前提にしているプラットフォーム以外の環境で動作させれた場合に、エラーメッセージを表示する（Sorry for this platform not supported）
- etc

そのような場合の、プラットフォーム（OS）の判定方法をまとめます。



# `#If`文による処理の切り分け

Excel VBA にも [`#If`文](https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/ifthenelse-directive)が用意されています。

Mac / Win16 / Win32 / Win64 を判定できます。
（コンパイル時の条件らしいが、本当ですかね？）

:::note warn
64ビット版でも`"Win32"`の定数が定義されているため、
Win64 → Win32 → Win16 の順に判定する必要がある。
:::

```vb
Sub Test01()
#If Mac Then
    Debug.Print "Mac"
#ElseIf Win64 Then
    Debug.Print "Win64"
#ElseIf Win32 Then
    Debug.Print "Win32"
#ElseIf Win16 Then
    Debug.Print "Win16"
#Else
    Debug.Print "unknown"
#End If
End Sub
```

<br>VBAのバージョン（ VBA6 / VBA7 ）も判定できます。

:::note warn
VB7版でも`"VB6"`の定数が定義されているため、VB7 → VB6 の順に判定する必要がある。
:::

```vb
Sub Test03()
#If VBA7 Then
    Debug.Print "VBA7"
#ElseIf VBA6 Then
    Debug.Print "VBA6"
#End If
End Sub
```




# [`Application.OperatingSystem`](https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.operatingsystem)による判定

OSのシステム情報のような内容が取得できます。
`"Windows"`、`"Mac"`の文字列を含むようなので、実行時にOSの判定に使えます。

```vb
Sub Test02()
    If Application.OperatingSystem Like "*Win*" Then
        'for Windows
    ElseIf Application.OperatingSystem Like "*Mac*" Then
        'for Mac
    Else
        'unknown
    End If
End Sub
```


# 取得例

実際に取得した結果は、以下のとおりです。

- Windows 11 Pro 23H2 OSビルド 22631.3880
Microsoft® Excel® for Microsoft 365 MSO (バージョン 2406 ビルド 16.0.17726.20078) 64ビット 

![scrw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/765bae07-bdcb-90e0-ae27-ed9c0d16f168.png)


以下の打ち消し線の文章は、判定する順番に誤りがあったためです。
`#If`は安心して使えます。（訂正してお詫びいたします）

:::note warn
~~64ビットOSで、Excelも64ビット版ですが、なぜか`"Win32"`と判定されました。互換性のためでしょうか?~~
:::

~~VB6 / VB7 の判定を追加して再度実行すると、結果が先ほどとは違って、`"Win64"`になりました??（えっ!）~~
~~`"Win64"`なら`"VB7"`になるはずですが、`#If`怪しすぎです!!!~~


~~（`#If`より`Application.OperatingSystem`の方が信用できそう?）~~

<br>　
_Windows10の32ビット版が周りに無いので、WindowsOSの32ビット版と64ビット版を`Application.OperatingSystem`で判定できるのか、確かめられません。_

<br>　



- M1 Mac Sonoma バージョン14.5（23F79）
Microsoft® Excel for Mac バージョン 16.86（24060916)

<img width="400" alt="scr os-path.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/daf08e82-820f-72da-e710-1821f88b60ab.png" />

~~↑スクショにありませんが、このMacでも`"VB6"`となりました。~~

判定する順番を正したところ、`"VB7"`となりました。<br>　


- Intel Mac Monterey 12.6（21G115）

<img width="370" alt="scrrr.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/b4311844-c589-7d0e-2b17-ad92f6bb8e6b.png" />

ARM / Intel を判別できます。
_Windowsでも将来 ARM / Intel を判別できるようになるのでしょうかね。_


# 公式情報


https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/64-bit-visual-basic-for-applications-overview#writing-code-that-works-on-both-office-2010-32-bit-or-64-bit-and-previous-versions-of-office

↑ 公式サイトに VB7とVB6の両方で動作させるコードの書き方として、次のコードが紹介されています。

`"Win64"`は、OSではく、Officeの64ビット判定と書いてあります。
ですが、Declare文の64ビット対応は`"VBA7"`で判定していますね・・・

```vb
#if Vba7 then 
'  Code is running in the new VBA7 editor 
     #if Win64 then 
     '  Code is running in 64-bit version of Microsoft Office 
     #else 
     '  Code is running in 32-bit version of Microsoft Office 
     #end if 
#else 
' Code is running in VBA version 6 or earlier 
#end if 
 
#If Vba7 Then 
Declare PtrSafe Sub...
#Else 
Declare Sub...
#EndIf
```

**以上**