实现此类功能的最简单方法是使用VBA触发高级过滤器功能,以便隐藏所有其他行。
方法如下:
-
添加一个名为“MyList”的命名范围,覆盖要筛选的机器编号:列中的整个数据范围。(最好将此数据块转换为Excel表格,然后只引用MACHINE NO列,因为这意味着命名范围是动态的,即如果基础数据增长,它将自动调整)。
-
-
添加一个名为“标准”的命名范围,覆盖B2:B3
-
添加一个名为“输入”的命名范围,覆盖B3
这应该如下所示:
-
将此代码放入与
每台机器的移动
选项卡(不在标准代码模块中):
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("Input")) Is Nothing Then
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0
Range("MyList").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("Criteria"), Unique:=False
End If
End Sub
末端接头
i、 e.同样:
现在,每当有人输入机器编号时,该表都会被过滤以仅显示感兴趣的行:
您可以在Daniel Ferry的优秀博客上找到一个工作示例,链接如下:
http://www.excelhero.com/blog/2010/07/excel-partial-match-database-lookup.html
查找他在标题下发布的第二个示例文件--UPDATE---
根据您的后续问题,可以调整此方法以跨多个列进行搜索。首先,这里是命名范围的设置(包括输入单元格上方名为“Header”的新范围):
...以下是修改后的代码:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim vRanges As Variant
Dim vItem As Variant
If Not Intersect(Target, Range("Input")) Is Nothing Then
On Error GoTo errhandler
With Application
.EnableEvents = False
.ScreenUpdating = False
.Calculation = xlManual
End With
'Clear any existing filter
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0
'Cycle through the search arrays one by one, and run the advanced filter until you find a match
vRanges = Array("Range1", "Range2", "Range3", "Range4") '<<< Change these to match your range names
For Each vItem In vRanges
Range("Header") = Range(vItem).Cells(1)
Range(vItem).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("Criteria"), Unique:=False
If Range(vItem).SpecialCells(xlCellTypeVisible).Count > 1 Then Exit For
Next vItem
errhandler:
With Application
.EnableEvents = True
.ScreenUpdating = True
.Calculation = xlAutomatic
End With
End If
End Sub
下面是几个屏幕截图,显示了它在不同列上的匹配情况:
您可以格式化单元格B2,以便在需要时看不到它。
我建议在设置“RangeX”命名范围之前,将工作簿中的不同输入区域转换为Excel表格(也称为ListObjects)。这是因为在后台,表基本上是动态命名范围,可以自动扩展以容纳新数据。因此,如果手动设置指向表列的命名范围,则无需记住调整命名范围以处理新数据,因为表会自动为您执行此操作。请参见下图:
请注意,您可以使用功能区中的“表格样式”选项更改表格的格式,甚至可以完全关闭格式: