Excel VBAからモダンなWebシステムへの移行をメシウスの開発ツールで実現!

はじめに

Excel VBA(Visual Basic for Applications)は、Excel内で使用されるプログラミング言語です。

Excel VBA

このVBAを使用することで、日常の作業を自動化し、複雑な計算やデータ処理を簡単に実行できます。Excel以外のアプリケーションを必要としないことと、VBAに関する書籍等も多数あり、Excel VBAのプログラムは多くの企業、職場で利用されてきました。

Excel VBAを取り巻く環境の変化と問題点

前述のとおりExcel VBAは多くの企業で業務を自動化する用途で利用されてきましたが、技術の進歩や業務環境の変化に伴い、Excel VBAを取り巻く環境にも大きな変化が表れており、Excel VBAのプログラムを使い続けることに関して以下のような問題が挙がってきています。

パフォーマンスの問題

VBAのアプリケーションはクライアントPCで実行されリソースが制限されるので、大量のデータを処理する場合や複雑な計算を行う場合、パフォーマンスが悪くなります。特に大規模なデータセットを扱うと、処理速度が遅くなる傾向があります。

保守性の問題

VBAのコードは時として読みにくく、保守が困難です。開発者が一人で作ったプロジェクトでは、コードの標準化などはされておらず、コードの品質が一定でないことが多いです。このため、Excel VBAのプロジェクトでは属人化が問題となることがあります。属人化とは、特定の個人がシステムやプロジェクトに関する知識や技術を持ち、その知識や技術を共有していない状態を指します。

情報の一元管理

データ管理をExcelファイルで行っているため、情報の一元管理ができておらず、データ破損やファイルの重複といった問題が解消されません。またデータの再利用も困難です。

VBAの学習

今後もVBAプロジェクトをメンテナンスして行く場合、新たな担当者がVBAを学習することは現代のプログラミング言語やツールに比べてメリットが少ないと言えます。

Excel VBAの問題解決に有効なのはWebシステムへの移行!

前述のExcel VBAに関する問題の有効な解決方法は、Excel VBAで作成したプログラムをモダンなWebアプリケーションへ作り変えることです。Webアプリケーションに移行することで問題の解決のみならず、以下のようなメリットを享受することもできます。

パフォーマンスの向上

WebシステムではAjaxなどの非同期処理、複数のリクエストやタスクを同時に実行するマルチスレッド処理、データ処理を複数のサーバーに分散させて実行する分散処理など、パフォーマンスを向上させるための仕組みが構築しやすいです。

また、需要の増大に応じてサーバーをスケールアップ(より高性能なサーバーに変更)やスケールアウト(サーバーの台数を増やす)することで、リソースを柔軟に調整できます。データ量が増えても、システムの拡張が容易です。

保守性の向上

Webシステムのコードはサーバー側で一括管理されるため、複数の開発者が同じコードベースにアクセスして作業できます。GitSVNのようなバージョン管理システムを導入すれば、チーム全体でコードの変更履歴や開発の進捗を把握し、誰が何をどのように変更したかが明確になるので、特定の開発者に依存するリスクを低減できます。

また、システムの更新もサーバー側で実行するので、更新があるたびにユーザーごとに新しいファイルを配布したり、コードを展開する必要がありません。ユーザーへの影響を最小限にしてアプリケーションのメンテナンスや更新が行えます。

アクセス性の向上

Webシステムはインターネットがあればどこからでもアクセス可能です。これにより、リモートワークや複数の場所にいるチームメンバーがリアルタイムでデータにアクセスできるようになります。

データの一元管理

全てのデータが中央サーバーに保存されるため、ファイルバージョンの不一致やファイルの重複といった問題が解消されます。全ユーザーが同じデータを見て作業することができます。

セキュリティの強化

セキュリティ対策が強化され、データのバックアップや復旧もシステムで管理できます。また、不正アクセスからデータを保護するための対策も施しやすくなります。

自動化と統合

プロセスの自動化が容易になり、他のシステムやアプリケーションとの連携もスムーズに行えます。これにより、作業の効率が大幅に向上します。

