Office アドイン作成方法【C#】初心者向け

Microsoftから出されているデスクトップ版 Officeアドインの作成方法について書かせて頂きます。
正直、C#のコードが少しわかるというレベルの人、というか今回書いた範囲なら知らなくても、簡単に作成できます。
リボンのボタンを作るところまでは、プログラミングを一切してないです（笑）

## 開発環境
・アドインを開発したい Officeアプリ（Excel,Word,PowerPoint,Outlookなど）
・Visual Studio Community

## 環境構築
まず、Visual Studioのインストールです。
Microsoftの公式サイトからダウンロードします。
下記がそのリンクです。
https://visualstudio.microsoft.com/ja/downloads/
![スクリーンショット 2020-10-03 115516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/98663200-495b-9d91-0a76-fae1df8a6179.png)

ダウンロードが終わったら、インストーラーを起動してインストールを実行します。
確認画面が立ち上がるかと思いますが、確認事項に問題がなければ続行していってください。
ある程度進むと下記の様な画面になるかと思います。
この画面の下の方にいくと「Office/SharePoint開発」があるので、チェックを入れた後、画面右下の「インストール」を押下して実行してください。
（筆者の環境では既にインストール済みなのでボタンが「変更」になっています。このタイミングで「Office/SharePoint開発」の追加を忘れた場合でも、再度インストーラーを起動すれば追加することができます）
![スクリーンショット 2020-10-03 115516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/294a29a8-a4e0-2868-bf62-8ae3be3d04f6.png)
##プロジェクトの作成
インストールが終わったら、プロジェクトを作成します。
Visual Studioを起動すると下記の様な画面になるため、まずは「新しいプロジェクトの作成」を押下します。
![スクリーンショット 2020-10-03 115516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/71c244db-cff7-1661-aa54-0583ba920b0d.png)
すると、作成したいプロジェクトの種類を選択する画面に遷移します。
ここで作成するアドインの種類に合わせてプロジェクトを選択するのですが、今回は例としてExcel VSTOアドインを選びます。（「C#」「Windows」「Office」で絞り込むと見つけやすいです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/5714a734-d476-8d9e-3536-ab1c93aca684.png)
「次へ」を押下すると下記の様な画面になるかと思います。
ここでは今回作成するプロジェクト名を設定します。こうしなければいけないとかいう決まりはないのでお好みでどうぞ（笑）
（こういうと、キャメルケースだとかスネークケースだとか言い出す人がいるかもしれませんが…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/88c4ada8-1d1a-c545-4fe9-374f576c3a6c.png)
上記画面で「作成」ボタンを押下すると、ついにプロジェクトが出来上がります。
さあ、これからコードを書くぞ！というところなのですが、まあ、今回はコード書くのは後回しにします。
最小限のコーディングで初心者でもわかる範囲に留めておこうと思います。
~~（私も細かいことを書くのが面倒くさいので）~~
まずは、Excelにリボンを追加します。画面右側に「ソリューションエクスプローラー」があるので、プロジェクト名を右クリックします。下記の左側の画像でいうと「ExcelAddin1」のところです。
右クリックで右側の画像と同じメニューが表示されると思いますので「追加」の「新しい項目」を押下してください。
一つ下の画像と同じウィンドウが立ち上がると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/39952234-9dd2-c64b-8744-990e18758f3a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/d5879605-8ba3-4408-bdf1-b984d2a2bebf.png)
今回はリボンを作成するので、「リボン（ビジュアルなデザイナー）」を選択してください。ファイル名はお好みで（笑）
ファイル名が決まったなら「追加」を押下してください。下記画像の様なデザイナーが表示されると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/da85120d-867f-8557-d163-5c1de8cdce36.png)
とりあえず、ボタンを追加します。下記画像のように「表示」の中の「ツールボックス」を選択してください。
右の画像の様なウィンドウが出てくると思います。その中から「Button」をリボンのデザイナーの中にドラッグ&ドロップしてください。（注意：リボンのデザイナーウィンドウ内を押下してからでないとツールボックス内にアイテムが表示されない場合があります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/d01493bd-5e76-a3e2-ed9d-3deab46e5e0a.png)
これによりついに！ボタンが出来上がります！（大した事やってないですが（笑））
ただ、このままだとボタンを押しても何も反応しません。せっかくなので機能を追加したいと思います。
デザイナー上のボタンを Wクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/7f852b9f-a3bc-5b0b-e873-c0b5e30207a1.png)
下記の様なテキストエディタ画面に移ると思います。その中の「button1(自身で付けたボタン名）_Click」の項目の｛ ｝で囲まれた範囲に「System.Windows.Forms.MessageBox.Show("ボタンが押下されました");」と記入し、Saveして下さい。
保存したら画面上部の「開始」を押下してください。（本来なら先に「ビルド」するのですが、そこまで本格的に書くと~~面倒くさい~~細かくなるので飛ばします）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/a741cd42-c9b3-57d0-e736-8cc9e23bf9c7.png)
勝手にExcelが立ち上がったかと思います。（Excelが入ってなければもちろん立ち上がりません（笑））
シートを開くとリボンの中に「アドイン」という項目が追加されているかと思います。
そして、「アドイン」の項目中には先ほど追加した「button1」が！ボタンを押下すると！
メッセージボックスが表示される！ということです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/a298ce98-7e3e-7e5b-a93d-453b92c07150.png)
そういえば、リボンのデザインについて書いてなかったので書いておきます。
先ほどのデザイナー画面に戻ってもらって、ボタンをクリックした後、画面右下の「プロパティ」ウィンドウの中の「Label」項目を探し出し、テキストをお好みに書き換えてください。中身が確定するとボタンのラベルが書き換わるかと思います。
（注意：Excelを閉じてから変更しないと、Visual Studioがブツブツ言ってきます（笑））
あと、「OfficeImageId」という項目があるのですが、そこに特定の文字列を設定するとラベルのアイコンを設定することができます。
「officeimageid アイコン」みたいな検索内容で検索すると見つかると思うので、アイコンを設定したいという方はぜひ調べてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762492/8b031ab5-7897-56d6-fa04-f550d4f9f533.png)
##まとめ（雑談）
結構長々と書かせていただきましたね。わかりやすいようにと思って画像を結構な枚数作って貼ったのですが、それが正直面倒でした（笑）
初心者の方に伝わるようにと思って書いたので、プログラミング初心者でもわかるかと思います。そもそもコードに関しては一行しか書いていないですし（笑）

