Excel-DNAを使って.NETでエクセルアドイン（.xll）をつくる

Excel-DNAというものでアドインファイル（.xll）をつくってみました！
.NETにてエクセルアドインをつくることができます。
簡単にできそうでしたが、自分の環境のせいで色々とつまったので、そのメモです。

こちらでは非同期処理をしてみました！

https://qiita.com/msms/items/0978934282c0067e6450

追記
[TargetFrameworkについて](#targetframeworkについて)


# 準備
vscode
エクセル2019 32bit
- dotnet new classlib -n ExcelDnaAddin 
- dotnet add package ExcelDna.Addin
- ターゲットフレームワークをnet6に変える
  - .csprojファイルのPropertyGroup内の変更
  - `<TargetFramework>net6.0-windows</TargetFramework>`

## TargetFrameworkについて
- [net8もサポート](https://groups.google.com/g/exceldna/c/MB8hufGTyZw/m/du4PhqgvAAAJ)されているようです
- `<TargetFramework>net8.0-windows</TargetFramework>`

# Getting Startedのために
[Getting Started](https://excel-dna.net/docs/getting-started)
ドキュメントの内容を実行してもエクセルは起動しない。
classlibなのでそれはそう。
msbuildでビルドされるだけなので。

```c#
using ExcelDna.Integration;

public static class MyFunctions
{
  [ExcelFunction(Description = "My first .NET function")]
  public static string SayHello(string name)
  {
    return "Hello " + name;
  }
}
```

## vscodeでの場合
vscodeでの場合について以下にありました。
launchの内容を変えて、デバッグビルド時にエクセルを起動するようにします。
⇒エクセルがx32だからなのかエラーがでてダメなようです。
https://groups.google.com/g/exceldna/c/N_MzRcBB2hs/m/XVEqWMiIBAAJ

```launch.json
"program": "C:/Program Files (x86)/Microsoft Office/root/Office16/EXCEL.EXE",
"args": ["${workspaceFolder}/bin/Debug/net6.0-windows/ExcelDnaAddin.dll"],
```
エラー
```
プログラム 'C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE'を開始できません。.NET デバッガーは、x64 プロセスのみをデバッグできます。
```

## ビルドした時に32bitのエクセルを起動させたい
以下記事を参考に色々試しましたが、tasks.jsonから実行する方法としました。
msbuildが64bit対応になっていることが関係しそう？

- [C#(.NET Core6.0)をx86でVSCodeのビルド実行できるまで コード -532462766 (0xe0434352) で終了の解消](https://qiita.com/mylifewithviolin/items/80486f0f7f9e80c5c3ac)
- [MSBuild に対する Visual Studio 2022 の 64bit プロセス化の影響](https://qiita.com/uikou/items/278f7d81bc823f97b8e7)

## launchとtasksの変更
最終的にこのようにしました。

### launch.json
preLaunchTaskをbuildからappExcelに変更。
```
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (console)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "appExcel",
            // "preLaunchTask": "build",
            "program": "${workspaceFolder}/bin/Debug/net6.0-windows/ExcelDnaAddin.dll",
            "args": [],
            "cwd": "${workspaceFolder}",
            "console": "internalConsole",
            "stopAtEntry": false
        }
```
### tasks.json
エクセルを起動するためのappExcelを追加。
`${workspaceFolder}/bin/Debug/net6.0-windows/publish/debug.xlsx`にデバッグで使うようのエクセルを保存しておく。
```tasks.json
        {
            "label": "appExcel",
            "command": "C:/Program Files (x86)/Microsoft Office/root/Office16/EXCEL.EXE",
            "type": "process",
            "args": ["${workspaceFolder}/bin/Debug/net6.0-windows/publish/ExcelDnaAddin-AddIn-packed.xll",
                        "${workspaceFolder}/bin/Debug/net6.0-windows/publish/debug.xlsx"],
            "problemMatcher": [],
            "dependsOn": "build",
        },
```

これでビルドしてエクセルの起動までできました！
![debugDNA.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383487/00b3213e-372b-f590-cc18-fc9a27bbe524.gif)

# xllを使用する
[Installing Your Add-in](https://excel-dna.net/docs/guides-basic/installing-your-add-in)

- publishフォルダ内に、xllへパッケージ化されたファイルが保存されているはずです
- 呼び出すエクセルファイルと同じフォルダに、xllファイルを置きます
- `ThisWorkbook`の`Workbook_Open`へ以下を入れて、ファイルを開く時にxllを読み込むようにします
- 条件付きコンパイラで32bit/64bitにより読み込むファイルを切り替えるようにしています
  -  [コンパイラ定数](https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/compiler-constants)

```vb
Option Explicit

Private Sub Workbook_Open()

    #If Win64 Then
        Application.RegisterXLL Me.Path + "\ExcelDnaAddin-AddIn64-packed.xll"
    #Else
        Application.RegisterXLL Me.Path + "\ExcelDnaAddin-AddIn-packed.xll"
    #End If

End Sub
```

- これでExcel-DNAでの関数を呼び出す事ができます
- ワークシートからの呼び出しは、`=SayHello(引数)`
- vbaにての呼び出しは、`tmp = Application.Run("SayHello", 引数)`

# Excel-DNAをスポンサー
- [govert](https://github.com/govert)さんという方がほとんど一人で開発されているようです
- [SQLiteForExcel](https://github.com/govert/SQLiteForExcel)で知ったのですが色々な事されている方世界にはいますね！
- [https://github.com/sponsors/Excel-DNA](https://github.com/sponsors/Excel-DNA)で応援しましょう



# 参考
- https://excel-dna.net/
- https://groups.google.com/g/exceldna
- https://github.com/sponsors/Excel-DNA
- https://qiita.com/nekotadon/items/34d78aaf286d5c8bc0b8