リアルタイムのデータ分析とレポート

データをリアルタイムで分析し、ダッシュボードやレポートを生成することができます。意思決定を迅速かつ正確に行うための支援が可能です。

ユーザーエクスペリエンスの向上

Webインターフェースを通じて、Excelのユーザーインターフェイスだけではなく、他のUIコントロールと組み合わせることで、使いやすいユーザーエクスペリエンスを提供できます。これにより、生産性が向上します。

これらのメリットにより、組織全体の業務効率が向上し、より戦略的なビジネス運営が可能になります。

Excel VBAをWebシステムに移行するには?

Excel VBAをWebシステムに移行する際に、メシウスが提供するライブラリであるSpreadJSとDioDocs for Excelを使うことによりExcel VBAで実行していたものと同等の処理をWebシステムでも簡単に実現することが可能です。

SpreadJSとDioDocs

両製品ともにVBAはサポートしていませんが、SpreadJSはJavaScript、DioDocs for ExcelはC#またはVB.NETを用いて開発が可能です。

また、プログラムコードは全て書き直しになりますが、VBAでの根幹となるExcelオブジェクト(ブック、シート、セル)の操作に相当する処理を両製品ともに行えるので、コードのロジックはほぼ同じように書き換えることが出来ます。
※ チャートやシェイプなどはVBAとは異なったコーディングが必要になる場合があります。

SpreadJS(スプレッドJS)

「Excelライク」なスプレッドシートをブラウザ上で実現するJavaScriptライブラリです。JavaScriptを用いたWebアプリケーションはブラウザ上で実行されるため、VBAのように直接Excelファイルにアクセスすることはできませんが、SpreadJSはフィルタや表計算、チャート、条件付き書式、ピボットテーブルなどのExcel互換機能を豊富に搭載しているので、Excelで行っていた業務をそのままブラウザ上で実現することが可能です。

SpreadJSで作成したWebアプリケーションの例
SpreadJSで作成したWebアプリケーションの例

また、Excelファイルのインポート/エクスポートもサポートしているので、既存業務で使用していたExcelファイルを高い精度でアプリケーションに読み込んで表示したり、逆にSpreadJSの内容をExcelに出力したりすることも可能です。

DioDocs for Excel(ディオドック)

DioDocs for ExcelはC#およびVB.NETのコードからAPIを利用してExcelファイルを作成・編集できます。SpreadJSとは異なりUIを伴わないライブラリで、 .NETアプリケーションのバックエンドで動作します。

DioDocsでExcelファイルを作成する
DioDocsでのExcelファイルの生成イメージ

また、DioDocsのオブジェクトモデルはExcelと同等なので、VBAでシートやセルを操作する場合と同じ感覚で使用することができます。

Excel VBAからのコードの移行例

ここからは実際にExcel VBAのコードをSpreadJSとJavaScript、およびDioDocsとC#を用いたコードに置き換える例をご紹介します。

VBAでExcelファイルのオブジェクトモデルを操作する

VBAはExcelのWorkbook、Worksheet、RangeなどのオブジェクトにAPIでアクセスして各種操作を行います。これらのオブジェクトは、Excelのオブジェクトモデルに従って階層的にアクセスされ、様々なタスクをプログラム的に制御することができます。

Excelファイルのオブジェクトモデル

以下の2種類のコードはいずれも「Book1.xlsx」の「Sheet1」の「A1」セルに「Hello World」の文字列を出力するコードです。

Workbooks("Book1.xlsx").Sheets("Sheet1").Range("A1").Value = "Hello World"
Dim wb As Workbook
Dim ws As Worksheet
Dim rng As Range

' Excelファイル(ワークブック)を開く
Set wb = Workbooks.Open("Book1.xlsx")

' ワークシートを選択
Set ws = wb.Sheets("Sheet1")

' セル範囲を指定
Set rng = ws.Range("A1")

' セル範囲に値を設定
rng.Value = "Hello World"

以下は上記のコードをボタンに割り当てて実行した例です。

SpreadJSで同様の動作を再現する

先ほどVBAで実行したものと同様の処理をSpreadJSとJavaScriptで再現してみます。

