显示包含两个给定值之间的值的行

我正在尝试创build一个相对复杂的Excel工作表,并且陷入了这个问题。

所以我有一个数据表,包含build筑物的名称,他们的位置等,然后在COLUMN D我有该build筑物的面积大小。 我有一个单独的名为“控制”,将允许用户通过下拉控制第二张纸的输出。 我希望他们能够控制的一个领域是显示/隐藏包含特定大小build筑物的行。 所以例如我有一个尺寸列表,如:

0-19,999 20,000-39,999 40,000-59,999 60,000-79,999 80,000-99,999 100,000+ 

在相邻的单元格中显示/隐藏下拉列表。 如果我只select“显示”为80-99,999和100,000+,我只想在第二张纸上看到属于这个类别的build筑物。

我有Visual Basic的基本知识,但是我认为这将是唯一的方法来做这样的事情?

任何帮助,将不胜感激! 我只需要一个开始,希望能够解决这个问题。

编辑:

我有一些使用这个代码的function,如Jean-Pierre所build议的:

  If Range("F2").Value = "Yes" Then Worksheets("Output").Range("$A$2:$AC$198").AutoFilter Field:=4, _ Criteria1:=">=0", _ Operator:=xlAnd, _ Criteria2:="<=19999" ElseIf Range("F3").Value = "Yes" Then Worksheets("Output").Range("$A$2:$AC$198").AutoFilter Field:=4, _ Criteria1:=">=20000", _ Operator:=xlAnd, _ Criteria2:="<=39999" End If 

但是,如果在控制表中select了“是”,则输出仅显示面积为0到19,999之间的build筑物,而不显示在0到39,999之间的build筑物。 如果我更改为“否”,那么它仍然显示0到19,999。 所以function不完全正确。 想法?

EDIT2:

控制

在这里输入图像说明

OUTPUT

在这里输入图像说明

 Sub ShowBuildings() Dim wsC As Worksheet, wsO As Worksheet Set wsC = Worksheets("Control") Set wsO = Worksheets("Output") Dim x As Long, sList() As String x = 0 With wsC Dim rng As Range For Each rng In .Range("F2:F13") If rng.Value2 = "Yes" Then ReDim Preserve sList(x) sList(x) = rng.Offset(, -1) x = x + 1 End If Next End With With wsO With .Range(.Range("D2"), .Range("D" & .Rows.Count).End(xlUp)) .AutoFilter Field:=1, Criteria1:=sList, Operator:=xlFilterValues End With End With End Sub 

吉宝代码

 If Not Intersect(Target, Range("F2:F13")) Is Nothing Then On Error GoTo bm_Safe_Exit Application.EnableEvents = False Dim v As Long, vSQFTs As Variant vSQFTs = Range("E2:G13").Value2 For v = LBound(vSQFTs, 1) To UBound(vSQFTs, 1) vSQFTs(v, 3) = CBool(LCase(vSQFTs(v, 2)) = "Yes") If v < UBound(vSQFTs, 1) Then vSQFTs(v, 2) = CLng(Split(vSQFTs(v, 1), Chr(45))(1)) vSQFTs(v, 1) = CLng(Split(vSQFTs(v, 1), Chr(45))(0)) Else vSQFTs(v, 1) = CLng(Split(vSQFTs(v, 1), Chr(43))(0)) vSQFTs(v, 2) = Rows.Count '1,048,576 make this larger if you want End If Next v buildingsShowHide vSQFTs End If bm_Safe_Exit: Application.EnableEvents = True End Sub Sub buildingsShowHide(aSQFTs As Variant) Dim a As Long, rw As Long, sqft As Long, sft As String, dSQFTs As Object Application.ScreenUpdating = False Set dSQFTs = CreateObject("Scripting.Dictionary") With Worksheets("Output") If .AutoFilterMode Then .AutoFilterMode = False For rw = 3 To .Cells(Rows.Count, "D").End(xlUp).Row sqft = .Cells(rw, "D").Value2 sft = .Cells(rw, "D").Text If Not dSQFTs.exists(sft) Then For a = LBound(aSQFTs, 1) To UBound(aSQFTs, 1) If sqft >= aSQFTs(a, 1) And sqft <= aSQFTs(a, 2) And aSQFTs(a, 3) Then dSQFTs.Add Key:=sft, Item:=sqft Exit For End If Next a End If Next rw With .Columns(4) .AutoFilter Field:=1, Criteria1:=dSQFTs.keys, Operator:=xlFilterValues End With End With dSQFTs.RemoveAll: Set dSQFTs = Nothing Application.ScreenUpdating = True End Sub 

