Excel VBAを複数バージョンで開発する際の注意点を完全解説!Office 2016〜Microsoft 365対応
生徒
「会社のパソコンはOffice 2016で、自宅はMicrosoft 365なんですが、VBAって同じように動きますか?」
先生
「基本は同じですが、いくつか気をつけないとエラーが出ることがあります」
生徒
「パソコン初心者でも分かるように教えてほしいです…」
先生
「大丈夫です。仕組みと注意点を順番に説明します」
1. Excel VBAはバージョンが違っても使えるのか
Excel VBAは、Office 2016、Office 2019、Microsoft 365のどれでも基本的な仕組みは同じです。そのため、簡単なマクロであれば、ほぼ同じように動作します。
ただし、細かい部分では違いがあり、これを知らないと「昨日まで動いていたのに今日はエラーが出る」という状況になります。
これは、同じ電池式のおもちゃでも、新しい電池と古い電池で動き方が少し変わるのと似ています。
2. Office 2016とMicrosoft 365の大きな違い
Office 2016は、インストールした時点の機能が基本となる買い切り型です。一方、Microsoft 365は常に更新されるサブスクリプション型です。
そのため、Microsoft 365では新しいExcel機能が追加されることがありますが、Office 2016では使えない場合があります。
VBAで新機能を前提にした処理を書くと、古いバージョンでは動かなくなる点に注意が必要です。
3. 複数バージョンで起きやすい代表的なトラブル
複数バージョン環境でよく起きるトラブルには、次のようなものがあります。
- 参照設定の違いによるコンパイルエラー
- Excel関数の対応差
- 32bit版と64bit版の違い
特に初心者の方は、コードが原因だと思い込みがちですが、実は環境の違いが原因というケースが非常に多いです。
4. 参照設定は最小限にする
Excel VBAでは「参照設定」によって追加機能を使いますが、複数バージョンで開発する場合は、できるだけ参照設定を増やさないことが大切です。
標準で使える機能だけを使えば、バージョン差によるエラーを減らせます。
Sub SimpleMessage()
MsgBox "どのバージョンでも動くVBAです"
End Sub
このようなシンプルなコードは、どのExcelバージョンでも安心して使えます。
5. 32bit版と64bit版の違いに注意
Officeには32bit版と64bit版があります。見た目は同じでも、内部の仕組みが少し違います。
特にWindows APIを使うVBAでは、64bit版でエラーが出ることがあります。
初心者のうちは、APIを使わないVBAを書くことで、トラブルを避けやすくなります。
6. Excel関数の違いをVBAで扱うとき
Microsoft 365では新しいExcel関数が追加されていますが、Office 2016では使えないことがあります。
VBAからワークシート関数を呼び出す場合も注意が必要です。
Sub SumSample()
Dim result As Double
result = WorksheetFunction.Sum(1, 2, 3)
MsgBox result
End Sub
このような基本的な関数であれば、どのバージョンでも問題なく使えます。
7. 開発環境は一番古いバージョンを基準にする
複数バージョンで使うVBAを作る場合は、一番古いExcelバージョンを基準に開発するのが安全です。
これは、古い道でも通れる車を選べば、新しい道路でも問題なく走れるという考え方です。
Office 2016で問題なく動けば、Microsoft 365でもほぼ確実に動きます。
8. 動作確認は必ず複数環境で行う
可能であれば、異なるExcelバージョンで動作確認を行いましょう。
難しい場合は、同僚や家族のパソコンを借りて確認するだけでも効果があります。
事前確認を行うことで、配布後のトラブルを大きく減らせます。
9. 初心者でも安心して開発するための心構え
Excel VBAは、環境の違いを理解すれば怖いものではありません。
難しい機能を無理に使わず、基本を大切にすることで、どのバージョンでも安定したマクロを作れます。
環境の違いは失敗ではなく、経験として積み上がっていきます。
まとめ
ここまで、Excel VBAをOffice 2016からMicrosoft 365までの複数バージョンで安全に運用するためのポイントを詳しく解説してきました。一見すると「VBAはどこでも同じ」と思われがちですが、実際には「買い切り版」と「サブスクリプション版」のアップデート頻度の違いや、OSのビット数の違いが実行時の挙動に大きな影響を与えます。
複数バージョン開発における重要なチェックリスト
開発したマクロが別のパソコンで動かないというトラブルを防ぐためには、以下の3つのポイントを常に意識することが重要です。
- 下位互換性の維持: 最新のMicrosoft 365だけで提供されている「動的配列」や「LET関数」などをVBAから呼び出す場合は、古いバージョンでエラーにならないか必ず確認が必要です。
- 参照設定のトラブル回避: 外部ライブラリを使用する際は、可能な限り「レイトバインディング(後記参照)」を利用し、環境に依存しないコード構成を目指しましょう。
- ビット数の壁: 64ビット版Officeが主流になりつつありますが、依然として32ビット版を利用している現場も多いです。API宣言が必要な場合は、条件付きコンパイルを活用して両対応させることが必須です。
実践的なサンプルコード:バージョンとビット数の判定
プログラムの中で、現在実行されているExcelのバージョンやビット数を判定し、適切な処理に分岐させる手法を紹介します。これにより、環境に合わせた柔軟なマクロの構築が可能になります。
Sub CheckEnvironment()
' Excelのバージョンを取得して判定する
Dim excelVer As Double
excelVer = Val(Application.Version)
Dim verName As String
Select Case excelVer
Case 16#
verName = "Office 2016 / 2019 / 2021 / 365"
Case Else
verName = "それ以前の古いバージョン"
End Select
' ビット数の判定(条件付きコンパイル)
Dim bitType As String
#If Win64 Then
bitType = "64ビット版"
#Else
bitType = "32ビット版"
#End If
MsgBox "現在の環境は以下の通りです。" & vbCrLf & _
"バージョン番号: " & excelVer & " (" & verName & ")" & vbCrLf & _
"ビット数: " & bitType
End Sub
上記のコードのように、Application.Versionを利用することで実行環境を特定できます。なお、Office 2016以降は内部的なバージョン番号がいずれも「16.0」となるため、より詳細なビルド番号が必要な場合は別のプロパティを参照する必要があります。
Office Scriptsへの移行を考える
最近では、Web版のExcelでも動作する「Office Scripts」を利用する機会も増えています。VBAはデスクトップ版で非常に強力ですが、クラウド共有を前提とする場合はTypeScriptベースのOffice Scriptsを検討するのも一つの手です。
function main(workbook: ExcelScript.Workbook) {
// セルA1に値を入力するシンプルなOffice Scripts
let sheet = workbook.getActiveWorksheet();
sheet.getRange("A1").setValue("Hello from Office Scripts");
// バージョンに依存せずWeb版でも動作するのがメリット
console.log("処理が完了しました。");
}
エラーを未然に防ぐ「レイトバインディング」の活用
「参照設定」でエラーが起きるのを防ぐには、以下のようにオブジェクトを生成する際に具体的なライブラリを指定しない方法が有効です。
Sub LateBindingSample()
' 参照設定を使わずにファイルシステムオブジェクトを操作する
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FolderExists("C:\Temp") Then
MsgBox "Tempフォルダが見つかりました。"
Else
MsgBox "フォルダが存在しません。"
End If
End Sub
この記述方法であれば、ユーザーのパソコンごとに「参照不可」というエラーが出てマクロが止まってしまうリスクを劇的に減らすことができます。特に不特定多数の人に配布するツールを作る際には、必須のテクニックと言えるでしょう。
結論として、複数バージョンでの開発は「最小公約数」を狙うのが鉄則です。新しい機能に魅力を感じても、配布先の環境を最優先に考え、シンプルな記述を心がけることで、メンテナンス性の高い優れたマクロを構築できるようになります。この記事が、皆さんのVBA開発における一助となれば幸いです。
生徒
先生、まとめを読んでよく分かりました!結局、一番安全なのは「一番古いバージョン」に合わせて作ることなんですね。
先生
その通りです。最新のMicrosoft 365は何でもできて便利ですが、古いExcel 2016を使っている人に渡すと、開いた瞬間に「コンパイルエラー」という怖い画面が出てしまうことがありますからね。
生徒
「レイトバインディング」という方法も紹介されていましたが、これは参照設定のチェックを外しておいても大丈夫という理解でいいですか?
先生
ええ。プログラムの実行時に「この機能を使いますよ」と探しに行く方法なので、環境によるズレを自動で吸収してくれるんです。開発中は入力候補が出ないというデメリットもありますが、配布用には最適ですよ。
生徒
なるほど。あと、ビット数の違いで「32ビット版では動くのに64ビット版では動かない」という話も驚きました。自分のパソコンだけで満足しちゃダメですね。
先生
そうですね。特にWindowsの深い部分を触るAPIなどを使わなければそこまで心配はいりませんが、一応「ビット数という壁がある」ということだけ覚えておけば、いざという時にすぐ原因に気づけますよ。
生徒
ありがとうございます!これからは、誰に渡しても「すごいね、便利だね!」って言ってもらえるような、エラーの出ないマクロ作りを目指します!
先生
その意気です。基本を大切にして、一歩ずつスキルアップしていきましょうね。