社内では様々なバージョンのExcelが存在しています。Excelのバージョンを調べてそれぞれ処理を変えたいです。簡単にできるかと思いきや手間がかかりましたので、記録に残します。
Excel2016以降のバージョンを知りたい
Excelバージョン2016以降は2019, 2021, 365があります。この4つのバージョンをVBAで調べようと思い最初に使用したのがこのVBA関数です。
Application.Version
結果がこちら
Excelバージョン | 結果 |
365 | 16 |
2021 | 16 |
2019 | 16 |
2016 | 16 |
全部一緒かーーーい!!!これではどのバージョンを使用しているのかわかりません。この後レジストリの中など確認したのですが、よけい混乱してわからなくなってしまいました。
Excel関数でバージョンを確認する
VBAで判定は難しそうだったので、Excel関数の方でできないか考えました。Excelバージョンによって使用できる関数が違いますのでその違いを利用してバージョンを取得します。
Excel 2019 判定用関数
まずお好きなセル(今回はA1からA4)にExcel関数を書きます。A1には
=IFS(TRUE,0,FALSE,1)
IFS関数を書きます。この関数はExcel2019から使用できる関数です。この関数が動かないなら2016以前と判定できます。
Excel 2021 判定用関数
A2セルには以下のように記載します。
=XLOOKUP(A100,B100:B110,C100:C110)
XLOOKUP関数を使用します。引数の値は適当です。この関数は2021から動作します。この関数が動くなら2021以降となります。
Excel 365 判定関数
A3セルには以下のように記載します。
=TEXTSPLIT(A4,",")
A4セルには
aa,aa
といれておきます。TEXTSPLIT関数は365でのみ動作します。ですのでこの関数が動いていれば365となります。ちなみに結果はスピルされるので以下の画像のようになります。スピル覚えないといけませんね。
関数まとめ
関数はIFS、XLOOKUP、TEXTSPLITに限らずそれぞれのバージョンで動く関数であればなんでも大丈夫です。
Excelバージョン | このバージョン以降動作する関数 |
365 | TEXTSPLIT |
2021 | XLOOKUP |
2019 | IFS |
2016 | ー |
関数が動かないExcelで開くとどうなるか?
では2016でこのExcelを開くとどんな結果が返ってくるでしょうか?画面表示は上記エクセル画面と変わりありませんが、計算式に異変が生じていました。
{=_xlfn.IFS(TRUE,0,FALSE,1)}
{=_xlfn.XLOOKUP(A100,B100:B110,C100:C110)}
{=_xlfn.TEXTSPLIT(A4,",")}
計算式に「_xlfn.」という謎の接頭辞が表示されます。古いバージョンのエクセルで動かすことができない新しい関数がある場合、この接頭辞がつくようです。
そこでこの仕組みを利用することを思いつきました。
VBAでこのバージョンの違いを調べる時にこの「_xlfn」を利用したいと思います。対象のセルにこの「_xlfn」が存在していればその関数を動かすことができないということのなので、それを判定フラグに利用します。以下はソースです。
ExcelVersion = "365"
'365 or 2021以下
ExcelVersion = IIf(InStr(Range("A3").Formula, "_xlfn.") > 0, 2021, ExcelVersion)
'2021 or 2019以下
ExcelVersion = IIf(InStr(Range("A2").Formula, "_xlfn.") > 0, 2019, ExcelVersion)
'2019 or 2016以下
ExcelVersion = IIf(InStr(Range("A1").Formula, "_xlfn.") > 0, 2016, ExcelVersion)
MsgBox "あなたのExcelのバージョンは" & ExcelVersion & "です。"
まとめ
・VBAではExcelのバージョンがわからない。
・Excel関数を使用できるかできないかでバージョンの違いを調べることができる。
2016、2019のサポートは2025年10月までです。2021は2026年10月までです。この3つを使用しているExcelは最終的に365にアップグレードしないといけないのかなぁと思っていましたらなんと2024が発表されました!サポート期間は5年です。
2024のApplication.Versionも16なんでしょうか…
コメント