2017-08-21 44 views
0

私は、複数のオプションである3つのリストボックスで設計されたユーザフォームを持っています。ユーザフォームのチェックボックスのチェックを外す

また、「フィルタ」、「フィルタ解除」、「終了」の3つのコマンドボタンがあります。

私はシートのボタンでuserformへのアクセス権を持っていますが、以下のコードがあります。

ユーザーフォームから、チェックボックスをオンにして[フィルタ]をクリックします。これで、私は自分のシート "データ"にフィルタリングされた結果を見ることができました。

問題は、リストボックスに前の選択肢がある「データ」シートのボタンをクリックしているときです。リストボックスの前の選択をクリアしたいと思います。 現時点では、私はこの無害なボタンを使用しています。

私はそれをメインのコマンドボタンに入れたいと思います。

私はこの

Sub dev() 
Userform1.show 
Call userform1.CBUnfilter 
end sub() 

のようなものを試してみましたが、これは「プロパティエラーの無効な使用」を示しました。

どのようにすればいいですか?

この

Private Sub CBFilter_Click() 
    If CBFilter.Caption = "Filter" Then 
    Call DoFilter.DoFilter 
    Else 
    'do something 
End If 
End Sub 

が、これはユーザーフォームでunfilterボタンのコードでユーザーフォームでの私のフィルタボタンのコードです

Private Sub CBUnfilter_Click() 
Dim icount, jcount, kcount As Integer 
If CBUnfilter.Caption = "Unfilter" Then 

For icount = 0 To Me!ListBox1.ListCount 
Me!ListBox1.Selected(icount) = False 
Next icount 

For jcount = 0 To Me!ListBox2.ListCount 
Me!ListBox2.Selected(jcount) = False 
Next jcount 

For kcount = 0 To Me!ListBox3.ListCount 
Me!ListBox3.Selected(kcount) = False 
Next kcount 
End If 
End Sub 

誰かができunfilter機能を持つように助けてもらえシートのボタンから呼び出すことができます。

this is how the userform looks. This userform is called by another button from the main sheet

+0

としてユーザーフォームのショーは、2つの異なる要求のようですね。私はあなたが1つの質問ごとに1つの要件にそれを分解することをお勧めします。だから私はあなたの最初のクエリを支援しようとします..あなたはあなたのシート内のボタンを押してフォームを呼び出すeveytimeをリセットするフィールドをしたい場合は、このような何かを試してください:あなたのフォームを宣言し、 * 'Dim oForm As New Userform1' **。これでフォームを** 'oForm.Show' **と呼びます。これはあなたのフォームをリセットするのに役立ちます。あなたがフォームをきれいに終了しなければならないという警告があります。 – Zac

+0

@Zac私のリクエストは異なります。私はシートのボタンの中に、フィルターのないボタンの機能を持っていたいと思います。 – Jenny

+0

'Call userform1.CBUnfilter'の代わりに' Me.CBUnfilter_Click'を試してください –

答えて

1

答えはあなたのUserFoの削除方法に完全に依存しますrm。

はあなたアンロードプログラムでフォーム(すなわちUnload UserForm1)またはユーザーが(赤い十字をクリックすることによって)手動でユーザーフォームを閉じた場合は、すべての現在の設定が失われます。あなたはどのようにあなたのリストボックスに項目を設定したのか言っていないので、私はあなたがプログラムでそれをやったと仮定しています。その場合、すべてのリストボックスがクリアされます - 選択だけでなくアイテムもクリアされます。

フォームをプログラムでしか実行できない場合(つまり、Me.Hide)、現在の設定はすべてそのまま残り、ユーザーフォームを再び表示するとその設定が表示されます。

私はあなたの構造を模倣して、すなわちあなたがCommandButtonを挿入した "データ"と呼ばれるワークシートを持っていると推測しました。このコマンドボタンに割り当てたマクロは「dev」、「dev」コードはModule1にあります。

Private Sub CBExit_Click() 
    Unload Me 
End Sub 

あなたはUserForm_Initialize()イベントであなたのリストボックスを移入できます。私は「終了」コマンドボタンには、以下のコードが含まれていることを仮定しました。このケースでは

アンロード方法

