VBA-一个单元格中的串联数据;如果没有1条信息,则删除整行

问题描述 投票:1回答:1

我运行一个报告,该报告显示雇员列表以及与他们的就业记录相关的所有信息。其中的一件事是所有员工角色的串联列表,以及有效期至和起始日。例如,如果可能的角色列表如下:

  • 角色1
  • 角色1 –培训师
  • 角色2
  • 角色2 –培训师
  • 角色3
  • 角色3 –培训师
  • 实习生]
  • 前雇员
  • 试用员工
  • 并且有一位员工被注销为角色1,角色1 –培训师,角色2,而他们以前是角色3,该信息将显示在一个单元格中,如下所示:

  • 角色1 – 2020年1月1日至N / A;角色1 –培训师– 1/1/2020;角色2 –2020年1月1日至N / A;角色3 – 2020年1月1日至2020年2月28日
  • 对于我正在使用的报告,我只希望能够看到角色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而不是连字符。
excel vba concatenation autofilter
1个回答
0
投票

很遗憾,您不能在AutoFilter中使用更多的内部通配符。但是,也许尝试利用Like运算符或更灵活一些;常用表达。

© www.soinside.com 2019 - 2024. All rights reserved.