#概要
「ブックのオープンイベントやボタンのクリックイベントでユーザーフォームを開いて処理を開始して,標準モジュールを呼ぶ」
それが基本的な処理であることは間違いありません。しかし,どうしても処理の途中でユーザーに選択してもらわないと後処理の都合上うまくいかないときがあります。
標準モジュールからユーザーフォームの部品の値の設定をするのは簡単ですが,ユーザーの選択結果を標準モジュールで受け取るところでつまづいたのでまとめます。
#ユーザーフォームの値を設定する
これは簡単で,標準モジュール内で
・ユーザーフォーム名.コントロール名.プロパティ
・ユーザーフォーム名.コントロール名.メソッド
とすれば,普通にユーザーフォームの各部品にアクセスできます。
Sub input_userform1()
UserForm1.Label1.Caption = "標準モジュールから値を設定しました"
UserForm1.ComboBox1.Text = "任意の作家名"
Dim i As Integer
i = 1
Do While Cells(i, 1) <> ""
UserForm1.ComboBox1.AddItem Cells(i, 1)
i = i + 1
Loop
UserForm1.Show
Unload UserForm1
End Sub
![2020-08-12.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F622636%2F36fbd868-391b-a76c-9d2e-26794f3b0706.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=4dcb26d79e043eaeb934e1deb5e5a6be)
#ユーザーフォームの結果を受け取る
まず,ユーザーフォームをどうやって閉じるか,という問題があります。
今回の場合,「OK」ボタンで閉じることとします。
まずはやりがちなうまくいかない例から。
Private Sub CommandButton1_Click()
Unload UserForm1
End Sub
UserForm1.Show
Dim result As String
result = UserForm1.ComboBox1.Text
MsgBox result
![2020-08-12 (1).png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F622636%2F2886ee8c-a026-4718-f587-d3901396bec8.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=208e5fb6df70e0302e745f61304e3980)
うまく動きません。それもそのはず,値を取得する前,ユーザーフォームを閉じた段階でUnloadしているのですから,部品の値も取得できなくなってしまうのです。
かといって,ユーザーフォームが開かれている間は次の処理にいかないので,ユーザーフォームを開いている間に値を変数に入れたりはできません。
ではどうするかというと,ユーザーフォームをいったん隠してしまえばよいのです。
Private Sub CommandButton1_Click()
UserForm1.Hide
End Sub
ユーザーフォーム側では,Unloadではなくhideを使ってユーザーフォームを隠し,次の処理に進みます。
UserForm1.Show
Dim result As String
result = UserForm1.ComboBox1.Text
Unload UserForm1
MsgBox result
標準モジュール側で必要な値を変数に入れるなどしてから,ユーザーフォームをUnloadします。
結果を標準モジュールのメッセージボックスで受け取ることができました。
標準モジュールの処理の最中にユーザーフォームを呼べるようになると,ユーザーフォームの活用の幅が更に広がりますよね。