Excel VSTOアドイン開発入門

はじめに

Spreadsheets/Excel Advent Calendar 2018の12日目の記事です。

Excelでの作業の自動化といえばExcel VBAですが、複雑な機能の実装には辛いことも多かったりします。 そんなときは、C#.NET Frameworkの機能がフルに使えるVSTO (Visual Studio Tools for Office)が便利です。

そこで本記事では、ExcelVSTOアドインの開発環境構築から配布までを解説したいと思います。

想定環境

やってみる

1. 環境構築

VSTOアドインの開発には、Visual Studio の他に Office Developer Tools という拡張機能が必要です。 それぞれ下記リンクからダウンロードし、インストーラに従ってインストールします。

2. プロジェクト作成

Visual Studioを起動し、[ファイル]-[新規作成]-[プロジェクト]からプロジェクトを作成します。 [Visual C#]-[Office/SharePoint]-[VSTOアドイン]から、「Excel 2013と2016 VSTOアドイン」を選択し、[OK]をクリックします。

f:id:ser1zw:20181212175933p:plain f:id:ser1zw:20181212180004p:plain

すると、以下のようなコードが生成されます。

// ThisAddin.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO で生成されたコード
        // (省略...)
    }
}

ThisAddIn_Startup()ThisAddIn_Shutdown() は、それぞれアドインのロード時、アンロード時に実行されるイベントハンドラです。

参考: Office プロジェクト内のイベント - Visual Studio | Microsoft Docs

ここでは一旦なにもせず置いておきます。

3. リボンにボタンを追加

アドインの機能を実行するため、リボンにボタンを追加していきます。

まず、ソリューション エクスプローラー からプロジェクト名(ここでは ExcelAddIn1 )を右クリックし、[追加]-[新しい項目]を選択します。

f:id:ser1zw:20181212180035p:plain

次に、[Visual C# アイテム]-[Office/SharePoint]から「リボン(ビジュアルなデザイナー)」を選択して[追加]します。

f:id:ser1zw:20181212180047p:plain

これで見慣れたフォームデザイナが起動するので、左側のツールボックスからボタンを選択し、ドラッグ&ドロップでリボンに追加しましょう。

f:id:ser1zw:20181212180148p:plain

ボタンをダブルクリックすると、クリック時のイベントハンドラ button1_Click() が挿入されるので、ここに処理を書いていきます。

// Ribbon1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;

namespace ExcelAddIn1
{
    public partial class Ribbon1
    {
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {
        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
                // ここにいろいろ書く
        }
    }
}

4. アドインの処理を書く

VSTOプロジェクト内では、アドイン自体の機能やExcelのワークシート等にアクセス可能な Globals というクラスがあります。 シートの内容の読み書きといったExcelとのやりとりは、主にこのクラスを介して行います。

参考: Office プロジェクト内のオブジェクトへのグローバル アクセス - Visual Studio | Microsoft Docs

試しに、前述の button1_Click() を下記のように変更してみます。

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    // アクティブなシートの取得
    // ActiveSheetはdynamic型であり、そのままだとインテリセンスが効かないので、
    // キャストするために as Microsoft.Office.Interop.Excel.Worksheet をつけている。
    var activeSheet = Globals.ThisAddIn.Application.ActiveSheet
        as Microsoft.Office.Interop.Excel.Worksheet;

    // セルに値を設定
    activeSheet.Range["A1"].Cells.Value = "Hello";
    activeSheet.Cells[1, 2] = 123;
}

4. 実行してみる

上部メニューから[開始]をクリックすると、Excelが起動します。 「空白のブック」を選択してリボンの「アドイン」タブを開くと、3.で追加したボタンが表示されます。

これをクリックすると 4. で記載した処理が実行され、セルに値が設定されます。

f:id:ser1zw:20181212180232p:plain

なお、このままの状態では、Excel起動時に毎回このアドインが読み込まれることになります。 このため、作業が終わったらVisual Studioの上部メニューから [ビルド]-[ソリューションのクリーン] を実行し、開発中のアドインを削除しましょう。

f:id:ser1zw:20181212180300p:plain

5. アドインの配布

配布にはいくつか方法がありますが、最も手軽な「インストーラを含むフォルダをそのまま配布」の方法を紹介します。

Visual Studioの上部メニューの [ビルド]-[(プロジェクト名)の発行] をクリック → 発行する場所のパスを設定(今回はデフォルトの「公開」フォルダ)して[次へ]をクリック → 「CD-ROM または DVD-ROM から」を選択して [完了] をクリックします。

f:id:ser1zw:20181212180242p:plain f:id:ser1zw:20181212180304p:plain f:id:ser1zw:20181212180307p:plain

今回は発行する場所のパスがデフォルトのままなので、プロジェクトフォルダ配下に「公開」フォルダが作成され、そこにインストーラが一式保存されます。 別のPCでアドインをインストールするには、前述の「公開」フォルダをまるごとコピーし、中の setup.exe を実行すればOKです。

f:id:ser1zw:20181212180316p:plain

アンインストールは、一般的なソフトと同じく「アプリと機能」から行います。

f:id:ser1zw:20181212180321p:plain

なお、上記手順で発行を行うと、デフォルトでは自動的にリビジョンが上がっていきます。 バージョンを明示的に設定したい場合は、Visual Studioの上部メニュー [プロジェクト]-[(プロジェクト名)のプロパティ] を開き、 [発行] から「発行するバージョン」を編集してください。 「リリースごとにリビジョンを自動的に追加する」のチェックをはずすと、リビジョンが自動的に上がらなくなります。

f:id:ser1zw:20181212180325p:plain f:id:ser1zw:20181212180329p:plain

参考: 発行ウィザード (Visual Studio での Office 開発) - Visual Studio | Microsoft Docs

6. 参考リソース

VBAVSTOの比較

公式チュートリアル

リファレンス

まとめ

ExcelVSTOアドインの開発環境構築から配布までの一連の流れを解説しました。 VBAでは厳しいと感じる場面では、ぜひ試してみてください。

明日は __papix__さん です。