수색…


모범 사례

UserForm 은 디자이너와 기본 인스턴스 가있는 클래스 모듈입니다. 설계자는 코드 숨김 보는 동안 Shift + F7을 눌러 액세스 할 수 있으며, 코드 숨김 디자이너를 보는 동안 F7 키를 눌러 액세스 할 수 있습니다.


매번 새로운 인스턴스로 작업하십시오.

따라서 클래스 모듈 이므로 양식은 객체청사진 입니다. 양식은 상태 및 데이터를 보유 할 수 있으므로 기본 / 전역 인스턴스 가 아닌 클래스의 새 인스턴스 로 작업하는 것이 더 좋습니다.

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        '...
    End If
End With

대신에:

UserForm1.Show vbModal
If Not UserForm1.IsCancelled Then
    '...
End If

기본 인스턴스로 작업하면 폼이 빨간색 "X"버튼으로 닫히거나 코드 숨김에서 Unload Me 가 사용될 때 미묘한 버그가 발생할 수 있습니다.


논리를 다른 곳에 구현하십시오.

양식은 프리젠 테이션 과 관련이 있어야합니다. 데이터베이스에 연결하고 사용자 입력을 기반으로 매개 변수화 된 쿼리를 실행하는 버튼 Click 핸들러는 너무 많은 작업을 수행 합니다.

대신 전용 모듈 및 프로 시저에서 폼을 표시하거나 더 나은 코드를 표시하는 코드에 응용 로직 을 구현하십시오.

사용자 정의 폼이 데이터를 표시하고 수집하는 방법을 아는 데만 책임을지는 방식으로 코드를 작성하십시오. 데이터가 어디서 왔는지, 나중에 데이터가 어떻게되는지는 걱정할 필요가 없습니다.


호출자는 컨트롤을 사용해서는 안됩니다.

전용 클래스 모듈에서 작업하거나 폼의 코드 숨김 자체에서 캡슐화 된 폼에 대해 잘 정의 된 모델 을 만들고 Property Get 프로 시저로 모델 을 노출하고 클라이언트 코드에서 이러한 코드를 사용하게하십시오. 컨트롤에 대한 추상화 와 핵심적인 세부 사항을 작성하여 관련 데이터 만 클라이언트 코드에 표시합니다.

이는 다음과 같은 코드를 의미합니다.

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        MsgBox .Message, vbInformation
    End If
End With

대신 이것 :

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then
        MsgBox .txtMessage.Text, vbInformation
    End If
End With

QueryClose 이벤트를 처리하십시오.

양식은 일반적으로 닫기 버튼을 가지고 있고, 프롬프트 / 대화 상자가 확인이 버튼을 취소; 사용자는 기본적으로 양식 인스턴스를 파괴하는 양식의 제어 상자 (빨간색 "X"단추)를 사용하여 양식을 닫을 수 있습니다 ( 매번 새로운 인스턴스작업하는 또 다른 이유).

With New UserForm1
    .Show vbModal
    If Not .IsCancelled Then 'if QueryClose isn't handled, this can raise a runtime error.
        '...
    End With
End With

QueryClose 이벤트를 처리하는 가장 간단한 방법은 Cancel 매개 변수를 True 로 설정 한 다음 양식을 닫지 않고 숨기는 것입니다.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = True
    Me.Hide
End Sub

그런 식으로 "X"버튼은 인스턴스를 파괴하지 않으며 호출자는 모든 공용 멤버에 안전하게 액세스 할 수 있습니다.


숨기기, 닫지 마.

객체를 생성하는 코드는 객체를 파기해야합니다. 객체를 언로드하고 종료하는 것은 폼의 책임이 아닙니다.

양식의 코드 숨김에서 Unload Me 를 사용하지 마십시오. Call Me.Hide 대신 폼을 닫을 때 생성 한 개체를 호출 코드에서 계속 사용할 수 있도록합니다.


물건 이름을 지정하십시오.

속성 도구 창 ( F4 )을 사용하여 양식의 각 컨트롤 이름을 신중하게 지정하십시오. 컨트롤의 이름은 코드 숨김에 사용되므로이를 처리 할 수있는 리팩토링 도구를 사용하지 않는 한 컨트롤의 이름을 바꾸면 코드가 손상 될 수 있으므로 처음부터 올바르게 수행하는 것이 좋습니다. TextBox12 가 의미하는 20 개의 텍스트 상자 중 정확히 어느 것을 퍼즐로 TextBox12 .

