【Excel改造】Visual Studio Tools for Officeを用いたExcelアドイン作成【準備編】

【Excel改造】Visual Studio Tools for Officeを用いたExcelアドイン作成【準備編】

Clock Icon2013.07.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Excelのカスタマイズ

日本国内では依然として広く業務でOfficeが用いられています。Officeを構成するツールの一つであるExcel様(神様)に今回は注目していきたいと思います。ちなみにExcel方眼紙は悪魔です。

Excelのカスタマイズには一般的にはVBAが用いられているかと思いますが、今回はVBAではなくVisual Studio Tools for Office(VSTO)を用いて、Excelをカスタマイズして行きたいと思います。

VSTOを用いたExcelのカスタマイズですが、例えば、リボンに独自のメニューを追加して機能を付加するといった事が可能になります。Excel 2007から画面上部にリボンというメニューが用意されており、ここに便利な機能が凝縮されているわけですが、ここに独自の機能を追加できるわけです。

下記はExcel 2013のリボンのホームタブの内容になります。よく使う「貼り付け」は大きなアイコンで、「フォントの設定」はリストボックスでといったように、実は非常にリッチなインターフェースになっています。

ExcelAddin01

個人的にはこのリボンに、例えば「AWSタブ」を作成し、EC2やCloudWatchからデータを取得したりするアプリケーションをExcelで作成してみようと考えています。

今回は、このExcel改造の第1歩を記しておきたいと思います(日本語英語ブログ、公式ドキュメント含めVSTOに関する情報は殆ど無いので、そういった意味でも本ブログに情報をできるだけアップして行きたいと思います)

開発環境

  • Windows 8
  • Visual Studio 2012(C#)
  • Excel 2013

※本来Visual Studio Tools for OfficeはOffice 2010までを対象としたもので、Excel 2013には対応していません。しかし、今回はサンプルアドインのExcel 2013での動作確認まで行なってみます。

Visual Studio 2012にはOffice 2013アドインを作成する環境はデフォルトではインストールされていません。下記記事を参考に環境構築を行っておいて下さい。

Officeアプリケーションの種類

実際のアプリケーションを作成する前に、Officeを改造する「Officeアプリケーション」には2種類のものが存在することをご紹介します:

アプリケーションレベルアドイン

アプリケーションレベルアドインはExcelを例にすると、一旦Excelにインストールされると、そのExcelで開いたドキュメント全てで機能を実行できるようにするものです。

ドキュメントレベルアドイン

ドキュメントレベルアドインはVBAを用いたアプリケーションと似ていて、特定のドキュメントやテンプレートに関連付けられるアプリケーションです。

※Officeアプリケーションは上記のようにアドインという形でExcelなどにプラグインする形になります。

Excelアドインプロジェクトの作成

今回はExcelアドインというExcelそのものにインストールするタイプのアプリケーションを作成します。

  • ファイル>新規作成>プロジェクト
  • テンプレート>Visual C#>Office>2010>Excel 2010 アドインを選択
  • プロジェクトの名前をExcelAddIn_Helloとする
  • OKボタンをクリック

 ※今回はExcel 2013で動作を試していますが、Excel 2013専用のアドインは無く、Excel 2010用のアドインを作成しています。

ソリューションエクスプローラを確認するとExcelそのものとそのコードビハインドが確認できます。この関係はWPF開発などと同じイメージでわかりやすい構成です。

ExcelAddin02

またそのコードビハインド(ExcelAddIn_Hello.cs)は下記のコードが自動的に生成されています。見慣れたC#のコードですので安心してExcelが改造できそうです!

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

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

        #region VSTO で生成されたコード

        /// <summary>
        /// デザイナーのサポートに必要なメソッドです。
        /// このメソッドの内容をコード エディターで変更しないでください。
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }
        
        #endregion
    }
}

イベントハンドラの追加

作成されたアドインアプリケーションには、StartupイベントとShutdownイベントにイベントハンドラが設定されています。それぞれExcel起動時、終了時に走るイベントのイベントハンドラになります。このStartupイベントハンドラに、Application.WorkbookBeforeSaveイベントのイベントハンドラを追加します。このイベントは「ワークブックが保存される前」に走るイベントです。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.WorkbookBeforeSave += Application_WorkbookBeforeSave;
}

ワークブック保存時処理の実装

先ほど作成した Application_WorkbookBeforeSave イベントに簡単な処理を記述します。下記の処理を実施しています:

  • (Excelの保存処理が行われる)
  • アクティブなワークシートを取得する。
  • シート内のC4にあるセルを取得する。
  • セルの値を"Hello World"にする。

コードは下記になります:

void Application_WorkbookBeforeSave(Excel.Workbook Wb, bool SaveAsUI, ref bool Cancel)
{
    Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);

    if (activeWorksheet != null)
    {
        Excel.Range nameCell = activeWorksheet.get_Range("C4");
        nameCell.Value2 = "Hello World";
    }
}

アプリケーションの実行

それではアプリケーションを実行しましょう。

アプリケーションをVisual Studioで実行すると、空のExcelファイルが開きます。そこでCtrl+Sなどでファイルを保存することにします。ファイル名等を入れて保存を終了すると、C4セルに"Hello World"とテキストが表示されます。

ExcelAddin03

最後に

今回はExcelの改造の第1歩を踏み出してみました。Excelで発生する各種イベントが取得できさえすれば、様々なタスクを実行できそうな雰囲気は味わって頂けたかと思います。

最後にアドインのメリットについて述べておきたいと思います。

1番のメリットは『Excelファイルにプログラム(マクロ)を埋め込まない事』です。そのため、アドインの入っている環境でアドインを用いて修正したExcelファイルは、アドインの入っていない環境では単なるExcelファイルとなります。そのため、定型的な作業やクラウド連携処理をアドインの入ったExcel環境で行い、その結果をお客様に提出するといった事が可能になります。

2番めのメリットとしてはやはり『.NETをフル活用してExcelを改造できる』を挙げておきたいと思います!

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.