Corredor

ウェブ、プログラミングの勉強メモ。

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

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

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

  • Dir() 関数でファイル一覧をサクッと取得できない
    • Dir("/path/to/directory", MacID("XLSX")) とか Dir("/path/to/directory", vbDirectory) みたいにしないと何も返ってこない。また、Dir() を複数回呼んでのループ (同ディレクトリの複数ファイル取得) もできない
  • パスの区切り文字がバックスラッシュ \ ではなくスラッシュ /
  • VBEditor が重い・日本語入力できない
    • 日本語はコードやコメント中に含めない方が良いらしい。一応コピペすれば書けるが…
    • うまくスクロールしなかったり、とにかく苛立つ挙動

特に、最初に書いた 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 判定するようなノリで判定できた。

neos21.hatenablog.com

ひと目でわかるOffice 2016 for Mac

ひと目でわかるOffice 2016 for Mac