TOP

VBA-レッスン 12.2。コントロール (Controls)

コントロール (Controls) には、あらゆる種類のプロパティとそれに関連付けられた多くのイベントがありますが、ここでは、VBA でのプログラミングで使用されるいくつかのプロパティだけを見ていきます。


まず、3 つのコントロール - Label、TextBox、および CommandButton を追加します。

このコントロールの名前とプロパティを編集すると (テキストを含む Caption プロパティを使用)、次の結果が得られます。

ここで、数値を入力して「OK」をクリックしても、何も起こりません。

アクションを作成するには、テキスト ボックスに入力した値をセル A1 に書き込み、フォームを閉じるイベントを追加します。

コントロールをダブルクリックすると、以下に示すオプションにアクセスできます。

このドロップダウン リストには、さまざまなコントロールとこのフォームが含まれています。

ボタン (Button) と Click イベントを選択します。

Private Sub CommandButton_validate_Click()

     Range("A1") = Textbox_number.Value
     'Textbox_number はテキスト ボックスの名前です。
     'Value は、テキスト ボックスの値を含むプロパティです。
    
     Unload Me
     'アンロードするとフォーム (UserForm) が閉じます
     'フォーム名の代わりに Me を使用します (このコードは閉じたい UserForm の途中にあるため)
End Sub

入力した値は、このフォーム (UserForm) を閉じる前にセル A1 に保存されています。

2 番目のキャプション (Label) を追加し、次のプロパティを編集します: Caption、Forecolor (色: 赤)、および Visible (デフォルト コントロールを非表示にする場合は False)。

次に、テキスト フィールドの値がユーザーによって変更されたときに発生するイベントを追加しましょう。値が数値でない場合、イベントはエラー メッセージを表示します。

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'IFは数値です...
         Label_error.Visible = False 'タイトル (Label) は非表示です
     Else 'さもないと...
         Label_error.Visible = True '名前が表示される
     End If
End Sub

入力された値は、次の文字が入力されるたびにテストされます。

フォームに入力された値の検証(検証)を追加する必要があります。値が数値でない場合は、メッセージが表示されます。

Private Sub CommandButton_validate_Click()
     If IsNumeric(Textbox_number.Value) Then 'IFは数値です...
         Range("A1") = Textbox_number.Value 'A1にコピー
         Unload Me '閉店します
     Else 'さもないと...
         MsgBox "Incorrect value" '無効な値
     End If
End Sub

エラー メッセージがないときにフォームの右側が空のままにならないように、このフォームの Width プロパティを調整してサイズを減らすことができます。

Private Sub Textbox_number_Change()
     If IsNumeric(Textbox_number.Value) Then 'IFは数値です...
         Label_error.Visible = False 'タイトル (Label) は非表示です
         Me.Width = 156 'フォーム幅
     Else 'さもないと...
         Label_error.Visible = True '名前が表示される
         Me.Width = 244 'フォーム幅
     End If
End Sub

Excel サンプル ファイルをダウンロードできます: userform1.xls

結果は次のとおりです。

チェックボックスes

CheckBox の使用例を次に示します。

チェックボックスをオンまたはオフにすると、Click イベントを使用して、関連するセルの値を変更できます。

