C++でXLLアドインを作成する

# はじめに
xlwを使用してC++で自作のワークシート関数(ユーザー定義関数、User-defined functions、UDFs)を作成する方法です。VBAマクロで作成した関数と異なり、高速で処理をすることができます。

[XLW - A Wrapper for the Excel API](https://xlw.github.io/)  
[GitHub - xlw/xlw: git repository for xlw - Excel xlls made easy](https://github.com/xlw/xlw)

:::note warn
xlwは正式リリース版ではないため注意。
:::

サンプルとして引数を倍にするだけの関数を作成します。  
   ![nibai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/0bcc5e87-2141-c6c8-f633-73c88be2e66d.gif)

# 作成方法

1. Visual Studio を起動します。  

2. 「新しいプロジェクトの作成」を押します。  
   ![cxll01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/ba0cfc67-2aa6-ede7-5b5d-7fb914160bcb.png)

3. 「C++」の「空のプロジェクト」を選択して「次へ」を押します。  
   ![cxll02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/80b9f475-f0e1-90eb-336e-fc4cce79a987.png)

4. プロジェクト名と保存先（ここでは`C:\work\xlw`）を設定して「作成」を押します。  
   ![cxll03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/cf3bee24-1c47-5cf3-8ed2-48e3c4322d2a.png)

5. 立ち上がったら、「NuGet パーッケージの管理」を開きます。  
   ![cxll04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/c789c9c5-e835-315f-780f-5ac38ee3fabf.png)

6. 参照を押して、「プレリリースを含める」にチェックを入れた後「xlw」を検索。「xlw」が結果に出てくるので選択。「ライセンスの表示」をクリックしてライセンスを確認した後「インストール」を押します。  
   ![cxll05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/84593be3-d8c9-3a31-e42b-e0bfff8660e1.png)


7. 「OK」を押します。  
   ![cxll06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/3c333aa8-af74-6581-2bad-66da8fc261d9.png)

8. ライセンスへの同意をする場合は「I Accept」を押します。同意しない場合は「I Decline」を押します。同意しない場合は使用できないためここで終了します。  
   ![cxll07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/0a93b4a4-de15-39c5-5b4f-311fadfba7c1.png)

9. インストールが完了したら「NuGet: Project1」を閉じます。  
   ![cxll08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/7277cb31-0a96-8e37-70bd-69db9f55b2ae.png)

10. ソースファイルsource.cppを開いて、引数を倍にするコードを書きます。  
   ![cxll09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/4f80b121-2e50-8931-5394-c227b449d281.png)

11. ヘッダーファイルcppinterface.hを開いて、関数のプロトタイプ宣言を書きます。  
   ![cxll10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/3466fbbc-f34f-993a-832b-4e5492612872.png)

12. プロジェクトのプロパティを開きます。  
   ![cxll11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/bdbe16ee-9da5-9b0e-0ca4-5bc1db78e24c.png)

13. 構成の種類として「ダイナミック ライブラリ (.dll)」を選択し「OK」を押します。  
   ![cxll12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/ef7722df-5806-7468-6890-e18640dd954c.png)

14. リビルドします。これでXLLアドイン`C:\work\xlw\Project1\x64\Debug\Project1.xll`が作成されます。  
   ![cxll13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/c867e0f7-2126-f8aa-0d3b-1c5f5b5db0c5.png)

# XLLアドインの登録

作成したXLLアドインを登録して使えるようにします。とりあえず試してみたいだけの場合は「[一時的に利用する場合](#一時的に利用する場合)」を参照してください。

## 常に利用する場合

1. Excelを開いて「開発」タブ→「Excelアドイン」をクリック。アドイン画面が出るので「参照」を押します。  
   ![cxll14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/6bf797c5-6781-07c8-bb3e-a2183af3a601.png)

2. 「ファイルの参照」画面が出るので作成したXLLファイルのパス`C:\work\xlw\Project1\x64\Debug\Project1.xll`を入力し「OK」を押します。  
   ![cxll15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/9b2ef56f-185a-4960-aba8-a7ad39520f8d.png)

3. 「OK」を押します。これで登録は完了です。  
   ![cxll16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/18168ac0-31f1-9e99-c3a1-e6d6625b05ba.png)

**アドインを解除し一覧から削除する方法**

1. Excelを閉じて、XLLアドインの名前を適当に変更します。  
   ![del1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/dde7c8c1-b1c9-3071-cb4a-b87152054d2e.png)

2. Excelを開きます。下記のメッセージが表示された場合は「OK」を押します（表示されない場合は操作不要です）。  
   ![del2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/1272bdb8-6f98-a76b-a4ba-1863eecacdb4.png)

3. 上記と同じ操作でアドイン画面を出して、チェックを外します。  
   ![del3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/9c000775-04b7-fcbd-f0a2-a30b70ac3795.png)

4. リストから削除するかメッセージが出るので「はい」を押します。  
   ![del4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/4b3d0d1e-63cb-c3c8-67fa-90953b7702e5.png)

※レジストリから直接削除する場合

`HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\***\Excel\Add-in Manager`

## 一時的に利用する場合

1. 作成したXLLファイル`C:\work\xlw\Project1\x64\Debug\Project1.xll`を実行します。  
   ![cxll17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/d8621b6c-e800-faf1-87d0-33360dbeacf6.png)

2. Excelが立ち上がり通知が表示されるので、「このアドインをこのセッションに限り有効にする」を押します。これで完了ですが、ワークシートがないと関数が利用できないため引き続き作業を進めます。  
   ![cxll18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/a9eceb7b-8104-2d27-c49f-5a7a365288cc.png)

3. 左上の「ファイル」クリックします。  
   ![cxll19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/93b9b530-d335-de0a-bee9-116422d91b42.png)

4. 「新規」をクリックした後「空白のブック」をクリックします（新規ブックが開きます）。  
   ![cxll20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/e611c661-8e86-bc8c-48d3-ccd43ad6ef51.png)

# 使用する

関数を入力して機能しているか確認します。  
   ![nibai.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/0bcc5e87-2141-c6c8-f633-73c88be2e66d.gif)


# 補足

1. 「数式」タブの「関数の挿入」をクリックすると、  
   ![cxll21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/9928b87c-943e-c02f-fb7f-270f440081b7.png)

2. 以下のように表示されます。  
   ![cxll22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193449/c0e5722a-2dad-e3ae-b9ff-0850afd3d30a.png)