我有一张excel工作簿,包含13张(一年中每个月一张+一张主页),每张工作表中有一份相同的员工统计表。员工统计表以其对应的月份命名,并具有相同的列标题。 我在主表上有一个仪表板,其中有图表从其他表中拉出来。
我想创建一个搜索框,允许您一次过滤各自工作表中的所有表格
这是我无法弄清楚的代码行。我试图让过滤器范围引用多个表。
Set DataRange = sheets.ListObjects("January""February""March").Range
有没有办法对搜索框进行编码以引用多个工作表中的多个表格?我需要确定工作表名称和表名称。我不知道该怎么做
作为参考,1月是标题为“Jan”的表格中的表格。
以下是我使用的完整代码:
Sub SearchBox()
Dim dict as Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i as Long
For 1 = 3 to 14
Set dict(i) = Worksheets(i).ListObjects(1).Range
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)
dict(i).Autofilter_
Field:=myField,_
Criteria1:="=*" & mySearch & "*", _
Operator:=xlAnd
Next
'Retrieve User's Search Input
mySearch = sht.Shapes("StaffLookUp").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("UserSearch").TextFrame.Characters.Text = "" 'Control Form
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
答案 0 :(得分:1)
您应该能够使用Range(Name)
按名称引用ListObjects。
我将过滤器进程提取到它自己的子进程中。我还添加了一个可选参数ClearFilters。这将为您提供堆叠过滤器的选项。
Sub ApplyFilters()
Dim FieldName As String, mySearch As Variant
Dim myButton As OptionButton
Dim m As Integer
For Each myButton In ActiveSheet.OptionButtons
If myButton.Value = 1 Then
FieldName = myButton.Text
Exit For
End If
Next myButton
mySearch = ActiveSheet.Shapes("StaffLookUp").TextFrame.Characters.Text 'Control Form
mySearch = "=*" & mySearch & "*"
For m = 1 To 12
FilterTable MonthName(m), FieldName, mySearch, True
Next
End Sub
Sub FilterTable(TableName As String, FieldName As String, mySearch As Variant, Optional ClearFilters As Boolean = False)
Dim DataRange As Range, FilterColumn As Integer
On Error Resume Next
Set DataRange = Range(TableName)
On Error GoTo 0
If DataRange Is Nothing Then
MsgBox TableName & " not found"
Exit Sub
End If
If ClearFilters Then
On Error Resume Next
DataRange.Worksheet.ShowAllData
On Error GoTo 0
End If
On Error Resume Next
FilterColumn = DataRange.ListObject.ListColumns(FieldName).Index
On Error GoTo 0
If FilterColumn = 0 Then
MsgBox TableName & ": " & FieldName & " not found"
Exit Sub
End If
DataRange.AutoFilter _
Field:=FilterColumn, _
Criteria1:=mySearch, _
Operator:=xlAnd
End Sub
答案 1 :(得分:0)
有没有办法对搜索框进行编码以引用多个工作表中的多个表格?
不。你可能已经聚集了一些,但你的尝试不起作用,但我认为我理解你要做的事情就足够了:
设置DataRange = sheets.ListObjects(“January”“February”“March”)。范围
由于多种原因,它的语法无效(您可能已经知道),但您也无法分配跨多个工作表的范围。你正在寻找的是一个循环,而不是1个范围,你将有13个范围(或者你需要多少)。
我需要识别工作表名称和表名。我 不知道该怎么做
您可以按名称或索引参考表格,例如:
Worksheets(1) '## Refers to the first sheet in the book
或者:
Worksheets("January") '## Refers to worksheet named 'January' or raise error if sheet name doesn't exist
您需要做的是For/Each
循环,并连续处理每个工作表,如果您想要处理所有各自的范围,请将它们转储到集合或字典中:
Dim dict as Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i as Long
For i = 1 to 13 'Modify as needed
'## Assumes only 1 ListObject table on each sheet; if there are multiple,
' you should refer to the ListObjects by name instead of index
Set dict(i) = Worksheets(i).ListObjects(1).Range
Next
然后,稍后您将在类似的循环中应用过滤器。由于dict
值是范围,您可以直接使用dict
对象,如下所示:
For i = 1 to 13
dict(i).AutoFilter ...
Next