取消选中userform

时间:2017-08-21 07:55:54

标签: excel vba excel-vba

我有一个用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

有人可以帮助你拥有可以从工作表中的按钮调用的不过滤功能。

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

3 个答案:

答案 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