我有一个用3个列表框设计的用户表单,它是多个选项。
另外,我有三个命令按钮,它们是" Filter"," Unfilter"和"退出"。
我可以通过表格中的按钮访问用户表单,并使用以下代码。
sub dev()
userform1.show
end sub
在userform中,选中复选框,然后点击"过滤"。有了这个,我可以在我的工作表"数据"中看到过滤结果。
问题是当我点击表格中的按钮"数据"列表框具有先前的选择。我想在列表框中清除以前的选择。 目前,我在我的未过滤按钮中有这个明显的情况。
我想在主命令按钮中使用它。
我试过这样的事情
Sub dev()
Userform1.show
Call userform1.CBUnfilter
end sub()
但这显示"无效使用属性错误"。
任何人都可以帮我解决这个问题吗?
这是userform
中我的过滤器按钮的代码Private Sub CBFilter_Click()
If CBFilter.Caption = "Filter" Then
Call DoFilter.DoFilter
Else
'do something
End If
End Sub
这是userform
中的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
有人可以帮助你拥有可以从工作表中的按钮调用的不过滤功能。
答案 0 :(得分: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是按钮名称,对吧?不是要调用的模块Sub
Call userform1.CBUnfilter
同样,过滤按钮是:
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
答案 1 :(得分:1)
答案完全取决于您如何“删除”您的用户窗体。
如果以编程方式卸载表单(即Unload UserForm1
)或用户手动关闭UserForm(即单击红叉),则所有当前设置都将丢失。您还没有说过如何填充列表框中的项目,所以我假设您已经以编程方式完成了它。如果是这种情况,您的所有列表框都将被清除 - 不仅仅是选择,还包括项目。
如果您隐藏表单(只能以编程方式完成)(即Me.Hide
),则所有当前设置都将保留,当您再次显示UserForm时,这些设置将会显示
我已经在模仿你的结构时做了最好的猜测,即:你有一个名为“Data”的工作表,你已经插入了一个CommandButton。您分配给此CommandButton的宏称为“dev”,“dev”代码位于Module1中。
卸载方法
对于这种情况,我假设“退出”命令按钮包含以下代码:
Private Sub CBExit_Click()
Unload Me
End Sub
您可以在UserForm_Initialize()
事件中填充列表框。 (您可以通过单击“UserForm1”,在菜单栏下方的第一个组合框中选择“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
您的'dev'例程将保持原样,每次useform变为可见时,列表框将被清除。
隐藏方法
对于这种情况,我假设你的“退出”按钮代码是:
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'按钮也可以调用ClearListBox例程:
Private Sub CBUnfilter_Click()
ClearListbox Me.ListBox1, Me.ListBox2, Me.ListBox3
End Sub
答案 2 :(得分:1)
Userform1.show(0)userform显示为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