我有一个带有列表框(MultiSelect)的表单。 ListBox充当“过滤器”工作表上的自动过滤器。关闭表单时如何保存ListBox值?打开表单时如何使ListBox值全部选定-默认情况下?以及如何使自动过滤器范围由自身决定?现在,范围是手动设置的:
With Sheets("Filter").Range("$A$2:$A$2355").
要确定范围,我尝试应用以下代码:
Sheets("Filter").Range("a3:a" & Sheets("Filter").Range("a" & Sheets("Filter").Rows.Count).End(xlUp).Row).Value
...但是出现错误。
Private Sub UserForm_Initialize()
With ListBox1
.AddItem "One"
.AddItem "Two"
.AddItem "Three"
.AddItem "Four"
.AddItem "Five"
.AddItem "Six"
.AddItem "Seven"
End With
End Sub
Private Sub ListBox1_Change()
Application.ScreenUpdating = False
Dim Arr()
Dim Str$, i%, u%
u = 0
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then
ReDim Preserve Arr(u)
Arr(u) = ListBox1.List(i, 0)
u = u + 1
End If
Next i
With Sheets("Filter").Range("$A$2:$A$2355")
If u = 0 Then .AutoFilter Field:=1: Exit Sub
.AutoFilter Field:=1, Criteria1:=Array(Arr), Operator:=xlFilterValues
End With
Application.ScreenUpdating = True
End Sub
答案 0 :(得分:0)
我必须做到这一点,解决方案类似于Skin的解决方案-在人们更新表单后,只需将表单中的值保存在单独的(可能是隐藏的)表单中即可
Sheets("Selection").Range("f3") = UserFormData.Divisioncbo.Value
,然后当他们重新打开表单时,根据这些值对其进行更新
UserFormData.Divisioncbo.Value = Sheets("Selection").Range("f3")
关于过滤器的范围,我认为您基本上遇到了与我相同的问题-尝试确定未知长度的范围,然后将其用作用户可以选择的列表?
我在名称管理器中添加了一个名为PeopListname
=OFFSET(Lists!$M$3,0,0,COUNTA(Lists!$M:$M)-1,1)
的列表
然后使它成为VBA用户表单上的行源
= {PeopListname