2012-10-10 22 views
6

Aşağı açılanlar, metin alanları, onay kutuları ve radyolar gibi çeşitli seçim seçeneklerine sahip bir VBA formum var.VBA'da sıfırlama formu

Tüm bu alanları tek bir tuşla basmanın en iyi yolunu öğrenmek istedim. Bir arkadaşım bana aşağıdaki kodu e-posta ile göndermeye çalıştı ama maalesef işe yaramadı, değişken isimlerini kontrol ettim.

Bunu nasıl geliştirebileceğim konusunda herhangi bir öneriniz var mı?

Şimdiden teşekkürler.

Private Sub btnReset_Click() 

Unload Me 
UserForm.Show 

End Sub 

Burada, kullanıcı formu için diğer kod.

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 

cevap

14

Sanırım Unload Me hattına isabet ettiğinde, kod yürütme durur ve bu yüzden sizin için çalışmıyor. İşte formdaki kontrollerin tümünü (çoğunu) sıfırlamak için genel bir olay prosedürü.

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 

O ComboBoxes ve ListBoxes yeniden doldurmak değil, sadece ne istediğini varsayalım budur seçimi, temizler.

+0

Teşekkürler zekice çalışır – methuselah

5

Bu sorunun neredeyse 2 yaşında olduğunu biliyorum ama böyle bir cevap arıyordum. Ancak, Access 2010 kullanarak ve beklendiği gibi işlev tamamen işe yaramadı keşfetti am:

  • ctl'i basit bir metin kutusu için Kontrol
  • olarak Dim-ed olabilir ctl.Text özellik yalnızca atanabilir

    : kontrol odağı varsa
  • bir seçenek, bir değer akılda bu konularla Yani

atanamaz bir OptionGroup parçasıysa, işte yeniden yazılmış fonksiyondur (yerine ctl.Value kullanın)

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 atama, ListIndex özelliğini yanlış kullandığım hatası alıyorum. Ctl = Null – Hill

2

Bunu denemek olabilir:

Private Sub btnReset_Click() 

    Call UserForm_Initialize 

End Sub 
+2

'u kullanmak zorunda kaldım. Katkınız, yaklaşımınızın yıllar önce yapılmış olan önerilere göre neden avantajlara sahip olduğunu açıklarsanız siteye daha fazla değer katabilirsiniz ... –

+1

Lütfen daha fazla açıklama ekleyin. Bu uzunluk ve içerik için gözden geçirme altında geldi. Cevabın düzelmediği bir noktada silinebilir. –

+0

@CindyMeister - Eh, bir tane için çok daha az kod. Ayrıca, yukarıdaki çözümler, form ilk yüklendiğinde (bir formu "sıfırlamak" gerekirse) denetimlerin durumunu dikkate almaz. Çözüm işe yarayacaksa bu açık olmalı. Maalesef öyle değil. Access, yöntemin tanımlanmadığını söyler. – Hill

0

Microsoft bu Access son sürümü için şimdi oldukça iyi belgelenmiş bulunmaktadır. Yukarıdaki yanıtlardan bazılarının eski sürümlerine başvurması gibi görünüyor. Aşağıdaki kod, uygulamanızda mükemmel bir şekilde çalışıyor. Sadece ihtiyacım olan kontrol türlerini ekledim, ancak aşağıdaki Microsoft bağlantılarında başkaları için belgeleri bulabilirsiniz.

Ref: birleşik giriş kutusu için size değer ayarlayarak önce orada odaklamayı ayarlamak zorunda 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 

Not. Ref: