Python

【EXCEL】VBAからOffice Script へ変換【自動化】

Office Script とは

Office Script は ウェブ版 Excel(Excel on the Web)で動作するスクリプト言語です。

オンプレミス版における VBA マクロに相当します。

TypeScript で書かれており、VBA とは大幅に記法が異なりますが、Google Apps Script に慣れている方には取り扱い易い言語となっています。

VBA との違いに触れ、サンプルコードで遊びながら、Office スクリプトの使い方を理解していただけます。

VBA は Excel に限らず、Word や Access などでも使用することができますが、現時点で Office スクリプトは Excel 専用のスクリプト言語です。

プログラミング言語としての違いの前に、機能として異なる点をテーブルにまとめています。

項目VBAOffice スクリプト
実行環境個々のデバイス上クラウド上
権限の管理パスワードアカウント
共有
操作の記録
他ブックの操作×

VBAからOffice Script への移行

VBAからOffice Scriptへの移行は、Office製品の新しいバージョンやクラウドベースの環境に移行する際によく行われます。Office Scriptは、Office 365の一部として提供されるJavaScriptベースのマクロ言語です。VBAからOffice Scriptへの移行は、手作業で行う必要があります。

  1. VBAコードの理解:まず、現在のVBAコードベースをよく理解してください。どのような機能が実装されているか、どのようなオブジェクトやメソッドが使われているかを確認します。
  2. Office Scriptの学習:Office Scriptの基本構文や機能、サポートされているオブジェクトモデルを学習します。Microsoftのドキュメントやチュートリアルが役立ちます。
  3. コードのポート:VBAコードをOffice Scriptにポートします。基本的な構文は似ていますが、いくつかの違いがあるため、オブジェクトやメソッドの名前が異なる場合があります。また、Office Scriptでは非同期処理もサポートされているため、その点も考慮する必要があります。
  4. テストとデバッグ:Office Scriptに移行したコードをテストし、必要に応じてデバッグします。Office Scriptでのデバッグには、ブラウザの開発者ツールやOffice製品のデバッグ機能を利用できます。
  5. 最適化:移行後、コードの最適化を行い、効率的で保守しやすいコードベースを確立します。

移行プロセスは、アプリケーションやプロジェクトの規模によって異なりますが、これらの手順を順に実行することで効果的に移行を進めることができます。

移行の自動化

VBAコードをOffice Scriptに自動的に変換するツールやスクリプトは、一般的には提供されていません。VBAとOffice Scriptは異なる言語であり、それぞれの文法や構文が異なるため、自動変換には多くの課題があります。

ただし、いくつかのアプローチが考えられます。

  1. ツールの開発:VBAからOffice Scriptへの変換を自動化するための専用ツールを開発することが考えられます。このツールは、VBAコードを解析し、対応するOffice Scriptコードを生成するアルゴリズムを実装する必要があります。ただし、これはかなりの労力を要する可能性があります。
  2. パターンマッチングを利用したスクリプト:特定のVBAパターンをOffice Scriptパターンにマッチングし、変換するスクリプトを作成することが考えられます。ただし、これには多くのルールや例外処理が必要であり、完全に自動化することは難しい場合があります。
  3. 手動変換の支援:自動変換は困難であるため、手動変換を行う開発者を支援するツールやガイドを提供することも有効です。例えば、VBAコードをOffice Scriptに変換するためのベストプラクティスやテンプレートを提供し、開発者がそれを元に手動で変換することができます。

どのアプローチを選択しても大変だとは思いますが、今回はPythonを利用して簡単な自動変換プログラムを作ります。

変換プログラムの実装【Python】

VBAコードの基本的な構文をOffice Scriptに変換するPythonスクリプトを作成します。このスクリプトは、特定のVBAパターンをOffice Scriptパターンにマッチングし、変換することによって自動変換を試みます。

まず、Pythonの正規表現ライブラリを使ってVBAコードを解析し、特定のパターンに一致する部分を検出します。次に、その一致する部分をOffice Scriptの対応する構文に変換して新しいOffice Scriptコードを生成します。以下は、簡単な例としてのスクリプトです

import re

