컨트롤(Controls)에는 모든 종류의 속성과 이와 관련된 많은 이벤트가 있지만 지금은 VBA 프로그래밍에 사용되는 몇 가지 속성만 살펴보겠습니다.
3개의 컨트롤(Label, TextBox 및 CommandButton)을 추가하는 것부터 시작해 보겠습니다.
다음 결과를 얻으려면 텍스트가 포함된 Caption 속성을 사용하여 이 컨트롤의 이름과 속성을 편집합니다.
이제 숫자를 입력하고 확인을 클릭하면 아무 일도 일어나지 않습니다.
액션을 생성하기 위해 텍스트 상자에 입력된 값을 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에 이미 저장되어 있습니다.
두 번째 캡션(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
입력된 값은 다음 문자를 입력할 때마다 테스트됩니다.
양식에 입력된 값에 대한 확인(validation)을 추가해야 합니다. 값이 숫자가 아닌 경우 메시지가 표시됩니다.
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
결과는 다음과 같습니다.
다음은 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 또는 때로는 Radio Buttons이라고도 함)을 사용할 때 사용자는 한 번에 여러 상자를 선택할 수 있는 확인란과 달리 "그룹"당 하나의 옵션만 선택할 수 있습니다.
"그룹"을 만들려면 먼저 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!"라는 값이 입력됩니다. 선택한 셀에서
오류를 방지하려면 사용자가 두 가지 옵션 세트 중에서 올바르게 선택했는지 확인해야 합니다.
이 예에서는 양식이 아직 완료되지 않은 경우 확인 버튼("Confirm")이 회색으로 표시됩니다(비활성화됨). 가장 쉬운 해결책은 아니지만 양식(UserForm) 중간에 함수/프로시저가 유용한 이유를 보여주는 좋은 예입니다.
버튼을 비활성화하려면 텍스트와 Enabled 속성을 편집하십시오.
결과는 다음과 같습니다:
이전 코드에서는 두 개의 For Each 루프를 사용하여 옵션 버튼(Option Buttons)의 값을 가져왔습니다. 이제 확인 버튼("Confirm")과 10가지 옵션에 대한 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
우리가 해야 할 일은 옵션 버튼이 올바르게 선택되었는지(두 개의 함수를 호출하여) 확인하고 필요할 때 해당 버튼을 활성화하는 프로시저를 만드는 것뿐입니다.
다시 한번 확인은 각 라디오 버튼의 각 이벤트에 대해 코드가 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