ユーザーフォームを使ってみよう

少なくともデータ分析のためのプログラムを作るうえでは上の図において丸で囲まれている6個の機能を把握しておけば大丈夫だと思われます。それぞれの名称はマウスのカーソルを合わせれば表示されるので確認してみてください。
以下,それぞれについての簡単な機能を紹介しますが,実際に例を真似てみたほうが分かり易いのでとりあえず「こんなことができるのか」という感じで受け取っておいてください。
@ラベル
これは説明などを書くためのもので,特に使い方などはありません。
Aテキストボックス
ユーザーフォーム上で数値データ,文字,セル(またはセル範囲)を入力するために使います。
Bチェックボックスとオプションボタン
チェックボックスもオプションボタンも基本的な機能は同じです。ただしチェックボックスの場合は1つのユーザーフォーム上でいくつチェックしても良いのですが,オプションボタンの場合は1つしかチェックができません。
Cコマンドボタン
コードエディタに記述したプログラムを実行させるためのものです。
DRefEdit
ワークシート上のセル(またはセル範囲)のアドレスを取得するために使います。
使用するコントロール:ラベル,テキストボックス,コマンドボタン
手順1.まずは以下のようにユーザーフォームを作成してください。

手順2.ユーザーフォームを終了させるためのマクロを[終了]ボタンに登録します。
[終了]ボタンをダブルクリックするとコードウィンドウが現れるので次のようにコードを記述してください。
Private Sub CommandButton2_Click()
Unload UserForm1
End Sub
コードの記述が終わったら1度コードウィンドウを閉じて,ユーザーフォームを実行させてみてください。そのときに[終了]ボタンをクリックするとユーザーフォームが終了するはずですので確認してみてください。
手順3.テキストボックスに入力された値を取得するためのプログラムを作成し,[実行]ボタンをクリックするとそのプログラムが実行されるようにします。
手順2と同じく,[実行]ボタンをダブルクリックするとコードウィンドウが開きますので,そこに以下のようなコードを記述してください。
Private Sub CommandButton1_Click()
Dim num As Integer
Dim hani As String
'TextBox1に対する処理
If TextBox1.Value = "" Then
MsgBox "テキストボックスに値が入力されていません"
Exit Sub
Else
num = TextBox1.Value
End If
MsgBox "テキストボックスに入力された値は" & num & "です"
'TextBox2に対する処理
If TextBox2.Text = "" Then
MsgBox "テキストボックスにセルまたはセル範囲が入力されていません"
Exit Sub
Else
hani = TextBox2.Text
End If
MsgBox "テキストボックスに入力されたセルまたはセル範囲は" & hani & "です"
Range(hani).Select
End Sub
コードの解説
'TextBox1に対する処理
もしテキストボックスに値が入力されていない場合はメッセージボックスに「テキストボックスに値が入力されていません」と表示し,プロシージャを終了します。テキストボックスに値が入力されていた場合はその値をnumに代入し,メッセージボックスでその値を表示させます。
'TextBox2に対する処理
もしテキストボックスにセル範囲が入力されていない場合はメッセージボックスで警告を表示してプロシージャを終了させます。セル範囲が入力されていた場合はhaniにセル範囲を代入し,それをメッセージボックスで表示した後,入力したセル範囲を選択します。
チェックボックスとオプションボタンの使い方
使用するコントロール:ラベル,テキストボックス,チェックボックス,コマンドボタン
とりあえず次のようなユーザーフォームを作成します。