Private Sub CheckBox1_Click() 'ナンバー1
     If CheckBox1.Value = True Then '選択した場合...
        Range("A2") = "Checked"
     Else '選択されていない場合...
        Range("A2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox2_Click() '2番
     If CheckBox2.Value = True Then '選択した場合...
        Range("B2") = "Checked"
     Else '選択されていない場合...
        Range("B2") = "Unchecked"
     End If
End Sub

Private Sub CheckBox3_Click() '番号 3
     If CheckBox3.Value = True Then '選択した場合...
        Range("C2") = "Checked"
     Else '選択されていない場合...
        Range("C2") = "Unchecked"
     End If
End Sub

この例では、フォームを初めて開いたとき、チェックボックスは最初はオフになっています。

対応するセルの値が「Checked」(「Checked」) のときに各チェックボックスをチェックするには、UserForm_Initialize を使用してフォームのアクティブ化のチェックを実行します。

Private Sub UserForm_Initialize() 'チェックが入っている場合
     If Range("A2") = "Checked" Then
         CheckBox1.Value = True
     End If
     
     If Range("B2") = "Checked" Then
         CheckBox2.Value = True
     End If
     
     If Range("C2") = "Checked" Then
         CheckBox3.Value = True
     End If
End Sub

完成した Excel ファイルの例を次に示します。 userform2.xls

オプション ボタン (Option Buttons)

オプション ボタン (Option Buttons、または Radio Buttons とも呼ばれる) を使用する場合、ユーザーは一度に複数のボックスにチェックを入れることができるチェックボックスとは異なり、「グループ」ごとに 1 つのオプションのみを選択できます。

「グループ」を作成するには、まず Frame を挿入し、次に OptionButton を挿入します。

完成した Excel ファイルの例を次に示します: userform3.xls

フォームを送信すると、選択した列名 (column_value) と行 (row_value) に関連付けられたセルにデータが入力されます。

どのオプションが選択されているかを確認するには、前の例と同じことを (チェックボックスを使用して) 実行できますが、コード サイズを減らすためにループを使用します。

これまで説明したことのないタイプのループである For Each ループを使用します。このループにより、「オブジェクト グループ」内の各オブジェクトに対して命令を実行できます。

Private Sub CommandButton1_Click()
     Dim column_value As String, row_value As String
     
     '各 Frame_column コントロールのループ
     For Each column_button In Frame_column.Controls
         'コントロール値 = True の場合 (選択されている場合) ...
         If column_button.Value Then
            '変数「column_value」はボタンのテキスト値を受け取ります
            column_value = column_button.Caption
         End If
     Next
     
     '別のブロックのサイクル
     For Each row_button In Frame_row.Controls
         If row_button.Value Then
             row_value = row_button.Caption
         End If
     Next

     Range(column_value & row_value) = "Cell chosen!"  '「セルが選択されました!」
     
     'フォームを閉じる(アンロード)(私)
     Unload Me
End Sub

フォームに「Cell selected!」という値が入力されるようになりました。選択したセル内。

エラーを回避するには、ユーザーが 2 つのオプション セットから正しく選択したかどうかを確認する必要があります。

この例では、フォームがまだ完了していない場合、確認ボタン (「confirm」) がグレー表示 (無効) になります。これは最も簡単な解決策ではありませんが、フォーム (UserForm) の途中で関数/プロシージャが役立つ理由を示す良い例です。

テキストと Enabled プロパティを編集してボタンを無効にします。

結果は次のようになります。

前のコードでは、2 つの For Each ループを使用して、オプション ボタン (Option Buttons) の値を取得しました。ここで、10 個のオプションの [確認] ボタン (「confirm」) と Click イベントに同じ値を使用する必要があります。

これを行うには、各イベントのループをコピーする必要はなく、関数を通じてループを呼び出します。

前のコードを開始して変更すると、次の結果が得られます。

 Private Function column_value()
 '選択したボタンのテキスト値を返す関数 (column_value)
     For Each column_button In Frame_column.Controls
         If column_button.Value Then
             column_value = column_button.Caption
         End If
     Next
 End Function

 Private Function row_value()
 '選択したボタンのテキスト値を返す関数 (row_value)
     For Each row_button In Frame_row.Controls
         If row_button.Value Then
             row_value = row_button.Caption
         End If
     Next
 End Function

 Private Sub CommandButton1_Click() 'クリックしたときに実行されるアクション (「選択を確認する」)
     Range(column_value & row_value) = "Cell chosen!"  '「セルが選択されました!」
     'column_value および row_value は、これらの関数によって返される値です。
     Unload Me
 End Sub

あとは、オプション ボタンが正しく選択されているかどうかを (2 つの関数を呼び出して) チェックし、必要に応じてそのボタンをアクティブにするルーチンを作成するだけです。

ここでも、各ラジオ ボタンのイベントごとにコードを 10 回コピーする必要がないように、検証は別の手順で行われます。

Private Sub activate_button()
 '条件のテストが成功した場合にボタンをアクティブにする
     If column_value <> "" And row_value <> "" Then
     'column_value および row_value は、これらの関数によって返される値です。
         CommandButton1.Enabled = True
         CommandButton1.Caption = "Confirm your selection"  '「選択内容を確認します」
     End If
End Sub

Private Sub OptionButton11_Click()
     activate_button '「activate_button」プロシージャを開始します
End Sub
Private Sub OptionButton12_Click()
     activate_button
End Sub
Private Sub OptionButton13_Click()
     activate_button
End Sub
Private Sub OptionButton14_Click()
     activate_button
End Sub
Private Sub OptionButton15_Click()
     activate_button
End Sub
Private Sub OptionButton16_Click()
     activate_button
End Sub
Private Sub OptionButton17_Click()
     activate_button
End Sub
Private Sub OptionButton18_Click()
     activate_button
End Sub
Private Sub OptionButton19_Click()
     activate_button
End Sub
Private Sub OptionButton20_Click()
     activate_button
End Sub

完成した Excel ファイルの例を次に示します。 userform3b.xls