要做你需要使用以下内容:

 If Option1 = True Then 'Active sheet will become the sheet you want to filter 'Field 9 refers to the 9th field of the filter range ActiveSheet.Range("$A$1:$M$3").AutoFilter Field:=9, _ Criteria1:=">=0", _ Operator:=xlAnd, _ Criteria2:="<=19999" ElseIf Option2 = True Then ActiveSheet.Range("$A$1:$M$3").AutoFilter Field:=9, _ Criteria1:=">=20000", _ Operator:=xlAnd, _ Criteria2:="<=39999" 'Remainder of options here End If 

从Worksheet_Change事件macros运行的AutoFilter方法似乎适用于此处。

右键单击控制工作表的名称选项卡,然后select查看代码 。 当VBE打开时,将以下内容粘贴到标题为Book1 – Sheet2(Code)的窗格中。

 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("F2:F7")) Is Nothing Then On Error GoTo bm_Safe_Exit Application.EnableEvents = False Dim v As Long, vSQFTs As Variant vSQFTs = Range("E2:G7").Value2 For v = LBound(vSQFTs, 1) To UBound(vSQFTs, 1) vSQFTs(v, 3) = CBool(LCase(vSQFTs(v, 2)) = "show") If v < UBound(vSQFTs, 1) Then vSQFTs(v, 2) = CLng(Split(vSQFTs(v, 1), Chr(45))(1)) vSQFTs(v, 1) = CLng(Split(vSQFTs(v, 1), Chr(45))(0)) Else vSQFTs(v, 1) = CLng(Split(vSQFTs(v, 1), Chr(43))(0)) vSQFTs(v, 2) = Rows.Count '1,048,576 make this larger if you want End If Next v buildingsShowHide vSQFTs End If bm_Safe_Exit: Application.EnableEvents = True End Sub Sub buildingsShowHide(aSQFTs As Variant) Dim a As Long, rw As Long, sqft As Long, sft As String, dSQFTs As Object Application.ScreenUpdating = False Set dSQFTs = CreateObject("Scripting.Dictionary") With Worksheets("Buildings") If .AutoFilterMode Then .AutoFilterMode = False For rw = 2 To .Cells(Rows.Count, "D").End(xlUp).Row sqft = .Cells(rw, "D").Value2 sft = .Cells(rw, "D").Text If Not dSQFTs.exists(sft) Then For a = LBound(aSQFTs, 1) To UBound(aSQFTs, 1) If sqft >= aSQFTs(a, 1) And sqft <= aSQFTs(a, 2) And aSQFTs(a, 3) Then dSQFTs.Add Key:=sft, Item:=sqft Exit For End If Next a End If Next rw With .Columns(4) .AutoFilter Field:=1, Criteria1:=dSQFTs.keys, Operator:=xlFilterValues End With End With dSQFTs.RemoveAll: Set dSQFTs = Nothing Application.ScreenUpdating = True End Sub 

将下面的图像与您自己的单元格区域和工作表名称进行比较。 对必要的代码进行任何调整。 点击Alt + Q返回到您的工作簿。

square_footage_filter

在Control!F2:F7中任何重新select下拉菜单都将触发build筑物工作表的重新过滤。 我build筑物栏D中的0 ft²数字是格式为0 ft²真实数字。

在“ Output选项卡的E列中添加一个“帮助列”(称为“区域分组”),显示与“ Control选项卡上的分组对应的每行的区域大小分组。

输出选项卡

输出选项卡

控制选项卡

控制选项卡

然后,您可以循环访问“ Control选项卡上的所有选项,并将“Yes”加载到数组中,您可以使用该数组来过滤“ Output选项卡的“区域分组”列,并使用下面的代码。

 Sub ShowBuildings() Dim wsC As Worksheet, wsO As Worksheet Set wsC = Worksheets("Control") Set wsO = Worksheets("Output") Dim x As Long, sList() As String x = 0 With wsC Dim rng As Range For Each rng In .Range("F2:F13") If rng.Value2 = "Yes" Then ReDim Preserve sList(x) sList(x) = rng.Offset(, -1) x = x + 1 End If Next End With With wsO .AutoFilterMode = False With .Range(.Range("D2"), .Range("D" & .Rows.Count).End(xlUp)) If x > 0 Then 'checks to see if array is empty because no "yes'" were selected .AutoFilter Field:=1, Criteria1:=sList, Operator:=xlFilterValues Else .AutoFilter End If End With End With End Sub 

输出结果(根据上面显示的select)

在这里输入图像描述