2015-11-19 5 views
0

Мне нужно создать макрос Excel VBA для калькулятора цепочки, поэтому мне нужно оставить первую запись и последнюю запись определенного имени и удалить все значения между ними. Например:Удаление определенных строк

EXAMPLE DATA IMAGE

EXAMPLE DATA IMAGE

Так что я хочу, чтобы оставить первый Rivor Minor253 и последний Rivor Minor253, но все средние из них должны быть удалены. Теперь я мог бы сделать это вручную, но у меня есть более 3000 строк, которые займут мне несколько дней, и я могу создать макрос, который удаляет дубликаты, но я не знаю, как создать тот, который будет удалять только средние.

Может ли кто-нибудь предоставить мне макрос, который соответствует моему описанию?

+0

Являются ли данные уже отсортированными так, что одни и те же строки идут один за другим, или нет сортировки, а макрос должен пройти все строки и выбрать те же самые? – GSazheniuk

+0

Да, данные уже отсортированы с помощью перекрестного имени. Все Rivor Minor253 находятся под друг друга, а также идут с Rivor Minor248, Rivor Minor250 и т. Д. @GSazheniuk – yabxi

ответ

0

Включите запись макроса сначала, если он склонен к этому. Предполагая, что CHAINAGE находится в Columna, в Row39 и скопировал вниз, чтобы удовлетворить, пожалуйста, попробуйте:

=OR(COUNTIF(B$1:B39,B39)=1,COUNTIF(B$1:B39,B39)=COUNTIF(B:B,B39)) 

Затем процеживают этот столбец, чтобы выбрать и удалить строки FALSE.

+0

К сожалению, вы имеете в виду выбрать Row39 до Row50? И как его фильтровать? – yabxi

+0

До конца вашего списка, где бы это ни было. Выберите столбец, DATA> Сортировка и фильтр, нажмите «Фильтр» на маленькую стрелку вниз, снимите флажок, кроме FALSE, OK, выберите строки с синим цветом, щелкните правой кнопкой мыши, «Удалить строку», затем «Фильтровать». – pnuts

+0

Я выбрал весь столбец A и пошел в DATA> Sort & Filter, нажал на маленькую стрелку вниз, снял флажок, но FALSE не было. Числа из столбца A были там. – yabxi

0

В качестве макроса это удивительно просто.

Sub del_brick() 
    Dim fr As Long, lr As Long 

    With Worksheets("Sheet1") '<~~ set this properly! 
     lr = Application.Match("zzz", .Columns(2)) 
     Do While lr > 40 '<~~ if lr is above row, there is nothing to delete 
      fr = Application.Match(.Cells(lr, 2).Value2, .Columns(2), 0) 
      If CBool(lr - fr - 1) Then 
       .Range(.Cells(fr + 1, 1), .Cells(lr - 1, 1)).EntireRow.Delete 
      End If 
      lr = fr - 1 
     Loop 
    End With 
End Sub 
+0

Что вы имеете в виду, если lr находится над строкой, нечего удалять? Спасибо, остальная часть макрокода. – yabxi

+0

Образец, который вы предоставили, показывает данные заголовка столбца в строке 38. Первая строка записей в цепочке в строке 39. Для того, чтобы удалить последнюю строку, должна быть строка 41 или выше, потому что если бы это была строка 40, 'строк для удаления. – Jeeped