일반적으로 UserForm 컨트롤의 이름은 헝가리 식 접두사로 지정됩니다.

  • 사용자 이름을 나타내는 Label 컨트롤의 lblUserName 입니다.
  • 사용자가 사용자 이름을 입력 할 수있는 TextBox 컨트롤의 txtUserName 입니다.
  • 사용자가 사용자 이름을 입력하거나 선택할 수있는 ComboBox 컨트롤의 cboUserName 입니다.
  • 사용자가 사용자 이름을 선택할 수있는 ListBox 컨트롤의 lstUserName 입니다.
  • btnOk 또는 "OK"레이블이 붙은 Button 컨트롤의 cmdOk .

문제는 재 설계하고 도착 때 UI 예이다 ComboBox A와 변경 ListBox분리하는 - 그들이 무엇을 나타내는 지에 대한 이름 컨트롤에 더 나은, 오히려 그들의 통제 유형 후보다 : 이름이 새로운 제어 유형을 반영하기 위해 변경해야 가능한 한 UI에서 코드를 작성하십시오.

  • UserNameLabel 은 사용자 이름을 나타내는 읽기 전용 레이블입니다.
  • UserNameInput 가 사용자 이름을 입력하거나 선택할 수있는 컨트롤의 UserNameInput 입니다.
  • "Ok"라고 표시된 명령 단추에 대한 OkButton .

어떤 스타일을 선택하든 모든 컨트롤을 기본 이름으로 두는 것보다 낫습니다. 명명 스타일의 일관성도 이상적입니다.

QueryClose 처리

QueryClose 이벤트는 양식이 닫히려고 할 때마다 발생하며, 사용자 작업을 통하거나 프로그래밍 방식을 통해 발생합니다. CloseMode 매개 변수에는 양식 닫는 방법을 나타내는 VbQueryClose 열거 형 값이 들어 있습니다.

일정한 기술
vbFormControlMenu 사용자 조치에 대한 응답으로 양식이 닫힙니다. 0
vbFormCode Unload 문에 대한 응답으로 폼이 Unload . 1
vbAppWindows Windows 세션이 끝났습니다. 2
vbAppTaskManager Windows 작업 관리자가 호스트 응용 프로그램을 닫습니다.
vbFormMDIForm VBA에서 지원되지 않음 4

가독성을 높이려면 값을 직접 사용하는 대신 이러한 상수를 사용하는 것이 가장 좋습니다.


취소 할 수있는 사용자 정의 폼

취소 단추가있는 양식이 제공됩니다.

일부 샘플 양식

양식의 코드 숨김은 다음과 같을 수 있습니다.

Option Explicit
Private Type TView
    IsCancelled As Boolean
    SomeOtherSetting As Boolean
    'other properties skipped for brievety
End Type
Private this As TView

Public Property Get IsCancelled() As Boolean
    IsCancelled = this.IsCancelled
End Property

Public Property Get SomeOtherSetting() As Boolean
    SomeOtherSetting = this.SomeOtherSetting
End Property

'...more properties...

Private Sub SomeOtherSettingInput_Change()
    this.SomeOtherSetting = CBool(SomeOtherSettingInput.Value)
End Sub

Private Sub OkButton_Click()
    Me.Hide
End Sub

Private Sub CancelButton_Click()
    this.IsCancelled = True
    Me.Hide
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = VbQueryClose.vbFormControlMenu Then
        Cancel = True
        this.IsCancelled = True
        Me.Hide
    End If
End Sub

그러면 호출 코드가 양식을 표시하고 취소되었는지 여부를 알 수 있습니다.

Public Sub DoSomething()
    With New UserForm1
        .Show vbModal
        If .IsCancelled Then Exit Sub
        If .SomeOtherSetting Then
            'setting is enabled
        Else
            'setting is disabled
        End If
    End With
End Sub

IsCancelled 속성은 취소 단추를 클릭 할 때 또는 사용자가 컨트롤 상자를 사용하여 폼을 닫을 때 True 반환합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow