8

ドロップダウン、テキストフィールド、チェックボックス、ラジオなど、さまざまな選択オプションを備えた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
4

5 に答える 5

19

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

ComboBoxesとListBoxesを再設定するのではなく、選択をクリアするだけです。これは、私が望むものだと思います。

于 2012-10-10T16:51:51.707 に答える
6

私はこの質問がほぼ2歳であることを知っていますが、私はこのような答えを探していました。ただし、Access 2010を使用していて、関数が期待どおりに完全に機能しないことを発見しました。

  • ctlは、Controlとして単純に暗くすることができます
  • テキストボックスの場合、ctl.Textプロパティは、コントロールにフォーカスがある場合にのみ割り当てることができます(代わりにctl.Valueを使用してください)
  • 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
于 2015-03-19T08:25:11.327 に答える
2

Microsoftは、最新バージョンのAccessについて、これをかなり適切に文書化しています。上記の回答のいくつかは古いバージョンを参照しているようです。以下のコードは私のアプリで完全に機能しています。必要なコントロールタイプのみを含めましたが、他のドキュメントは以下の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

于 2017-11-10T13:54:50.727 に答える
2

最新の回答に追加-一部のコントロールにデフォルトがある場合は、次を使用できます

ctl.Value = ctl.DefaultValue

これは、少なくともチェックボックスとコンボボックスでは機能します。

于 2018-02-13T19:43:11.060 に答える
1

あなたはこれを試すことができます:

Private Sub btnReset_Click()

    Call UserForm_Initialize

End Sub
于 2016-01-22T13:57:47.170 に答える