。 (このイベントのルーチンにアクセスするには、 'UserForm1`をクリックし、メニューバーの下の最初のコンボボックスで' Useform 'を選択し、次に' Initialize 'を選択します。)サンプル配列をコードの中に入れて、しかし、あなたは、あなたが望むようにそれを移植したい:あるとuseformが目に見えるようになるたびに、リストボックスがクリアされるように

Private Sub UserForm_Initialize() 
    Dim arr(2) As Variant 

    arr(0) = Array("A", "B", "C", "D", "E", "F", "G", "H") 
    arr(1) = Array("A", "B", "C", "D", "E", "F") 
    arr(2) = Array("A", "B", "C", "D") 

    Me.ListBox1.List = arr(0) 
    Me.ListBox2.List = arr(1) 
    Me.ListBox3.List = arr(2) 
End Sub 

あなたの「DEV」ルーチンが残ります。

を隠す方法

私はあなたの「終了」ボタンのコードがあると仮定してきました。この場合の場合:ユーザーフォームのコードで

Private Sub CBExit_Click() 
    Me.Hide 
End Sub 

、あなたがルーチンのカップルを持っていると思います、ボックスをオフにモジュールとプライベート1から呼び出すことができ、公開1:

Public Sub Reset() 
    ClearListbox Me.ListBox1, Me.ListBox2, Me.ListBox3 
End Sub 

Private Sub ClearListbox(ParamArray lboxes() As Variant) 
    Dim item As Variant 
    Dim lbox As MSForms.ListBox 
    Dim i As Long 

    For Each item In lboxes 
     Set lbox = item 
     For i = 0 To lbox.ListCount 
      lbox.Selected(i) = False 
     Next 
    Next 
End Sub 

は、その後、あなたの「DEV」コードは、単純に次のようになります。

ちなみに
Public Sub dev() 
    With UserForm1 
     .Reset 
     .Show 
    End With 
End Sub 

、あなたの 'Unfilter' ボタンもClearListBoxルーチンを呼び出すことができます。

Private Sub CBUnfilter_Click() 
    ClearListbox Me.ListBox1, Me.ListBox2, Me.ListBox3 
End Sub 
+0

本当にありがとう:)明確な説明とコード:) – Jenny

1
Private Sub CBUnfilter_Click() 
Dim icount, jcount, kcount As Integer 

For icount = 0 To Me!ListBox1.ListCount -1 
Me!ListBox1.Selected(icount) = False 
Next icount 

For jcount = 0 To Me!ListBox2.ListCount-1 
Me!ListBox2.Selected(jcount) = False 
Next jcount 

For kcount = 0 To Me!ListBox3.ListCount-1 
Me!ListBox3.Selected(kcount) = False 
Next kcount 
End Sub 

そしてCBUnfilter右、ボタンの名前ですか?だから、同じよう

Call userform1.CBUnfilter 

を呼び出さないモジュールのSub、フィルタボタンがある:

Private Sub CBFilter_Click() 
Dim icount, jcount, kcount As Integer 

For icount = 0 To Me!ListBox1.ListCount-1 
Me!ListBox1.Selected(icount) = True 
Next icount 

For jcount = 0 To Me!ListBox2.ListCount-1 
Me!ListBox2.Selected(jcount) = True 
Next jcount 

For kcount = 0 To Me!ListBox3.ListCount-1 
Me!ListBox3.Selected(kcount) = True 
Next kcount 
End Sub 

、正しく終了します

Private Sub Exit_Click() 

'Your exit code here 
Me.Hide 
    Unload Me 
End Sub 

または:

Private Sub Exit_Click() 

'Your exit code here 
Userform1.Hide 
    Unload Userform1 
End Sub 
+0

モジュール内でuserform1.CBUnfilterを呼び出すことは可能ですか? – Jenny

+1

Public Subを作成した場合は、ワークブック全体で呼び出すことができます。コールを使用して呼び出しを行う必要はありません。 – danieltakeshi

+0

私は試してみます。これはクールです:) – Jenny

1

Userform1.show(0)modaless

Sub dev() 
UserForm1.Show (0) 

ResetListbox UserForm1.ListBox1 
ResetListbox UserForm1.ListBox2 
ResetListbox UserForm1.ListBox3 

End Sub 
Sub ResetListbox(lsbox As Object) 
    With lsbox 
     For i = 0 To lsbox.ListCount 
      .Selected(i) = False 
     Next i 
    End With 
End Sub 
関連する問題