很遗憾,您不能在AutoFilter
中使用更多的内部通配符。但是,也许尝试利用Like
运算符或更灵活一些;常用表达。
我运行一个报告,该报告显示雇员列表以及与他们的就业记录相关的所有信息。其中的一件事是所有员工角色的串联列表,以及有效期至和起始日。例如,如果可能的角色列表如下:
并且有一位员工被注销为角色1,角色1 –培训师,角色2,而他们以前是角色3,该信息将显示在一个单元格中,如下所示:
对于我正在使用的报告,我只希望能够看到角色1中的在职员工列表(因此,不包括从角色1中退休但仍在其他角色中处于活动状态的人员。)>
我有以下代码段,使我可以从列表中删除记录中没有角色1的任何人:
Sub deleteifnotR1 () Dim ws As Worksheet Dim rng As Range Dim lastRow As Long Set ws = ActiveWorkbook.Sheets("Employee Record") lastRow = ws.Range("E" & ws.Rows.Count).End(xlUp).Row Set rng = ws.Range("E1:E" & lastRow) 'filter and delete all but header row With rng .AutoFilter Field:=1, Criteria1:="<>*Role 1*" lr = Cells(Rows.Count, 1).End(xlUp).Row If lr > 1 Then Range("D2:D" & lr).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If End With ' turn off the filters ws.AutoFilterMode = False End Sub
问题是,它仍然会给我留下一份以前的雇员列表,以及可能已经从角色1退休但仍然是角色3等的在职员工。
在考虑如何解决此问题时,我有两个想法–首先,是否可以取消串联这些数据?例如,要在顶部插入具有所有可能角色的新列,然后有一个宏来标识某人的记录中何时有“角色1 –培训师”并将该数据移到正确的列上?然后,我可以使用上面的代码的变体删除“角色1”列中没有“ N / A”的任何人。
或者,可以修改以下行:
.AutoFilter Field:=1, Criteria1:="<>*Role 1*"
以某种方式搜索“角色1 – 任何日期
到N / A”?这样既可以过滤掉以前的员工,也可以过滤掉从角色1退休的员工。(理想情况下,我只需要对报告进行重新处理,而不必在事实之后进行修复,但是我无权访问系统的那部分,并且这样做的人不愿意对其进行任何开发) 。
感谢您的帮助。
我运行一个报告,该报告显示雇员列表以及与他们的就业记录相关的所有信息。其中一件事情是所有员工角色的串联列表,并带有...
很遗憾,您不能在AutoFilter
中使用更多的内部通配符。但是,也许尝试利用Like
运算符或更灵活一些;常用表达。
尝试类似的东西:
Sub deleteifnotR1()
Application.ScreenUpdating = False
Dim ws As Worksheet
Dim rng As Range
Dim lastRow As Long, x As Long
Set ws = ActiveWorkbook.Sheets("Employee Record")
lastRow = ws.Range("E" & ws.Rows.Count).End(xlUp).Row
With CreateObject("VBScript.RegExp")
.Pattern = "\b[rR]ole 1 – \d{1,2}\/\d{1,2}\/\d{4} to N\/A\b"
.Global = True
For x = lastRow To 2 Step -1
If Not .Test(ws.Cells(x, 5).Value) Then
ws.Cells(x, 5).EntireRow.Delete
End If
Next x
End With
Application.ScreenUpdating = True
End Sub
使用的模式可以更好地可视化,例如:
“>
如您所见,它既允许“角色1”也允许“角色1”,并且允许日期写为“ 1/1/2020”或“ 10/10/2020”。
如果您有大量数据,则更好/更快的方法是通过数组在内存中执行此操作。希望这可以帮助您入门。
注意:
您当前在“角色1”之后使用了ASCII字符150而不是连字符。
很遗憾,您不能在AutoFilter
中使用更多的内部通配符。但是,也许尝试利用Like
运算符或更灵活一些;常用表达。