def convert_vba_to_office_script(vba_code):
    # 正規表現を使ってVBAコード内のパターンを検出
    pattern = r'Sub (\w+)\((.*?)\)(.*?)End Sub'
    matches = re.finditer(pattern, vba_code, re.DOTALL)

    office_script_code = ""

    # 各マッチングをOffice Scriptに変換して新しいコードに追加
    for match in matches:
        sub_name = match.group(1)
        params = match.group(2)
        body = match.group(3)

        # VBAのSubをOffice Scriptのfunctionに変換
        office_script_code += f"function {sub_name}({params}) {'{' + body + '}'}\n\n"

    return office_script_code

# テスト用のVBAコード
vba_code = """
Sub HelloWorld()
    MsgBox "Hello, world!"
End Sub
"""

# VBAコードをOffice Scriptに変換
office_script_code = convert_vba_to_office_script(vba_code)
print(office_script_code)

このスクリプトでは、簡単なVBAコードのサブルーチン(Sub)をOffice Scriptの関数(function)に変換します。しかし、これは非常に単純な例であり、実際のVBAコードの変換には、さまざまなVBA機能やOffice Scriptの違いを考慮する必要があります。必要に応じて、より複雑なパターンや構文に対応するための追加のルールや処理を追加することができます。

応用実装

もう少し、複雑な処理を変換するプログラムを作ってみましょう。
この例では、VBAコード内の変数宣言、条件分岐、ループ、関数呼び出し、コメントなど、より多くの要素に対応するための追加のルールと処理を追加しています。

import re

def convert_vba_to_office_script(vba_code):
    # 変数宣言を含むVBAコード内のパターンを検出
    pattern_variable_declaration = r'Dim (\w+)(?: As (\w+))?(?: = (.+?))?(?:\n|$)'
    vba_code = re.sub(pattern_variable_declaration, r'var \1;\n', vba_code)

    # 条件分岐(If文)をOffice Scriptのif文に変換
    vba_code = re.sub(r'If (.*?) Then\n', r'if (\1) {\n', vba_code)
    vba_code = re.sub(r'ElseIf (.*?) Then\n', r'} else if (\1) {\n', vba_code)
    vba_code = re.sub(r'Else\n', r'} else {\n', vba_code)
    vba_code = re.sub(r'End If\n', r'}\n', vba_code)

    # ループ(For文)をOffice Scriptのfor文に変換
    vba_code = re.sub(r'For (\w+) = (\w+) To (\w+)\n', r'for (\1 = \2; \1 <= \3; \1++) {\n', vba_code)
    vba_code = re.sub(r'Next (\w+)\n', r'}\n', vba_code)

    # 関数呼び出しをOffice Scriptの呼び出しに変換
    vba_code = re.sub(r'(\w+)\((.*?)\)', r'\1(\2)', vba_code)

    # コメントをOffice Scriptのコメントに変換
    vba_code = re.sub(r"'.*\n", r'// \g<0>', vba_code)

    return vba_code

# テスト用のVBAコード
vba_code = """
Dim x As Integer
Dim y As Integer

x = 10
y = 20

If x > y Then
    MsgBox "x is greater than y"
Else
    MsgBox "y is greater than x"
End If

For i = 1 To 5
    MsgBox "i = " & i
Next i
"""

# VBAコードをOffice Scriptに変換
office_script_code = convert_vba_to_office_script(vba_code)
print(office_script_code)

# 以下出力結果(JavaScript)
var x;
var y;

x = 10;
y = 20;

if (x > y) {
    MsgBox "x is greater than y";
} else {
    MsgBox "y is greater than x";
}

for (i = 1; i <= 5; i++) {
    MsgBox "i = " & i;
}

このスクリプトでは、より複雑なVBAコードの変換を試みています。しかし、このスクリプトは依然として簡単な変換ルールのみを示しており、実際のVBAコードの変換には、より多くのルールや処理が必要です。必要に応じて、追加のルールや処理を追加して、より多くのVBA機能に対応することができます。

まとめ

VBAは開発ツールのVBAエディターを見ても分かる様に、マイクロソフトはVBAの大きなバージョンアップをここ10年以上行っていません。
今後、OfficeScriptなどが主流になっていくことは十分に考えられます。

VBAは歴史も長く、過去の遺産が非常に多いので、どの企業様も大変だと思いますが、事前に今回の様な変換ツールを自作しておくことで、移行が必要になった際に工数を減らすことに役立ちます。