Mac の Excel VBA は色々と挙動が違うので、VBA で OS 判別する

最近 Mac で Excel VBA を書く機会があるのだが、Windows の Excel との挙動の違いが多くてつらい。

Excel for Mac のバージョンごとに改善していっているようだが、Excel for Mac 2016 (v15.41) 時点だとこんな感じ。

特に、最初に書いた Dir() 関数がまともに動かないというのは、Excel VBA でバッチ処理を作る際に致命的で、既存のマクロの修正を余儀なくされた。

Dir() 関数の代わりとなる、Mac 専用の VBA コードはあるので別途紹介するが、問題は「Windows でも Mac でも、処理の仕方は違えど、結果は同じにしたい」という時に、どうやって OS を判定して処理を分岐させるか、という点である。

調べてみると、Application.OperatingSystem が OS 名を返すので、コレを使うのが楽そうだった。

If Application.OperatingSystem Like "*Mac*" Then
  ' Mac 向けの処理
Else
  ' Windows 向けの処理
End If

例えば、環境に応じてパスの区切り文字が欲しい場合は、こんなコードが作れる。

Function detectPathSplitter() As String
  If Application.OperatingSystem Like "*Mac*" Then
    detectPathSplitter = "/"
  Else
    detectPathSplitter = Chr(92)  ' Backslash
  End If
End Function

バックスラッシュ \ をそのまま書かず、Chr(92) としているのは、Mac の VBEditor でマクロを保存すると、マクロ中に書かれたバックスラッシュが消えてしまうため。コメント内に書いてあるバックスラッシュまで消えてしまうので難儀だった。

それだけネックだったが、ひとまずは以前紹介した、Bash スクリプトの中で OS 判定するようなノリで判定できた。

そして、MacOS 版 Excel で Dir() 相当のことを行うコードは次の記事で。