2012-10-10 5 views
6

드롭 다운, 텍스트 필드, 확인란 및 라디오를 포함한 다양한 선택 옵션이있는 VBA 폼이 있습니다.VBA에서 서식 다시 설정

단추 누르기로 모든 필드를 지우는 가장 좋은 방법에 대해 알고 싶었습니다. 내 친구가 나에게 아래 코드를 전자 메일로 보내려고했지만 불행히도 작동하지 않는다. 변수 이름을 확인했다.

개선 방법에 대한 조언이 있으십니까?

미리 감사드립니다.

Private Sub btnReset_Click() 

Unload Me 
UserForm.Show 

End Sub 

다음은 userform의 다른 코드입니다.

Dim DeptCode 'Holds department code 

Private Sub UserForm_Initialize() 

    Dim c_deptCode As Range 
    Dim c_deptName As Range 
    Dim deptCodes As Variant 
    Dim deptNames As Variant 

    Dim ws_dept As Worksheet 
    Set ws_dept = Worksheets("lookupDept") 

    ' Assign each range to an array containing the values 
    deptCodes = Choose(1, ws_dept.Range("deptCode")) 
    deptNames = Choose(1, ws_dept.Range("deptName")) 

    For i = 1 To ws_dept.Range("deptCode").Rows.Count 
     ' Create the combined name (code + space + name) 
     CombinedName = deptCodes(i, 1) & " - " & deptNames(i, 1) 
     cbo_deptCode.AddItem CombinedName 
    Next i 

End Sub 

답변

14

언로드 (Unload Me) 라인에 부딪 힐 때 코드 실행이 중단되고 그 이유가 작동하지 않는 것 같습니다. 다음은 폼의 모든 컨트롤을 재설정하는 일반적인 이벤트 프로 시저입니다.

Private Sub cmdReset_Click() 

    Dim ctl As MSForms.Control 

    For Each ctl In Me.Controls 
     Select Case TypeName(ctl) 
      Case "TextBox" 
       ctl.Text = "" 
      Case "CheckBox", "OptionButton", "ToggleButton" 
       ctl.Value = False 
      Case "ComboBox", "ListBox" 
       ctl.ListIndex = -1 
     End Select 
    Next ctl 

End Sub 

ComboBox 및 ListBox를 다시 채우지 않고 원하는대로 선택을 지우는 것입니다.

+0

감사합니다. 훌륭하게 작동합니다. – methuselah

5

나는이 질문이 거의 2 살이지만, 나는 이와 같은 대답을 찾고 있음을 알고있다. 그러나, 나는 액세스 2010을 사용하고 예상대로 기능이 전혀 작동하지 않았다 발견 오전 :

  • CTL은 단순히 텍스트 상자에 대한 제어
  • 으로 희미 에드 될 수 있으며, ctl.Text의 속성은 할당 할 수 있습니다

    : 컨트롤이 포커스가있는 경우
  • OptionButton는이 값을 염두에두고이 문제에 따라서

를 할당 할 수없는 OptionGroup의 일부인 경우가 여기 내 재 작성 기능입니다 (대신 ctl.Value 사용)

Private Sub resetForm() 

    Dim ctl As Control ' Removed MSForms. 

    For Each ctl In Me.Controls 
     Select Case TypeName(ctl) 
      Case "TextBox" 
       ctl.value = "" 
      Case "CheckBox", "ToggleButton" ' Removed OptionButton 
       ctl.value = False 
      Case "OptionGroup" ' Add OptionGroup 
       ctl = Null 
      Case "OptionButton" ' Add OptionButton 
       ' Do not reset an optionbutton if it is part of an OptionGroup 
       If TypeName(ctl.Parent) <> "OptionGroup" Then ctl.value = False 
      Case "ComboBox", "ListBox" 
       ctl.ListIndex = -1 
     End Select 
    Next ctl 

End Sub 
+0

ctl.ListIndex 할당, 내가 ListIndex 속성을 잘못 사용하고있어 오류가 나타납니다. 나는 ctl = Null을 사용해야 만했습니다. – Hill

2

이 작업을 시도 할 수 있습니다 :

Private Sub btnReset_Click() 

    Call UserForm_Initialize 

End Sub 
+2

수년 전 제안 된 것보다 당신의 접근 방식이 이점을 갖는 이유에 대한 설명을 포함하면 기여도가 사이트에 더 많은 가치를 부여합니다. –

+1

자세한 설명을 추가하십시오. 이것은 길이와 내용에 대한 검토하에 나타났습니다. 대답이 개선되지 않으면 어느 시점에서 삭제 될 수 있습니다. –

+0

@CindyMeister - 글쎄, 코드가 적다. 또한 위의 솔루션은 양식을 처음로드 할 때 컨트롤 상태를 고려하지 않습니다 (폼을 "재설정"하는 데 필요할 수 있음). 솔루션이 작동하면 이는 분명해야합니다. 불행히도, 그렇지 않습니다. 액세스 방법이 정의되지 않은 것을 알려줍니다. – Hill

0

Microsoft는이 액세스의 최신 버전인지 잘 알려져있다. 위의 답변 중 일부는 이전 버전을 나타냅니다. 아래 코드는 내 앱에서 완벽하게 작동합니다. 필자가 필요로하는 컨트롤 유형 만 포함되었지만 아래의 Microsoft 링크에서 다른 유형의 설명서를 찾을 수 있습니다.

참조 : 콤보 상자 당신이 값을 설정하기 전에 거기에 포커스를 설정해야한다는 https://msdn.microsoft.com/en-us/vba/access-vba/articles/textbox-controltype-property-access?f=255&MSPPError=-2147217396

Dim ctl As Control 

For Each ctl In Me.Controls 
    With ctl 
     Select Case .ControlType 
      Case acTextBox 
       .Value = "" 
      Case acCheckBox 
       .Value = False 
      Case acComboBox 
       .SetFocus 
       .SelText = "" 
      Case acListBox 
       .Value = Null 
     End Select 
    End With 
Next ctl 

참고. 참조 :

관련 문제