Сброс формы в 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

5 ответов


Я думаю, что когда он попадает в строку выгрузить меня, выполнение кода останавливается, и поэтому он не работает для вас. Вот общая процедура событий для сброса всех (большинства) элементов управления в форме.

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

Он не заполняет комбо-боксы и списки, просто очищает выбор, что, как я предполагаю, вы хотите.


Я знаю, что этот вопрос почти 2 лет, но я искал ответ, как это. Однако я использую Access 2010 и обнаружил, что функция работает не совсем так, как ожидалось:

  • ctl можно затемнить-ed просто как управление
  • для текстового поля ctl.Свойство Text можно назначить, только если элемент управления имеет фокус (используйте ctl.Значение)
  • если OptionButton является частью OptionGroup он не может быть назначен значение

Итак, имея в виду эти проблемы, вот моя переписанная функция:

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

вы можете попробовать это:

Private Sub btnReset_Click()

    Call UserForm_Initialize

End Sub

Microsoft имеет это документировано довольно хорошо для последней версии Access. Похоже, что некоторые из ответов выше относятся к более старым версиям. Приведенный ниже код отлично работает в моем приложении. Я включил только типы элементов управления, которые мне нужны, но вы можете найти документацию для любых других в ссылках Microsoft ниже.

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

обратите внимание, что для поля со списком вы должны установить фокус там, прежде чем задать значение. Ref: https://msdn.microsoft.com/en-us/vba/access-vba/articles/combobox-seltext-property-access


добавление к последнему ответу - если некоторые из ваших элементов управления имеют значения по умолчанию, вы можете использовать

ctl.Value = ctl.DefaultValue

что работает для меня, по крайней мере, для флажков и полей со списком.