Excelのセル選択ボックスをVBAで実現する

Excelを操作していると、セルを選択するダイアログボックスがあることに気付きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/9e5af96f-1ec7-7036-574e-197f15e4123c.png)
このようなボックスは、Excelのセルをドラッグするとその範囲のセル番地名を入力してくれます。
これが自作のVBAのツールの中でできればなんてすばらしいんでしょう。
ところが。テキストボックスでも、ドロップダウンでもないので、どこから入れるものなのか。
Excelの操作部品である以上、どこかには入れる手段があるんじゃないかと。
実はこれ、あったんです。
#RefEdit
この部品、名称はRefEditと言います。
リボンの中の開発タブを表示させて、挿入の中のコントロールの選択をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/6f2f8b46-4aff-f5c5-d28f-fdff24bdf5ca.png)
コントロールの一覧から「RefEdit.Ctrl」を選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/4a3bfded-6d7d-e8c9-e808-11f5b3c7331e.png)
あとはシート上ど適当にドラッグすれば、この部品が入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/b59fbc9a-7907-b21e-a543-02ac9c6ba95b.png)
なんかそれっぽいのが入りましたよね！
でこれを右クリックしてプロパティを設定していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/dbf81b09-4769-1301-fc45-556286d9daa6.png)
LinkedCellにこの部品で入れた値をリンクするセルを指定。
で、デザインモードを解除して実行！！

どんだけやってもボタンがクリックできないし、ドラッグしても何も反応しない。

手詰まり！
というわけにもいかないので、いろいろプロパティを探ってみましたが、やはりできないのでこの方法は一旦諦めて、ユーザーフォームから出す方法を考えました。
#ユーザーフォームからのRefEdit
よく考えたら、Excelのセル選択ボタンはすべてダイアログボックス上にあるものしか見たことないのでユーザーフォームでもできるんじゃないかと思って、VBEを起動して、ユーザーフォームを追加しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/fb1e4304-e354-078d-740d-d9f4d4ba3f41.png)
で、ユーザーフォーム上にRefEditって配置するボタンってどっから挿入すんのかなって挿入メニューとか探ってみたけどもない。（そういえばVBEってまだリボンインターフェースじゃないのね）
こういう時はだいたいあるべきところを右クリックすれば何か起きるので、コントロールダイアログボックスを右クリックしたら、やっぱり出てきました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/49759711-ba31-c418-73d4-f66374332ea6.png)
その他のコントロールをクリックしたら、RefEdit.Ctrlが選べましたのでOKします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/b83e7b18-8c62-28c3-7076-6078ecc8230e.png)

コントロールにRefEditが追加された！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/ca9b554d-7d70-99fc-d018-7ae3b1d8341b.png)
ではこれをクリックしてフォーム上をドラッグします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/3377f700-d83f-d027-6bd2-7bb09a00f3c5.png)
フォーム上にできた！！
あと、OKボタンも追加して、ボタンをダブルクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/b50574e9-c9de-99c7-6c4e-d7309e475ccd.png)
OKボタンをクリックしたときに動作するコードを記述できるので、
Private SubからEnd Subの間に次のコードを記述します

```vb
Dim re
re = RefEdit1.Value
Range(re).Value = "34"
```

RefEdit1はRefEditコントロールに初めから設定されている名前。わかりやすい名前に書き換え推奨。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/7ceb0e23-c319-a477-3bdb-bda8f4b379a7.png)
こんどは、このフォームを呼び出す方法ですが、今のままではフォームはExcel側からは開けないので、開くためのマクロを記述します。
標準モジュールを追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/d8b7b8c3-1621-85f5-c78d-180a7a524e57.png)
次のようなコードを標準モジュールに追加します。
UserForm1はユーザーフォームを追加した時に初めから設定されてる名前、変更推奨。

```vb
Sub セル選択()
  UserForm1.Show
End Sub
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/5a8df6af-ed91-b64d-c405-e3ed49fc130d.png)
Excelに戻って、表示のマクロからマクロの表示。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/ecd50ed5-ec1b-bb52-888b-f9da52b41c5e.png)
この中にセル選択があるので実行。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/227e78d1-fee2-c065-82bc-64bf5ac5c17f.png)
UserForm1が表示され、セル選択できます！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/86294f33-e1a7-bac2-1834-cb2956133b0f.png)
OKボタンをクリックすると選択範囲に34の文字が入ります！！
#応用
こんな感じでオリジナルのセル選択を使ったダイアログボックスも作れるかなと。
今回で言う、マクロ名「セル選択」のマクロはリボンに登録することもできるし、ショートカットキーも設定できます。
だからExcel機能の一つをこれで作れると思います。
また、範囲の指定をするのであれば、For Eachループとはものすごく相性がよくて。
OKボタンにこんなコードを仕込めば、範囲の分、１からの数値を埋めてくれます。

```vb
Private Sub CommandButton1_Click()
  Dim i As Range
  Dim y As Integer
  For Each i In Range(RefEdit1)
      y = y + 1
      i.Value = y
  Next
End Sub
```