取消选中userform中的checkbox

我有一个用3个Listboxesdevise的用户窗体是多个选项。

另外,我有三个命令button,分别是“Filter”,“Unfilter”和“Exit”。

我可以通过表单中的button访问用户窗体,使用下面的代码。

sub dev() userform1.show end sub 

从用户表单中selectcheckbox,然后单击“filter”。 有了这个,我可以看到我的工作表“数据”中的过滤结果。

问题是当我点击从表单“数据”列表框中的button有以前的select。 我想清除之前的select在列表框中。 目前,我在我的未过滤button中有这个明确的情况。

我想在主要的命令button。

我尝试了这样的事情

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

但是这显示了“财产错误的无效使用”。

任何人都可以帮助我如何做到这一点?

这是用户表单中我的filterbutton的代码

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

这是用户窗体中的未过滤button的代码

 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 

有人可以帮助从工作表中的button获得可以调用的未过滤function。

这是用户表单的样子。这个用户表单被主表中的另一个按钮调用

答案完全取决于如何“删除”您的用户窗体。

如果以编程方式Unload UserForm1 (即Unload UserForm1 )或用户手动closures用户窗体(即通过单击红色十字),则所有当前设置都将丢失。 你还没有说过你如何填充你的列表框中的项目,所以我假定你已经做了编程。 如果是这样,所有的列表框将被清除 – 不仅仅是select,而且也是项目。

如果隐藏窗体,只能以编程方式完成(即Me.Hide ),则所有当前设置将保留,并且当您再次显示UserForm时,这些设置将可见。

我已经做了一个模拟你的结构的最佳猜测,即:你有一个名为“数据”的工作表,你已经插入了一个CommandButton。 您分配给此CommandButton的macros称为“dev”,“dev”代码位于Module 1中。

卸载方法

对于这种情况,我假定“退出”命令button包含以下代码:

 Private Sub CBExit_Click() Unload Me End Sub 

您可以在UserForm_Initialize()事件中填充您的列表框。 (你可以通过点击'UserForm1',在菜单栏下面的第一个combobox中select'Useform',然后在第二个'Initialize'中来访问这个事件的例程。)我已经把一些样例数组放在代码后面,但是你可以按照你的意愿填充它:

 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 

你的'开发'例程将保持原样,每次使用forms变得可见,列表框将被清除。

隐藏方法

对于这种情况,我假设你的“退出”button代码是:

 Private Sub CBExit_Click() Me.Hide End Sub 

在你的用户表单代码中,你会有几个例程,一个是公用的,可以从一个模块中调用,一个是私有的,用来清除方框:

 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'button也可以调用ClearListBox例程:

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

Userform1.show(0)userform显示为无模式

 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 
 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是button名称,对不对? 不是一个模块子调用

 Call userform1.CBUnfilter 

所以同样的方法,过滤button是:

 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