VBA との違い
Office スクリプトは、Excel on the web(ウェブ版 Excel)、Excel for Windows、Excel for Mac で動作するスクリプト機能です。
Office スクリプトも VBA も、Microsoft が開発した、Office 製品上で動作する自動化の仕組みであることに変わりはありません。
ただ、それぞれの言語の振る舞いや構文には大きな違いがあります。
ここでは以下のようなサンプルコードを使って、Office スクリプトと、デスクトップ版 Excel の VBA の違いを解説します。
タブを切り替えることで、それぞれの言語でほぼ同等の処理を見比べることができます。
Public Sub Cubed(ByVal target As Long) Dim calculated As Long calculated = target ^ 3
Debug.Print (calculated)End Sub
Public Function Squared(ByVal target As Long) Squared = target ^ 2End Functionfunction cubed(target: number) { const calculated = target ** 3;
console.log(calculated);}
function squared(target: number) { return target ** 2;}基本的な機能の違い
Section titled “基本的な機能の違い”プログラミング言語としての違いの前に、機能として異なる点をテーブルにまとめています。
| 項目 | VBA | Office スクリプト |
|---|---|---|
| 対応する Excel | デスクトップ版(Windows・Mac) | ウェブ版・Windows 版・Mac 版 |
| アクセスできる範囲 | PC 全体(Excel と同等の権限) | 対象のブックのみ |
| 権限の管理 | パスワード | アカウント |
| 共有 | 〇 | 〇 |
| 操作の記録 | 〇 | 〇 |
| 他ブックの操作 | 〇 | × |
| Power Automate からの実行 | × | 〇 |
| ライセンス | デスクトップ版 Excel に付属 | 対象の Microsoft 365 ライセンス |
※「Power Automate からの実行」はクラウドフローの場合です。Power Automate for desktop では、「Excel マクロの実行」アクションで VBA マクロを実行できます。
振る舞いや構文は異なりますが、Office サービス内のデータをプログラムを使って動的に制御するという目的は同じです。
Excel のセル上に定義する関数とは異なり、シート数やシートの行数・列数にとらわれずデータを制御することができます。
また、外部サービスとの連携(fetchによる外部呼び出し)や、Power Automate を介したほかのブック・サービスとの連携など、セル上の関数では難しい処理も実現できます。
実行環境について
Section titled “実行環境について”VBA はデスクトップ版 Excel を前提とした仕組みで、個々の PC 上で実行されます。Excel と同等の権限を持つため、PC 上のファイルや他のアプリケーションにもアクセスできます。
一方、Office スクリプトは クロスプラットフォームで共通の JavaScript ランタイム上で実行され、どの環境から実行しても同じように動作するよう設計されています。 アクセスできるのは対象のブックのみで、スクリプトを実行している PC にはアクセスできません。
また、Office スクリプトは Power Automate のフローから実行することもでき、Excel を開かずに、スケジュールやメールの受信などのトリガーをきっかけとしてブックを更新できます。
ベースとなる言語について
Section titled “ベースとなる言語について”オフィススクリプトは TypeScript をベースとしています。
また、TypeScript は JavaScript に静的型付け機能を追加した言語であり、型定義を除くと記述方法は JavaScript とほとんど同じになります。
言語としては VBA より Google Apps Script に近い
Section titled “言語としては VBA より Google Apps Script に近い”Google スプレッドシートのマクロ機能として利用できる Google Apps Script も JavaScript をベースとしています。
ブックやシートを操作する関数やメソッド名は違うものの、VBA よりは Google Apps Script に近いといえます。
JavaScript について
Section titled “JavaScript について”JavaScript は最も利用者の多い言語の 1 つとされており、ウェブブラウザ上で動作する言語です。
また、Node.js を活用してサーバー上で動作する言語としても活用されるケースが増えています。
ECMAScript と呼ばれる JavaScript の規格は毎年更新されていますが、Office スクリプトで使える TypeScript はバージョン 4.0.3 に固定されており、それ以降に追加された TypeScript の機能は使用できない点に注意が必要です。
とはいえ、JavaScript・TypeScript は Office スクリプトに限らず使用できる場面が多いため、学習して損することはないでしょう。
異なる点の具体例
Section titled “異なる点の具体例”ここからは、実際に Office スクリプトを使って、VBA との違いを説明していきます。
VBA では、返り値を持たない関数はSub、返り値を持つ関数はFunctionとして定義します。
Office スクリプトでは、返り値の有無にかかわらずfunctionを使って定義することができます。
' 返り値のある関数はFunctionを使うPublic Function Squared(ByVal target As Long) Squared = target ^ 2End Function
' 返り値のない関数はSubを使うPublic Sub Cubed(ByVal target As Long) Dim calculated As Long calculated = target ^ 3
Debug.Print (calculated)End Subfunction squared(target: number) { return target ** 2;}
// 返り値のない関数も同様function cubed(target: number) { const calculated = target ** 3;
console.log(calculated);}VBA では変数定義にDim、定数定義にConstを使用します。
Office スクリプトでは、変数定義にlet、定数定義にconstを使用します。
VBA では、配列の要素数を後から変更する場合に、動的配列として宣言したうえでReDimによる再定義が必要でしたが、Office スクリプトでは不要です。
' 変数の定義Dim count As Longcount = 1
' 変数に2を加算count = count + 2
' 配列の定義(要素数を後から変更する場合は、要素数を指定せずに宣言する)Dim fruits() As StringReDim fruits(0)
' 要素数に変更がある場合は、ReDimする必要がある(Preserveで既存の値を保持)ReDim Preserve fruits(1)fruits(1) = "リンゴ"// 変数の定義let count = 1;
// 変数に2を加算count += 2;
// 定義時に要素数を指定する必要はないconst fruits: string[] = [];
// 後からいくらでも配列内に追加可能fruits.push('リンゴ');if 文やループ処理
Section titled “if 文やループ処理”if 文、ループ処理については、それぞれ以下のページで解説しています。