Excelアドイン　イベント処理

先日、Officeアドインの作成方法について記事を書いたのですが、その続きとして、イベント処理の方法について書いていこうと思います。
↓先日書いたアドインの作成方法のリンクです
https://qiita.com/NagaJun/items/c7c6964a12a8a945726e
##各オブジェクトの取得方法について
まずイベントを設定するには、イベントを設定するためのオブジェクトを取得する必要があります。
オブジェクトを取得するには「Globals」クラスを使用します。
「Globals」を使用するとクラスを初期化したりオブジェクトの生成を行ったりすることなく、現在の起動状態から各オブジェクトを取得することができます。
・現在のWorkbook（開いているExcelファイル）を取得する場合

```cs
Workbook book = Globals.ThisAddIn.Application.ActiveWorkbook;
```
・現在開いているシートを取得したい場合

```cs
Worksheet sheet= Globals.ThisAddIn.Application.ActiveSheet;
```
みたいな感じで取得します。
「Globals.ThisAddIn.Application」はExcelに限らずOffice VSTOアドインで共通で適用できます。
（Wordでドキュメントを取得する場合は「Globals.ThisAddIn.Application.ActiveDocument」で取得することができます。ThisAddin は自身のアドインクラス名のものである必要があるので、クラス名を変更した場合はそれに合わせる様にしてください）
「Globals」クラスは「リボン」クラスからも参照することができるので、リボン押下時にシートの状態を取得して処理することも可能です。
##イベントの設定方法
オブジェクトの取得方法がわかったところで、イベントの設定方法について説明します。
イベントは基本、Applicationに対して設定します。
WorksheetやWorkbookに対しても設定できますが、その場合は設定を行ったオブジェクトに対してしかイベントが発生しないため、注意が必要です。
イベントを常時発生するようにしたい場合は、自動生成された「ThisAddIn_Startup()」内に書き込みます。
今回は例としてWクリックイベントを設定します。
各イベントに関しては下記リンクを参考にしてください。
https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.office.tools.excel.workbook?view=vsto-2017#events
コードには下記の様に記載してください。

```cs:ThisAddIn.cs
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
     Globals.ThisAddIn.Application.SheetBeforeDoubleClick += Application_SheetBeforeDoubleClick;
}

/// <summary>ダブルクリック時のイベント</summary>
private void Application_SheetBeforeDoubleClick(object Sh, Excel.Range Target, ref bool Cancel)
{
     string value = Convert.ToString(Target.Value);
     MessageBox.Show(value);
}
```
「…Application.SheetBeforeDoubleClick +=」という部分まで書くとVisual Studioが反応して Tabキーがどうのこうのというメッセージが出てくるので、そこでTabキーを押下すると「Application_SheetBeforeDoubleClick()」を自動生成してくれると思います。
「Application_SheetBeforeDoubleClick()」の中に追加したい処理を記入するのですが、今回はWクリックしたセルの中身をメッセージボックスに表示します。
Application_SheetBeforeDoubleClick()の引数の「Target」がWクリックしたセルの中身なので、それの「.Value」を取り出します。このとき「Target.Value」は「dynamic」という型で、何も考えずに使用すると後でエラーになるので、今回はConvert.ToString()を使用して文字列に変換しています。
サンプル通りに書けたなら、実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/cea86d4e-9896-b76f-2e60-32c2625d4316.png)
何か書き込みを行ったセルをWクリックして、上記画像同様にメッセージが出力出来たら成功です。
念のため、コード全体を下記に載せておきます。

```cs:ThisAddIn.cs
using System;
using Excel = Microsoft.Office.Interop.Excel;
using System.Windows.Forms;

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            Globals.ThisAddIn.Application.SheetBeforeDoubleClick += Application_SheetBeforeDoubleClick;
        }

        /// <summary>ダブルクリック時のイベント</summary>
        private void Application_SheetBeforeDoubleClick(object Sh, Excel.Range Target, ref bool Cancel)
        {
            dynamic a = Target.Value;
            string value = Convert.ToString(Target.Value);
            MessageBox.Show(value);
        }

        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
    }
}
```
##まとめ
Officeアドインのイベント処理について書かせていただきましたが、いかがだったでしょうか？
ここまでくればそれなりのものが作れるかと思います。（作る側次第ではありますが）
C#がわからないという方は勉強あるのみ、という感じですが、私が最初に習得したときは、プログラミング未経験で一、二週間もあればそれなりのコードが書ける様にはなりました。（コードは汚かったですが（笑））
まあ、Visual Studioを使えばビルドとかコンパイルとかを全部自動でできるので、楽にプログラムを作成できますし、C#のコードは直感的にわかりやすいと個人的には感じます。
C#がわからないという方は、これを機にC#を習得するというのも良いのではないでしょうか？