Сброс формы в 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
Microsoft имеет это документировано довольно хорошо для последней версии Access. Похоже, что некоторые из ответов выше относятся к более старым версиям. Приведенный ниже код отлично работает в моем приложении. Я включил только типы элементов управления, которые мне нужны, но вы можете найти документацию для любых других в ссылках Microsoft ниже.
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
что работает для меня, по крайней мере, для флажков и полей со списком.