【发布时间】:2016-07-11 15:39:59
【问题描述】:
我有一个包含 5 行部分的表格(一周中的每一天)。每行标题是一个工作人员的名字——大约有 15 人,所以总共 15*5 行。穿插的是标题为“星期一”“星期二”等的行。列标题称为“名称”
下面是搜索框的代码:
Sub ScheduleSearch()
'PURPOSE: Filter Data by Staff Name
Dim myButton As OptionButton
Dim MyVal As Long
Dim ButtonName As String
Dim sht As Worksheet
Dim myField As Long
Dim DataRange As Range
Dim mySearch As Variant
'Load Sheet into A Variable
Set sht = ActiveSheet
'Unfilter Data (if necessary)
On Error Resume Next
sht.ShowAllData
On Error GoTo 0
'Filtered Data Range (include column heading cells)
Set DataRange = sht.ListObjects("Schedule").Range 'Table
'Retrieve User's Search Input
mySearch = sht.Shapes("WireSearch").TextFrame.Characters.Text 'Control Form
'Loop Through Option Buttons
For Each myButton In ActiveSheet.OptionButtons
If myButton.Value = 1 Then
ButtonName = myButton.Text
Exit For
End If
Next myButton
'Determine Filter Field
On Error GoTo HeadingNotFound
myField = Application.WorksheetFunction.Match(ButtonName, DataRange.Rows(1), 0)
On Error GoTo 0
'Filter Data
DataRange.AutoFilter _
Field:=myField, _
Criteria1:="=*" & mySearch & "*", _
Operator:=xlAnd
'Clear Search Field
sht.Shapes("WireSearch").TextFrame.Characters.Text = "" 'Control Form
'sht.OLEObjects("UserSearch").Object.Text = "" 'ActiveX Control
'sht.Range("A1").Value = "" 'Cell Input
Exit Sub
'ERROR HANDLERS
HeadingNotFound:
MsgBox "The column heading [" & ButtonName & "] was not found in cells " & DataRange.Rows(1).Address & ". " & _
vbNewLine & "Please check for possible typos.", vbCritical, "Header Name Not Found!"
End Sub
Sub ClearScheduleFilter()
'
' ClearScheduleFilter Macro
'
'
ActiveSheet.ListObjects("Schedule").Range.AutoFilter Field:=1
End Sub
现在,当我搜索人员 A 时,过滤器工作正常,并按人员 A 过滤“姓名”列。
但是 - 我希望标题为“星期一”“星期二”“星期三”“星期四”和“星期五”的单元格也自动包含在此过滤器中,无论用户搜索什么。 p>
有代码吗?
更新:以下代码过滤了日期和星期行,但它不过滤 mySearch 值。知道为什么吗?
'Filter Data
DataRange.AutoFilter _
Field:=myField, _
Criteria1:=Array("MONDAY:", "TUESDAY:", "WEDNESDAY:", "THURSDAY:", "FRIDAY:", "WEEK:", " & mySearch & "), _
Operator:=xlFilterValues
【问题讨论】:
-
您能否提供一组数据样本(如果需要,可以进行模拟)。在这种情况下,我认为即使是屏幕截图就足够了,但是将数据嵌入问题中总是最好的,这样人们就可以复制/粘贴。
-
嗨@ScottHoltzman,我附上了一张截图。正如您在图像左侧看到的那样,表格中有多个行部分。让我知道这是否足够 - 我不确定如何在问题中嵌入数据。屏幕顶部“员工过滤器”附近的文本框是用户输入人名的地方。
-
使用高级过滤器。保持日期值静态并动态添加搜索条件。
-
@cyboashu 我是 VBA 的新手——如何编辑上面的代码以保持日期值不变?
标签: vba excel optimization filter tablefilter