2012-10-10 5 views
6

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

答えて

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歳であることを知っていますが、私はこのような答えを探していました。しかし、私がアクセス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 - まあ、それは1つのための多くのコードです。また、上記のソリューションは、フォームが最初に読み込まれたときのコントロールの状態を考慮しません(フォームを「リセットする」必要がある場合もあります)。解決策が働いた場合、これは明らかです。残念ながら、それはしません。アクセスはメソッドが定義されていないことを示します。 – Hill

0

マイクロソフトでは、このアクセスの最新バージョンを今かなりよく文書化されています。上記の回答のいくつかは古いバージョンを参照しているようです。以下のコードは私のアプリで完全に動作しています。私は必要なコントロールタイプのみを含んでいましたが、以下のマイクロソフトのリンクで他のドキュメントを見つけることができます。

参考:コンボボックスのためにあなたが値を設定する前に、そこにフォーカスを設定する必要があること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

を使用することができます。

関連する問題