Удалить несколько строк, если данные равны нулю в любом из 2 столбцов - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть набор данных, в котором каждая строка состоит из столбцов: год, название колледжа, количество студентов старших курсов и количество аспирантов.

Для каждого названия колледжа имеется 4 строки данных (2013-2016 годы). Если отсутствуют какие-либо данные для ЛЮБОГО числа студентов старших курсов или числа аспирантов за любой из 4 лет, я хочу удалить ВСЕ 4 строки для этого колледжа.

Как бы я поступил так?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Как уже упоминалось в комментариях, это возможно по формуле, но тяжелая работа

=IFERROR(IF(MOD(ROW(),4)=2,INDEX(A:A,MATCH(1,(SUBTOTAL(2,OFFSET($C$2,(ROW($A$1:$A$10)-1)*4,0,4,2))=8)*
(COUNTIF($I$1:$I1,INDEX($B:$B,N(IF({1},(ROW($A$1:$A$10)-1)*4+2))))=0),0)*4-2),
INDEX(A:A,MATCH($I1,$B:$B,0)+MOD(ROW()-2,4))),"")

Первые две строки формулы относятся к строке 1 блока из 4 записей, а третья строка относится к строкам 2-4.

В первой строке формулы используются «Смещение» и «Подытог», чтобы проверить 4 × 2 блока чисел учащихся, чтобы увидеть, равно ли число 8. Матч выбирает первый колледж, который имеет полные данные и ранее не был в списке.

Во второй строке используется конструкция Index, чтобы получить список различных названий колледжей и проверить, были ли они уже перечислены с помощью Countif. ROW ($ A $ 1: $ A $ 10) потребуется изменить, чтобы иметь дело с более чем 10 колледжами.

Третья строка формулы находит соответствующую запись колледжа, используя имя в строке над текущей строкой, и получает данные из соответствующей строки и столбца в исходных данных.

enter image description here

Предполагается, что все начинается в строке 2.

0 голосов
/ 28 апреля 2018

Это должно сделать это. Предполагается, что поле года является числом, а не текстом.

Sub DeleteColleges()
    Set rg = ActiveSheet.Range("a2")

    Do While Not rg = ""
        If rg.Offset(0, 2) = "" Or rg.Offset(0, 3) = "" Then
            yearRow = rg.Value - 2012   'see note 1
            Set rg = rg.Offset(5 - yearRow, 0)  'see note 2
            rg.Offset(-4, 0).Range("a1:a4").EntireRow.Delete
        Else
            Set rg = rg.Offset(1, 0)
        End If
    Loop
End Sub

Примечание 1: вычисляет, в каком году мы находимся, от строки 1 для 2013 года до строки 4 для 2016 года

Примечание 2: диапазон ('rg') перемещается в следующий колледж до того, как мы удалим строки, иначе rg станет нулевым, когда мы удалим строки, и макрос потерпит неудачу

Примечание 3: код должен быть более надежным, чем этот. Как минимум, я бы гарантировал, что число строк данных кратно четырем (все остальное будет указывать на проблему с данными), а этот столбец A содержит только четыре значения с 2013 по 2016 год.

Может также стоить изменить код, чтобы искать не числа, а не только пустые ячейки

...