TOP

VBA-レッスン 12.4。制御要素 (演習)

YouLibreCalc for Excel logo

次に、コントロール (Controls) の使用を練習するための小さな演習を見てみましょう。


既製のフォームとコントロール要素を含むファイルがあります。ユーザーがフォームとの対話を通じて即席のデータベースにデータを入力できるように、すべての要素が機能するコードを記述する必要があります。

ダウンロードする Excel ファイルは次のとおりです: controls_exercise.xls

ここでの目的は、フォームを使用してテーブルにデータを入力することであることが明らかです。

考慮すべき点がいくつかあります:

  • 国のリストは 2 枚目のシートに基づいています。
  • 新しい連絡先を追加する前に、コントロール要素の値を確認します。
  • 値を入力した後、フォームを閉じずにコントロールの初期値を返します。
  • 問題を解決する方法の 1 つ

    まず、使いやすくするために、フォームの Zoom プロパティを 120 に増やす必要があります。

    オプション ボタンのチェックについては (コントロールに関する最初のレッスンで) すでに説明したので、ここでは簡単な解決策を使用します。

    「Mrs」はデフォルトで選択されています (プロパティ Value: True)。つまり、選択時にアドレスはチェックされません。

    閉じるボタン

    Private Sub CommandButton_Close_Click()
         Unload Me
    End Sub
    

    ドロップダウンリストの内容

    Private Sub UserForm_Initialize() 'フォームが開いているときにリストをロードする
        For i = 1 To 252 'Country ワークシートから 252 か国のリストを生成する
           ComboBox_Country.AddItem Sheets("Country").Cells(i, 1)
        Next
    End Sub
    

    制御要素の確認

    簡単な解決策は、いずれかのコントロールが空の場合にダイアログを表示することです。

    Private Sub CommandButton_Add_Click()
         If TextBox_Last_Name.Value = "" Or TextBox_First_Name.Value = "" Or TextBox_Address.Value = "" Or TextBox_Place.Value = "" Or ComboBox_Country.Value = "" Then
             MsgBox "Form incomplete"
         Else
             'ここに連絡先を入力する手順...
         End If
    End Sub
    

    ただし、もう少し複雑にするために、各要素を個別にチェックする必要があります。要素のいずれかが空の場合は、その名前 () の色が赤に変わる必要があります。

    Private Sub CommandButton_Add_Click()
         'タイトルの色を黒に設定します
         Label_Last_Name.ForeColor  = RGB(0, 0, 0)
         Label_First_Name.ForeColor = RGB(0, 0, 0)
         Label_Address.ForeColor    = RGB(0, 0, 0)
         Label_Place.ForeColor      = RGB(0, 0, 0)
         Label_Country.ForeColor    = RGB(0, 0, 0)
    
         'コンテンツコントロール
         If TextBox_Last_Name.Value = "" Then '何も指定しない場合...
             Label_Last_Name.ForeColor = RGB(255, 0, 0) 'タイトルの色を赤に設定します
         ElseIf TextBox_First_Name.Value = "" Then
             Label_First_Name.ForeColor = RGB(255, 0, 0)
         ElseIf TextBox_Address.Value = "" Then
             Label_Address.ForeColor = RGB(255, 0, 0)
         ElseIf TextBox_Place.Value = "" Then
             Label_Place.ForeColor = RGB(255, 0, 0)
         ElseIf ComboBox_Country.Value = "" Then
             Label_Country.ForeColor = RGB(255, 0, 0)
         Else
             'ここに連絡先を入力する手順...
         End If
    End Sub
    

    データの挿入

    次のコードを上記のコードで示された場所に挿入する必要があります (コメントを参照)。

     Dim row_number As Integer, salutation As String
    
     'アピールの選択
     For Each salutation_button In Frame_Salutation.Controls
         If salutation_button.Value Then
             salutation = salutation_button.Caption '異議申し立てが選択されました
         End If
     Next
    
     'row_number = 列 +1 の空でない最後のセルの行番号
     row_number = Range("A65536").End(xlUp).Row + 1
    
     'ワークシートへの値の挿入
     Cells(row_number, 1) = salutation
     Cells(row_number, 2) = TextBox_Last_Name.Value
     Cells(row_number, 3) = TextBox_First_Name.Value
     Cells(row_number, 4) = TextBox_Address.Value
     Cells(row_number, 5) = TextBox_Place.Value
     Cells(row_number, 6) = ComboBox_Country.Value
    
     '貼り付け後は元の値が返されます
     OptionButton1.Value = True
     TextBox_Last_Name.Value  = ""
     TextBox_First_Name.Value = ""
     TextBox_Address.Value    = ""
     TextBox_Place.Value      = ""
     ComboBox_Country.ListIndex = -1
    

    一般の見かけ

    以上です。ここに、演習用の完成したコードとダウンロードするファイルがあります。

    Private Sub CommandButton_Close_Click()
         Unload Me
    End Sub
    
    Private Sub UserForm_Initialize() '「国」シート上の 252 か国のリスト
        For i = 1 To 252
            ComboBox_Country.AddItem Sheets("Country").Cells(i, 1)
        Next
    End Sub
    
    Private Sub CommandButton_Add_Click()
         '名前の色を黒に設定します
         Label_Last_Name.ForeColor  = RGB(0, 0, 0)
         Label_First_Name.ForeColor = RGB(0, 0, 0)
         Label_Address.ForeColor    = RGB(0, 0, 0)
         Label_Place.ForeColor      = RGB(0, 0, 0)
         Label_Country.ForeColor    = RGB(0, 0, 0)
    
         'コンテンツコントロール
         If TextBox_Last_Name.Value = "" Then '何も指定しない場合...
             Label_Last_Name.ForeColor = RGB(255, 0, 0) 'タイトルの色を赤に設定します
         ElseIf TextBox_First_Name.Value = "" Then
             Label_First_Name.ForeColor = RGB(255, 0, 0)
         ElseIf TextBox_Address.Value = "" Then
             Label_Address.ForeColor = RGB(255, 0, 0)
         ElseIf TextBox_Place.Value = "" Then
             Label_Place.ForeColor = RGB(255, 0, 0)
         ElseIf ComboBox_Country.Value = "" Then
             Label_Country.ForeColor = RGB(255, 0, 0)
         Else
             'フォームに入力すると、値がワークシートに貼り付けられます
             Dim row_number As Integer, salutation As String
             
             'アピールの選択
             For Each salutation_button In Frame_Salutation.Controls
                 If salutation_button.Value Then
                     salutation = salutation_button.Caption
                 End If
             Next
    
             'row_number = 列 +1 の空でない最後のセルの行番号
             row_number = Range("A65536").End(xlUp).Row + 1
    
             'ワークシートへの値の挿入
             Cells(row_number, 1) = salutation
             Cells(row_number, 2) = TextBox_Last_Name.Value
             Cells(row_number, 3) = TextBox_First_Name.Value
             Cells(row_number, 4) = TextBox_Address.Value
             Cells(row_number, 5) = TextBox_Place.Value
             Cells(row_number, 6) = ComboBox_Country.Value
             
             'データを挿入した後、初期値を返します
             OptionButton1.Value = True
             TextBox_Last_Name.Value  = ""
             TextBox_First_Name.Value = ""
             TextBox_Address.Value    = ""
             TextBox_Place.Value      = ""
             ComboBox_Country.ListIndex = -1
         End If
    End Sub
    

    ダウンロード用の Excel ファイルは次のとおりです: controls_exercise2.xls