2012-10-10 29 views
6

Tôi có biểu mẫu VBA với nhiều tùy chọn lựa chọn khác nhau bao gồm thả xuống, trường văn bản, hộp kiểm và radio.Đặt lại biểu mẫu trong VBA

Tôi chỉ muốn biết cách tốt nhất để xóa tất cả các trường này bằng cách nhấn nút. Một người bạn của tôi đã cố gắng giúp đỡ bằng cách gửi email cho tôi mã bên dưới nhưng tiếc là nó không hoạt động, tôi đã kiểm tra các tên biến.

Bất kỳ lời khuyên nào về cách tôi có thể cải thiện nó?

Xin cảm ơn trước.

Private Sub btnReset_Click() 

Unload Me 
UserForm.Show 

End Sub 

Đây là mã khác cho biểu mẫu người dùng.

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 

Trả lời

14

Tôi nghĩ khi nó chạm vào dòng Unload Me, thực thi mã dừng và đó là lý do tại sao nó không hoạt động cho bạn. Đây là một thủ tục sự kiện chung để đặt lại tất cả (hầu hết) các điều khiển trên biểu mẫu.

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 

Nó không thay đổi lại ComboBoxes và ListBox, chỉ xóa lựa chọn, đó là những gì tôi cho là bạn muốn.

+0

Cảm ơn nó hoạt động rực rỡ – methuselah

5

Tôi biết câu hỏi này gần 2 tuổi NHƯNG Tôi đang tìm câu trả lời như thế này. Tuy nhiên, tôi đang sử dụng Access 2010 và đã khám phá ra chức năng không hoạt động hoàn toàn như mong đợi:

  • ctl có thể Dim-ed đơn giản như Control
  • Đối với một textbox, tài sản ctl.Text chỉ có thể được gán cho nếu kiểm soát có trọng tâm (sử dụng ctl.Value thay)
  • Nếu một Option là một phần của một OptionGroup nó không thể được gán một giá trị

Vì vậy, với những vấn đề này trong tâm trí, đây là chức năng viết lại tôi:

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

Đối với ctl.Phân bổ ListIndex, tôi nhận được lỗi rằng tôi đang sử dụng thuộc tính ListIndex không chính xác. Tôi đã phải sử dụng ctl = Null – Hill

2

Bạn có thể thử này:

Private Sub btnReset_Click() 

    Call UserForm_Initialize 

End Sub 
+2

Đóng góp của bạn sẽ bổ sung thêm giá trị cho trang web nếu bạn đưa ra giải thích tại sao cách tiếp cận của bạn có lợi thế so với các đề xuất đã đưa ra, năm trước ... –

+1

Vui lòng thêm giải thích thêm. Điều này xuất hiện dưới sự xem xét về chiều dài và nội dung. Nó có thể bị xóa tại một số điểm nếu câu trả lời không được cải thiện. –

+0

@CindyMeister - Vâng, đó là ít hơn rất nhiều mã cho một. Ngoài ra, các giải pháp trên không tính đến trạng thái điều khiển khi biểu mẫu được tải lần đầu (có thể được yêu cầu nếu một biểu mẫu được "đặt lại" biểu mẫu). Điều này nên rõ ràng ... nếu giải pháp hoạt động. Thật không may, nó không. Access cho tôi biết phương thức không được định nghĩa. – Hill

0

Microsoft có tài liệu này khá tốt ngay bây giờ cho phiên bản mới nhất của Access. Có vẻ như một số câu trả lời ở trên đề cập đến các phiên bản cũ hơn. Mã bên dưới đang hoạt động hoàn hảo trong ứng dụng của tôi. Tôi chỉ bao gồm các loại điều khiển tôi cần nhưng bạn có thể tìm thấy tài liệu cho bất kỳ người nào khác trong các liên kết của Microsoft bên dưới.

Ref: 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 

Lưu ý rằng cho hộp combo bạn phải đặt trọng tâm đó trước khi đặt giá trị. Ref: https://msdn.microsoft.com/en-us/vba/access-vba/articles/combobox-seltext-property-access

0

Thêm vào câu trả lời gần đây nhất - nếu một số điều khiển của bạn có giá trị mặc định, bạn có thể sử dụng

ctl.Value = ctl.DefaultValue

nào làm việc cho tôi, ít nhất là cho các hộp kiểm và hộp combo.

Các vấn đề liên quan