2012-10-10 159 views
6

我有一個VBA表格,包含多種選擇選項,包括下拉菜單,文本字段,複選框和收音機。在VBA中重置表格

我只是想知道最好的方法來清除所有這些領域的按鈕按下。我的一位朋友試圖通過向我發送下面的代碼給我發郵件,但不幸的是它不起作用,我檢查了變量名稱。

有關如何改善它的任何建議?

在此先感謝。

Private Sub btnReset_Click() 

Unload Me 
UserForm.Show 

End Sub 

這是用戶表單的其他代碼。

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 

它不重新填充組合框和列表框,只是清除選擇,這是我想你想要的。

+0

感謝它的出色工作 – methuselah

5

我知道這個問題差不多2歲,但我一直在尋找這樣的答案。但是,我使用Access 2010中,發現如預期的功能並沒有完全工作:

  • CTL可暗淡-ED只是作爲控制
  • 對於一個文本框,在ctl.Text屬性只能分配給如果控件有焦點(使用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鏈接中找到任何其他文檔。

編號: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 

注意,組合框,你必須設置值之前有設置焦點。 編號:https://msdn.microsoft.com/en-us/vba/access-vba/articles/combobox-seltext-property-access

0

添加到最近的答案 - 如果你的一些控件有缺省值,你可以使用

ctl.Value = ctl.DefaultValue

對我來說,至少對於複選框和組合框其中一期工程。