HTMLファイルを用意し、SpreadJSのライブラリの参照と、SpreadJSを表示する領域を定義します。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>SpreadJSサンプル</title>
    <link href="css/gc.spread.sheets.excel2013white.17.1.5.css" rel="stylesheet" />
    <link href="css/style.css" rel="stylesheet" />
    <script src="scripts/gc.spread.sheets.all.17.1.5.min.js"></script>
    <script src="scripts/resources/gc.spread.sheets.resources.ja.17.1.5.min.js"></script>
    <script src="scripts/app.js"></script>
</head>

<body>
    <div>
        <button id="sample-btn" class="sample-btn">Hello world</button>
    </div>
    <div id="ss"></div>
</body>

</html>

「scripts/app.js」ファイルではSpreadJSの初期化処理と、ボタンクリック時の処理を記述します。今回は先ほどのVBAで実行したものと同様に「A1」セルに「Hello World」の文字列を出力します。
※ ライセンスキーを設定しない場合、トライアル版を示すメッセージが表示されます。ライセンスキーの設定方法についてはこちらをご覧ください。

// ライセンスキーとカルチャの設定
GC.Spread.Sheets.LicenseKey = 'ここにSpreadJSのライセンスキーを設定します';
GC.Spread.Common.CultureManager.culture('ja-jp');

document.addEventListener("DOMContentLoaded", function () {
    // SpreadJSの作成
    const wb = new GC.Spread.Sheets.Workbook("ss");
    const Button = document.getElementById('sample-btn');

    // ボタンクリックでA1セルに文字列を出力
    Button.onclick = function () {
        var ws = wb.getActiveSheet();
        ws.setValue(0, 0, "Hello World");
    }
});

「css/style.css」でSpreadJSやボタンのスタイルを設定します。JavaScriptを用いたモダンなWebアプリケーションではCSSを用いて外観をカスタマイズします。

#ss {
    border: 1px solid gray;
    height: 500px;
    width: 950px;
    margin-left: 10px;
}

.sample-btn {
    font-size: 12px;
    padding: 10px;
    margin: 10px;
}

上記を実装したアプリケーションを実行するとブラウザ上にExcelライクなスプレッドシートが表示されます。また、ボタンクリックでVBAと同様にセルに値を設定できます。

DioDocsで同様の動作を再現する

同じくDioDocsとC#でも同等の処理を再現してみます。今回はASP.NET Core Razor PagesのWebアプリケーションのバックエンドでDioDocsを実行し、「A1」セルに「Hello World」の文字列が設定されたExcelファイルを生成してダウンロードします。
※ ライセンスキーを設定しない場合、出力したExcelファイルにトライアル版を示すメッセージが表示されます。ライセンスキーの設定方法についてはこちらをご覧ください。

・・・(中略)・・・
using GrapeCity.Documents.Excel;
・・・(中略)・・・
        public ActionResult OnPostOutputExcel()
        {
            Workbook.SetLicenseKey("ここにDioDocsのライセンスキーを設定します");
            Workbook wb = new Workbook();
            IWorksheet ws = wb.Worksheets[0];
            // セル範囲を指定して文字列を設定 
            ws.Range["A1"].Value = "Hello World";
            wb.Save("DioDocs-Sample.xlsx");
            var file = System.IO.File.ReadAllBytes("DioDocs-Sample.xlsx");
            return File(file, System.Net.Mime.MediaTypeNames.Application.Octet, "DioDocs-Sample.xlsx");
        }
・・・(中略)・・・

ASP.NET Core Razor Pagesアプリケーション上のボタンをクリックするとバックエンドでDioDocsが実行され、「Hello World」の文字列が設定されたExcelファイルを生成してダウンロードできます。

移行にあたっての注意点

VBAからWebアプリケーションに移行するにはいくつか注意しなければならない点があります。

開発環境の違い

VBAはExcelをはじめとしたMicrosoft Office内で動作し、開発もOffice上で行います。これに対してJavaScriptを用いたモダンなWebアプリはVisual Studio Codeのようなコードエディタを使用して開発するのが主流です。また、C#( .NET)を用いて開発する場合は主にVisual Studioなどの統合開発環境(IDE)で開発を行います。

UIの違い

VBAではUserFormを使ってExcelやAccess内で簡単にダイアログボックスやフォームを作成できますが、JavaScriptではHTMLとCSSを使用してUIを構築します。したがって、UIのデザインや作成にはこれらの知識が必要になります。また、C#でWebアプリケーションを開発する場合はASP.NET Core Razor PagesASP.NET Core Blazorを使用したり、フロントエンドにReactなどのJavaScriptフレームワークを使用したりと様々な選択肢があり、自由度が高い分複雑さも増します。

構文の違い

VBA、JavaScript、C#では変数、条件分岐、繰り返し処理などそれぞれ異なる構文となります。一例としてそれぞれの言語で条件分岐(if文、switch文)と繰り返し処理(Loop文)を行う場合の構文を比較してみます。

VBA

' 条件分岐(if文、switch文)
If 条件式1 Then 
    ' 処理1 
ElseIf 条件式2 Then 
    ' 処理2 
Else 
    ' 処理3 
End If 

Select Case 変数 
    Case 条件式1 
        ' 処理1 
    Case 条件式2 
        ' 処理2 
    Case Else 
        ' デフォルト(どの条件にも一致しなかった場合)の処理 
End Select 

' 繰り返し処理(Loop文) 
For カウンター名 = 初期値 To 到達値 
    ' 処理 
Next カウンター名 

JavaScript

// 条件分岐(if文、switch文)
if( 条件式 ) { 
    // trueの処理 
} else if( 条件式 ) { 
    // ifの条件式がfalse、else ifがtrueの処理 
} else { 
    // if、else ifともにfalseの処理 
} 

switch( 式 ) { 
    case 値1: 
        // 処理1 
        break; 
    case 値2: 
        // 処理2 
        break; 
    default:
        // デフォルト(どの条件にも一致しなかった場合)の処理
} 

// 繰り返し処理(Loop文) 
for (  初期値;  条件式;  増減値  ) { 
    // 処理 
} 

C#

// 条件分岐(if文、switch文)
if(条件1){ 
    //trueの処理 
} 
else if(条件2){ 
    //ifの条件式がfalse、else ifがtrueの処理 
} 
else{ 
    //if、else ifともにfalseの処理 
} 

switch(式) { 
    case 値1: 
        // 処理1 
        break; 
    case 値2: 
        // 処理2 
        break; 
    default:
        // デフォルト(どの条件にも一致しなかった場合)の処理
        break;
} 

// 繰り返し処理(Loop文)
for (  初期値;  条件式;  増減値  ) { 
    // 処理 
} 

変数の型付けの扱いの違い

VBAやJavaScriptは実行時に型の整合性をチェックする「動的型付け」で実行できるので、変数の型定義がされていない場合がありますが、C#やJavaScriptを拡張したTypeScriptは「静的型付け言語」であり、あらかじめ型を定義する必要があるので、移行の際はその点も注意が必要です。

これまでWeb開発を行った経験がない開発者にとっては、上記のようなVBAとの違いを考慮して開発しなければならず、工数の増加が生じる可能性がありますが、今回ご紹介したメシウスの開発ツールを使用することで、VBAで行っていた処理と同等の機能を持つWebアプリケーションを短期間で開発することが可能です。

さいごに

今回はExcel VBAを使い続けることの問題や、Excel VBAをモダンなWebアプリケーションに移行するメリット、さらにはExcel VBAの移行に役立つメシウスの開発ツールについて解説しました。

メシウスではExcel VBAの資産の移行など、システム開発に関する課題をお持ちのお客様のご相談を承っております。
経験豊富なスタッフがお客様の課題や実現したい操作、機能などにあわせて課題解決に向けた技術選定や製品選定のお手伝いをいたしますので、是非お気軽にお問い合わせください。

そのほか、製品の機能を手軽に体験できるデモアプリケーションやトライアル版も公開しておりますので、こちらもご確認ください。

\  この記事をシェアする  /