2017-10-12 54 views
0

EXCEL VBAで作業しているユーザーフォームにリセットボタンを追加する必要があります。私はほとんどの作業を行う次のコードを持っていますが、refeditコントロールをクリアする方法はわかりません。これは私がこれまで持っているものです。excel vbaユーザーフォームのすべてのrefeditコントロールをクリアする

===

'Reset Button 
Private Sub CommandButton2_Click() 

    For Each ctrl In Me.Controls 

     Select Case TypeName(ctrl) 
      Case "TextBox" 
       ctrl.Text = "" 
      Case "ComboBox" 
        ctrl.ListIndex = -1 
      Case "OptionButton", "CheckBox" 
        ctrl.Value = False 
      Case "ListBox" 
      For i = 0 To ctrl.ListCount - 1 
       If ctrl.Selected(i) Then 
        ctrl.Selected(i) = False 
       End If 
      Next i 
     End Select 
    Next 

End Sub 

===

これは私がこれまでのコードの2つの異なる部分を追加しようとしているなど、テキストボックス、チェックボックス、のために働きますrefeditコントロールをクリアするためのsub。

1:

For i = 0 To crtl.RefEdit - 1 
     ctrl.Selected(i) = vbNullString 
Next i 

===

2:

Case "RefEdit" 
    ctrl.RefEdit = vbNullString 

===

いずれも所望に応じて機能します。どんな提案も感謝しています!

おかげで、

ダン

答えて

1

はこのような何かがあなたのために働く必要があります。

Dim ctrl As Control 
Dim i As Long 

For Each ctrl In Me.Controls 
    Select Case TypeName(ctrl) 
     Case "TextBox":      ctrl.Text = vbNullString 
     Case "ComboBox":     ctrl.ListIndex = -1 
     Case "OptionButton", "CheckBox": ctrl.Value = False 
     Case "RefEdit":      ctrl.Value = vbNullString 
     Case "ListBox":      For i = 0 To ctrl.ListCount - 1 
               ctrl.Selected(i) = False 
              Next i 
    End Select 
Next ctrl 
+0

は 'ListBox'ケースをいそのフォーマットで作業しますか? (私は前にそれを見たことがない) – BruceWayne

+1

@ BruceWayneそれは、はい。そして、このタイプのフォーマットは必要ではなく、個人的な好みです。 – tigeravatar

0

あなたが作業しているので、それは、あなたがコントロールをクリアするために何をする必要があるかを知るのは難しい確かです実行時にのみ解決されるVariant/Objectに対して遅い呼び出しをします。つまり、エディタはオブジェクトのメンバーを検出するのを手助けできません。その.ドットを入力すると、IntelliSenseドロップダウンが表示されません。その上で

TypeNameはタイプミスにあなたのコードが脆弱になっている、とTextBoxまたはListBoxまたはRefEditクラス/コントロールを定義しますが、サードパーティのActiveXコントロールライブラリが参照されてい並外れ万一、あなたがいない持っていますあなたが見ているものを正確に伝える方法。

代わりにTypeOf...Isでタイプチェックを行い、適切なタイプにctrlコントロールをキャスティングすることを検討してください。これにより、すべてのコードを早期に強く型付けしておきます。あなたは、インテリセンスをコンパイル時のバリデーションを取得し、すべての方法を自動補完 - あなたが代わりにSelect Case Trueあなたはので、各Caseブランチに条件を配置する必要があるかTypeOf...Is作品のbecasueに注意してください。

Private Sub ClearControls() 
    Dim ctrl As MSForms.Control 
    For Each ctrl In Me.Controls 
     Select Case True 

      Case TypeOf ctrl Is MSForms.TextBox 
       Dim txtBox As MSForms.TextBox 
       Set txtBox = ctrl 
       txtBox.Text = vbNullString 

      Case TypeOf ctrl Is MSForms.ComboBox 
       Dim cmbBox As MSForms.ComboBox 
       Set cmbBox = ctrl 
       cmbBox.ListIndex = -1 

      Case TypeOf ctrl Is MSForms.OptionButton 
       Dim optBtn As MSForms.OptionButton 
       Set optBtn = ctrl 
       optBtn.Value = False 

      Case TypeOf ctrl Is MSForms.CheckBox 
       Dim chkBox As MSForms.CheckBox 
       Set chkBox = ctrl 
       chkBox.Value = False 

      Case TypeOf ctrl Is MSForms.ListBox 
       Dim lstBox As MSForms.ListBox 
       Set lstBox = ctrl 
       Dim i As Long 
       For i = 0 To lstBox.ListCount - 1 
        lstBox.Selected(i) = False 
       Next 

      Case TypeOf ctrl Is RefEdit.RefEdit 
       Dim refEditCtrl As RefEdit.RefEdit 
       Set refEditCtrl = ctrl 
       refEditCtrl.Value = vbNullString 

     End Select 
    Next 
End Sub