執筆:EugeneAmnis
Excel VBA 内での OS 判定方法
Excel 2019 からライセンス体系が変わり、永続版のWindows版とMac版両方をインストールする事が可能になりました。また Office365 でも同じようにインストールが可能になっています。OS の垣根を越えてアプリが使えるようになるのは素晴らしい事ですが、 VBAプログラマーの悩みが増えることも事実です。
VBAをする方々は意欲的で堅実な人が多いように思います。自己学習しなければ身に付かないスキルですし、自身の仕事の効率化を上げる実質的な方法を選ぶ所がそのように捉える根拠に思えるのです。
そんな方々が多いと勝手に思うと最低でもMac版で異常終了は避けたいと思っている方もいると思います。今回は OS 判定方法をメインにやっていきますが、Mac版での各バージョンの違いを少し執筆していきます。あくまで一VBAプログラマーの意見としてお読みください。
OS 判定方法
If Not Application.OperatingSystem Like "*Mac*" Then
Windowsの処理
else
If val(Application.Version) < 15 Then
Excel2011 for Macの処理
else
#If MAC_OFFICE_VERSION >= 15 Then
Excel2016 for Mac以降の処理
#end if
end if
end if
Excel VBA は2003以降、職場以外ではほぼMac版を利用してきた為、Mac重視の判定方法になっていますが、基本は上記のものを利用しています。ただ、FormeCollector2 の VBAコードを見てもらうとわかりますが、MAC_OFFICE_VERSION がないものもあります。
なぜ一貫していないのかと問われると Excel2016 以前から開発をしていたコードと以降から開発したコードの違いです。Excel 2016 の VBA の変更は大変大きな負担となった為、少しでも工数を少なくする為にMicrosoft が推奨した MAC_OFFICE_VERSION を言われるがままに採用したのが本音です。
MAC_OFFICE_VERSION が無くても大きな問題は見られないのですが、また将来的な事を踏まえて更に念のためということです。
Excel2011 も切り捨てたい気持ちもありますが、手元にテスト機(完全なスタンドアローン)もありますし、現段階では潜在的なユーザー数が案外少なくないと思われるのでまだ残していくつもりです。
Excel2016 for Mac と Excel2019 for Mac の判定方法
少なくとも Excel2016 が出た当初と今の Excel2019 では処理速度は全く違いました。その為に CSVデータの取り込みなど重い処理では分岐させたいと判定方法を模索したのですが、VBA ではExcel2016 と Excel2019 の違いはわかりません。コアが同じなのかも知れませんがアップデートをしている Excel2016 は Excel2019 と同じ MAC_OFFICE_VERSION を返すようです。手元に Excel2016 がない為インターネット上の調査の結果ですが、スタートの番号は Excel2016 は 15 であり、Excel2019 は 16 だと予想はできるのですが。
ここに関してはアップデートしている Excel2016 の速度は Excel2019 と変わらないと仮説を立て、MAC_OFFICE_VERSION >= 16 で処理を分けることにしましたが、未だにしっくりこないところです。
手元に Excel2016 を残しておくべきだったのですがあまりの処理の遅さに開発する気を失い(Formeの処理には耐えれそうになかったので)、当面 Windows版のExcel と LINUX ユーザー向けに LibreOffice の開発をメインとしていました。しかし、Excel2019 の処理能力向上に感動して開発を再開しました。廻り道のお陰で裾野が広がった事にはあの遅い Excel2016 をリリースした Microsoft には感謝しています。