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()
を複数回呼んでのループ (同ディレクトリの複数ファイル取得) もできない
- パスの区切り文字がバックスラッシュ
\
ではなくスラッシュ/
- Excel for Mac 2011 まではコロン
:
区切りがメインだったみたい。ブックを開く時なんかはスラッシュでのパスを渡しても問題なかった - 参考 : Mac版とWindows版とでファイルパスのフォルダの区切り記号が違う - だるまのエクセルVBA
- 参考 : Select Folder with VBA/Macscript in Mac Office
- Excel for Mac 2011 まではコロン
- 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 判定するようなノリで判定できた。
そして、MacOS 版 Excel で Dir()
相当のことを行うコードは次の記事で。
- MacOS 版 Excel VBA で Dir() 関数の代わり・ファイル一覧を取得する
- 参考 : https://techa1008.com/rocket-note/2017/12/05/branch-mac-and-windows-with-vba/ … コレは ThisWorkbook.Path から区切り文字を取得して判別している。
- 参考 : Excel VBAでOSを判断することは出来ますか?Windows or Macなど。 -... - Yahoo!知恵袋