normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Visual Studio Tools for Office プロジェクトのことはじめ

Visual Studio Tools for Office(以下、VSTO)を触る機会があったので、備忘録もかねて情報を記載する。VSTOではVBAスクリプトを利用した開発とは異なり、.NET Frameworkを利用したアドオン開発が可能であるため、.NET開発者にとって開発勝手の良い開発手法だといえる。

VSTOプロジェクトの作成

Visual Studio を管理者モードで起動し、[ファイル]-[新規作成]-[プロジェクト]から新規作成ダイアログを起動する。Officeのカテゴリから Excel 2010 アドオンを選択してVSTOプロジェクトを作成する。

プロジェクト内にはThisAddIn.cs が自動生成されており、以下のメソッドが記載されている。

こちらに対し、以下の処理を追記する。

  • ThisAddin.cs の抜粋
namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            //追記
            System.Windows.Forms.MessageBox.Show("アドオンのロード");
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
            //追記
            System.Windows.Forms.MessageBox.Show("アドオンのアンロード");
        }

次に、Visual Studioからアドオンを実行する。F5を押下するとExcelが起動し、「アドオンのロード」と表示されたダイアログが起動するはずだ。また、、Excelを閉じる際に「アドオンのアンロード」と表示されたダイアログが起動する。

リボンインタフェースの追加

プロジェクトを右クリックし、メニューの[新規項目の追加]から[リボン(ビジュアルなデザイナー)]を選択する。Ribbon1.cs が追加され、デザイナが起動する。ここからボタンを新規に配置し、Clickイベントにメソッドを追加し、メソッド内に以下を記載する。

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)
        {
            var activeSheet = ExcelAddIn1.Globals.ThisAddIn.Application.ActiveSheet
                as Microsoft.Office.Interop.Excel.Worksheet;

            //Excelのセルは添え字が1から開始な点に注意
            activeSheet.Cells[1, 1] = "書き込んでみるでござる";
        }
    }
}

上記の記述後、Visual Studio からアドオンを起動する。Excelのリボンインターフェースに[アドオン]が追加されるので、[アドオン]から追加したボタンを押下して処理を実行する。正常にアプリケーションの処理が実行されれば、以下の画面が表示されるはずだ。

アドイン本体とリボンインターフェースで値を共有する

ThisAddInインスタンスとRibbon1インスタンスで値を共有する際にも ExcelAddIn1.Globals を利用する。以下の様に処理を記述する。

  • ExcelAddIn1.cs の抜粋
namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        public string Status { get; set; }

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            Status = "読み込まれたでござる";

            System.Windows.Forms.MessageBox.Show("アドオンのロード");
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
            System.Windows.Forms.MessageBox.Show("アドオンのアンロード");
        }
  • Ribbon1.cs の抜粋
namespace ExcelAddIn1
{
    public partial class Ribbon1
    {
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {
        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            var activeSheet = ExcelAddIn1.Globals.ThisAddIn.Application.ActiveSheet
                as Microsoft.Office.Interop.Excel.Worksheet;
            activeSheet.Cells[1, 1] = "書き込んでみるでござる";
            activeSheet.Cells[2, 1] = ExcelAddIn1.Globals.ThisAddIn.Status;
        }
    }
}

処理の記述後にVisual Studio からアドオンを起動し、リボンインタフェースの追加 と同様の手順でアドオンの処理を実行する。以下の画面が表示されれば処理は完了だ。