前回と同じように[終了]ボタンをダブルクリックしてコードウィンドウを開き,以下のようにコードを記述しましょう。ただし今度はUserForm2であることに注意してください。
Private Sub CommandButton2_Click()
Unload UserForm2
End Sub
さらに[実行]ボタンをダブルクリックしてコードウィンドウを開きます。そして以下のようなコードを記述してください。
Private Sub CommandButton1_Click()
Dim num1 As Double, num2 As Double, sum As Double
'テキストボックスの値を取得
If TextBox1.Value = "" Then
MsgBox "値が入力されていません"
Exit Sub
ElseIf TextBox2.Value = "" Then
MsgBox "値が入力されていません"
Exit Sub
End If
num1 = TextBox1.Value
num2 = TextBox2.Value
'チェックボックスにチェックが入っている場合の処理
num1 = IIf(CheckBox1.Value = True, num1 ^ 2, num1)
num2 = IIf(CheckBox2.Value = True, num2 ^ 2, num2)
sum = num1 + num2
MsgBox sum
Range("A1").Value = IIf(CheckBox3.Value = True, sum, "")
End Sub
コードの解説
'チェックボックスにチェックが入っている場合の処理
チェックボックスを使用する際にはIIf()関数を使用します。上の例で説明すると、、、
num1 = IIf(CheckBox1.Value = True, num1 ^ 2, num1)
チェックボックスにチェックが入っていたらnum1を2乗した値をnum1に代入,そうでなければnum1に代入されている値をそのまま代入する。
つまり,現在num1という変数にはテキストボックスに入力した値(例えば2)が代入されているわけですから,チェックボックスにチェックが入っている場合は2^2=4という値がnum1という変数に代入され直すわけです。チェックが入っていない場合はそのままnum1に代入されている値(つまり2)が代入されるわけですから,num1に代入されている値は最初のままということになります。
Range("A1").Value = IIf(CheckBox3.Value = True, sum, "")
チェックボックス3にチェックが入っていた場合はセルA1に計算結果が出力されます。そうでない場合は空白が出力されます(つまりなにも出力されない)。
また,次のオプションボタンの使い方で紹介するようにIIf()関数を使用しなくても,If〜Thenステートメントを使用しても同じようなことができます。
使用するコントロール:ラベル,テキストボックス,オプションボタン,コマンドボタン
今度は次のようなユーザーフォームを作成してください。

[終了]ボタンについては前回までと同様なので説明は省きます(今度はUserForm3であることに注意してください)。[計算]ボタンをダブルクリックし,以下のコードを記述します。
Private Sub CommandButton1_Click()
Dim num1 As Double, num2 As Double, result As Double
If TextBox1.Value = "" Then
Exit Sub
ElseIf TextBox2.Value = "" Then
Exit Sub
End If
num1 = TextBox1.Value
num2 = TextBox2.Value
If OptionButton1.Value = True Then
result = num1 + num2
ElseIf OptionButton2.Value = True Then
result = num1 - num2
ElseIf OptionButton3.Value = True Then
result = num1 * num2
ElseIf OptionButton4.Value = True Then
result = num1 / num2
Else
MsgBox "どれか選択してください"
End If
MsgBox result
End Sub
コードの解説
要はオプションボタンにチェックが入っていた場合に足し算なり掛け算なりの値をresultという変数に代入させるわけです。特に難しいことはないので問題ないと思いますが,上で紹介したようなIIf()関数を使ってもできますし,場合によって(オプションボタンの数が多いときなど)はSelect〜Caseステートメントを使用するのも良いかもしれません。
RefEditとはコントロールの1番左下にあるやつです。これはどういう機能を持っているかというと単一セルあるいはセル範囲のアドレスを取得するというものですが,言葉で説明してもイマイチわかりにくいでしょうから実際にやってみましょう。
まずRefEditを使用する前に次のようなユーザーフォームを作成してください。これはテキストボックスに入力したセル範囲を選択するというだけのものですが、これではワークシートのデータが入力されている範囲を自分で見て,それを入力するのではメンドクサイです。

[セルを選択ボタンに記述するコード]
Private Sub CommandButton1_Click()
Dim hani As String
hani = TextBox1.Text
Range(hani).Select
End Sub
[終了ボタンに記述するコード]
Private Sub CommandButton2_Click()
Unload UserForm4
End Sub
そこでRefEditを使用すればこんなことができてしまいます。以下のようなコードを記述して実行させてみてください。これを応用すればデータ分析のためのプログラムを作成する際にとても操作しやすいものを作れるようになるでしょう。

[セルを選択ボタンに記述するコード]
Private Sub CommandButton1_Click()
Dim hani As String
hani = RefEdit1.Text
Range(hani).Select
End Sub
[終了ボタンに記述するコード]
Private Sub CommandButton2_Click()
Unload UserForm5
End Sub
[補足:Application.InputBoxを使用する場合と同じようにするには、、、]
Sub sample()
Dim Myrange As Range
Set Myrange = Application.InputBox("データ範囲を入力して下さい", Type:=8)
Myrange.Select
End Sub
Private Sub CommandButton1_Click()
Dim hani As String
Dim Myrange As Range
hani = RefEdit1.Text
Set Myrange = Application.Range(hani)
Myrange.Select
End Sub