Мне было интересно, если есть способ удалить определенные строки, основанные на различных данных столбца и ячейки в Excel VBA - PullRequest
0 голосов
/ 30 июня 2018

У меня есть таблица, которую я регулярно использую для составления графика профилактического обслуживания. Электронная таблица содержит более 4300 строк и 600 столбцов. Это моя основная электронная таблица, которую я использую для планирования технического обслуживания.

Столбцы, начинающиеся с "A", содержат

  • Колонка "A", заголовок "system",
  • Колонка "B", заголовок "sub-system",
  • Колонка "C", заголовок "asset",
  • Множество столбцов в диапазоне между столбцом "C" header "Asset" и столбцом "EH" "Name", которые содержат недели в течение трех лет и другие заголовки
  • Колонка "EH" "Name",
  • Столбец "EI" "Date" и
  • Колонка "EJ" "Initials".

Ячейки, связанные с неделями, отформатированными для дат, содержат динамические строки, такие как "W-1, or IS-3, or E3-1" в динамических ячейках вверх и вниз по столбцу. Я включил скриншот примера того, что я ищу. Рабочий лист называется Schedule, а также рабочая книга. Буду признателен за любую помощь, которую вы можете оказать с помощью VBA, чтобы автоматизировать этот трудоемкий процесс.

Schedule example

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Это пересечение строк с непустыми ячейками в столбце C и строк с пустыми ячейками в столбце D:

Set r = Range("C:C").SpecialCells(xlCellTypeConstants).Offset(, 1)
Intersect(r, r.SpecialCells(xlCellTypeBlanks)).EntireRow.Delete
0 голосов
/ 30 июня 2018

Если я правильно понимаю ваш вопрос, вы просто хотите удалить все строки в листе, при условии, что определенный критерий в столбце D соответствует? Следующий код сделает это, но, пожалуйста, обязательно сделайте резервную копию файла, прежде чем пытаться это сделать!

Sub deleteRowsBasedOnCriteria()
    Dim i As Long, lastRow As Long
    Dim sht As Worksheet

    Application.ScreenUpdating = False

    Set sht = ThisWorkbook.Sheets("test") ' change sheet name to correct one in production

    With sht
        lastRow = .Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row
        For i = lastRow To 2 Step -1 ' presuming there are headers at the top in row 1

            ' if necessary, change the criterion or add more criteria --> this is just based on your example
            If .Cells(i, 4).Value <> "X" Then .Rows(i).Delete

        Next i
    End With

    Application.ScreenUpdating = True

End Sub

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...