Объединенные данные в одной ячейке; удалить всю строку, когда 1 часть информации отсутствует - PullRequest
2 голосов
/ 26 марта 2020

Я запускаю отчет, который отображает список сотрудников со всей информацией, связанной с их трудовой книжкой. Одна из вещей - это составленный список всех их ролей сотрудников с датой действия «До и с». Например, если список возможных ролей следующий:

  • Роль 1
  • Роль 1 - тренер
  • Роль 2
  • Роль 2 - тренер
  • Роль 3
  • Роль 3 - тренер
  • Стажер
  • Бывший сотрудник
  • Стажер

И есть сотрудник, который отмечен как Роль 1, Роль 1 - тренер, Роль 2, а раньше это была Роль 3, информация будет отображаться в одной ячейке следующим образом:

  • Роль 1 - 1/1/2020 для N / A; Роль 1 - тренер - 1/1/2020; Роль 2 - 1/1/2020 для N / A; Роль 3 - 1/1/2020 до 28/2 / 2020

Для отчета, который я использую, я хочу видеть только список активных сотрудников в роли 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-ю роль и т. д. c.

. это, у меня было две идеи - во-первых, можно ли не объединять эти данные? Например, чтобы вставить новые столбцы вверху со всеми различными возможными ролями, а затем создать макрос, который идентифицирует, когда у кого-то есть «Роль 1 - тренер» в своей записи, и переместить эти данные в правильный столбец? Тогда я мог бы использовать вариант приведенного выше кода, чтобы удалить любого, у кого нет «N / A» в столбце Роли 1.

В качестве альтернативы, можно ли изменить следующую строку:

.AutoFilter Field:=1, Criteria1:="<>*Role 1*"

Чтобы каким-то образом найти «Роль 1 - ЛЮБАЯ ДАТА до Н / Д»? Это отфильтровывает как бывших сотрудников, так и сотрудников, вышедших на пенсию с роли 1, но не более.

(В идеале я бы просто переработал отчет, а не исправлял его после факта, но у меня нет доступ к этой части нашей системы, и люди, которые не хотят делать какие-либо разработки на нем).

Заранее спасибо за вашу помощь.

1 Ответ

1 голос
/ 26 марта 2020

К сожалению, вы не можете использовать больше внутренних символов внутри 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

Используемый шаблон лучше визуализируется, например:

Regular expression visualization

Как вы можете видеть, он позволяет "role 1" и "Role 1" и допускают даты, написанные как "1/1/2020" или "10/10/2020".

Если вы получили тонны данных, лучше / быстрее подход быть делать это в памяти через массивы. Надеюсь, это поможет вам.

Примечание: В настоящее время вы используете da sh вместо дефиса после "Role 1".

...