＜2020/11/07 追記＞
アドインの配布方法について記事にしました。
https://qiita.com/NagaJun/items/1c2af53ff99218f59e89

Excelでのイベント処理方法についても書いておきました。
https://qiita.com/NagaJun/items/b37b4b687c2ab2a8171a

ここからは雑談です。（ただ自分が書きたいだけです（笑））
この間、仕事で AutoCAD のアドインを C#で書いたんですが、すっごい面倒くさかったです（笑）
Officeのアドインみたいにデザイナーでリボンを作るための APIがあるみたいなんですが（本当にあるのかは不明）、会社のPCだと会社側に管理されているせいで、そのAPIが取り込めない！
ということで、わざわざリボンを C#のコードで一から書いたんですが、とにかく面倒くさかった（笑）
サンプルのコードは少ないし、そして書き方がわかりずらい！
と思いながらなんとか仕上げました（笑）
今では、今回のExcelのアドインみたいに起動したら勝手にリボン作成まで処理してくれます。自動で読み込む部分を書くのもややこしかったですが（笑）
機会があれば AutoCADアドインについて書こうと思います。（リクエストがあれば優先的に書きます（笑））

そういえば、Wordのアドインでドラッグ&ドロップの処理がうまくできないとかいうことがありました。代替案として、始めはマウスハックとかいう方法で処理を行っていたのですが、Windows.Form.Application.Idleというイベントと、C#純正でマウスの状態を取得する方法があるので、それを使えば上手くいきました。コードも少なくて済むので個人的にはこちらの方が良いんじゃないかと思っています。後日、もう少し詳しい記事を書こうと思います。

あと、最近仕事で C#のコードばかり書いていて多少ネタがあるので機会があれば書こうと思います。「一定時間で消えるメッセージボックスをC#純正のコードだけで」とか、「C#からトースト通知を出す方法」とかとか…。

最後に、最近仕事でRustのコードを書いているので、Rustの記事を近いうちに書こうと思います。（最後だけ C#じゃない（笑））
Rustのコードは正直、自分にはわかりにくいです（笑）
書きなればそんなことはないんでしょうが、というかそれはどの言語でも同じですね…。
最初の方は他の.rsファイルを読み込むためのフォルダ構成を作るだけでもややこしく感じましたし、最近はWebAssemblyを作るということになったんですが、そもそも自分は WebAssemblyを知らないし、JavaScriptですら余り詳しくないという不適合すぎる条件でなんとか作成しました。（すごい初歩的なところでつまずきました（笑））
その経験を記録しておこうと思います（笑）

雑談が長い！ということで今回はここで終わります。最後までお付き合い頂きありがとうございました。