Excel VSTO での入力ダイアログは InputBox で？

# 背景
業務改善でちょっとした作業を楽にしようとする場合の選択肢として、Local で VSTO 開発ってのがあります。

いつもはリボンにドラッグ＆ドロップで必要な UI を配置していくだけで悩むこともないんですが、文字列の入力ダイアログを用意しようとしたら・・・ないって事に今日気付きました。OpenFileDialog とかなら普通にあるのにね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/399f0f22-a3d1-455c-1e6e-a6f636f86d79.png)

リボン上で TextBox 配置して入力させるって手もあるんですが、流石に使いにくいので普段使いには微妙。
ってことで、標準？の InputBox を調べてみました。

# 結論
https://docs.microsoft.com/ja-JP/office/vba/api/Excel.Application.InputBox

こいつ使うだけですね 😅

ちょっと使い方に悩んだので、補足的な情報を
まぁ、今回欲しかった文字列の入力には、Type = 2 ってだけでしたが。

# Parameters
[パラメーター](https://docs.microsoft.com/ja-JP/office/vba/api/Excel.Application.InputBox#parameters) は以下のように説明がある程度

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/c5e187da-9421-ecac-d195-399de008e54b.png)
InputBox 上ですぐわかる部分はこんな感じ。Left/Top で表示位置制御も出来るので、MessageBox よりは使いやすい？
ただ、HelpFile/HelpContextID は・・
Type によって、Default や Return Type が変わるので注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/81945920-aa17-b0b7-7ea6-2a738a45c97c.png)

## Type
[Type](https://docs.microsoft.com/ja-JP/office/vba/api/Excel.Application.InputBox#remarks) の補足はこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f7812303-572a-86d8-80a6-6d166473d928.png)


## 実際の使用例
動画が途中でフォーカスずれてるのは御愛嬌

指定した型入力しかできないのかな？とか思ったけど、Formula はそもそも型でもなく、何のチェックされてるのかも不明

数値と論理については、型チェックされてる。
ただ、キャンセルされた時には、想定の型と違うので、対処必要。

エラーはなにかさっぱり分からない。

配列は、選択範囲の値が配列として取得出来てるように見えるが・・詳細は未調査。
Range を大量取得する場合、配列取得で高速化するわけだけど、この配列使うと速い・・かも？
そもそも値だけほしい時には便利かも。

### 数式
> Type が 0 の場合、InputBox は =2*PI()/360 のようにテキストの形式で数式を返します。 数式に参照がある場合は、A1 形式の参照として返されます。 （参照形式の変換には、ConvertFormula を使用してください）。

> If Type is 0, InputBox returns the formula in the form of text; for example, =2*PI()/360. If there are any references in the formula, they are returned as A1-style references. (Use ConvertFormula to convert between reference styles.)

数式の参照は、A1-style って話で英語説明も書いてあるが、取得はなんか違ってるので注意？
![数式.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/395e6fcd-7ed5-bb5b-ae76-ce16c0febfdd.gif)

### 数値
![数値.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/13e478a5-0964-857d-4aef-ed030f940d72.gif)

### 文字列
![論理値.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e0c86bdc-6d12-2e67-f96b-61f2de5b8cba.gif)

### 論理値
![セル参照.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/1d94dcc5-d3bf-09d8-4492-5a86b3179daa.gif)

### セル参照
![文字列.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8491dd8b-b078-0ca9-355d-4e67466d5c76.gif)

### エラーと配列
![エラーと配列.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/bc7f293b-7705-8f51-b713-ed815d3720c7.gif)

### コード例
```c#:利用例
        enum TypeValue
        {
            Formula = 0,	// 数式
            Number = 1,		// 数値
            String = 2,		// 文字列 (テキスト)
            Bool = 4,		// 論理値 (True または False)
            Range = 8,		// セル参照 (Range オブジェクト)
            Errors = 16,	// #N/A などのエラー値
            Array = 64,		// 値の配列
        }
        private void ButtonPoC4InputBox_Click(object sender, RibbonControlEventArgs e)
        {
            var result = Globals.ThisAddIn.Application.InputBox(TypeValue.Formula.ToString(), "Type 比較", Type.Missing, 50, 50, Type.Missing, Type.Missing, TypeValue.Formula);
            MessageBox.Show(result);
        }
```

# GitHub
VSTO で試行した記録も残しておかないとねってことで。

https://github.com/baku2san/PoC4VSTO

# keyword
how to use Excel.Application.InputBox in VSTO