2013-07-12 3 views
30

Я новичок в VBA, и я пытаюсь найти способ удалить все строки (и, если возможно, сдвинуть ячейки), где ячейка столбца веб-сайта содержит слово none. Таблица содержит 5000+ записей, и это сэкономит мне много времени.Удалить целую строку, если ячейка содержит строку X

Я ценю любые предложения. Спасибо заранее!

http://i39.tinypic.com/5ano1d.png

+3

Вы пробовали какой-либо код (на этом сайте есть ** очень много примеров на удаление строк с помощью VBA), а если нет, рассмотрели ли вы сортировку, а затем удалили смежный диапазон, который для больших томов может все-таки быстрее? – pnuts

+0

Существует ответ, который почти точно вы ищете. Вам просто нужно изменить критерии для автофильтра. [Эффективный способ удаления всей строки, если ...] (http://stackoverflow.com/a/16901714/138938) –

ответ

61

Это не задача VBA. Эта задача проще всего разрешена с помощью фильтра «Авто».

1.Insert Авто фильтр (В Excel 2010 нажмите на дома-> (Редактирование) Сортировка & Фильтр -> Фильтр)
2. Фильтр по столбце 'Веб-сайты'
3. Отметьте 'ни' и удалить их
4. Очистить фильтр

0

Попробуйте это ...

Dim r as Range 
Dim x as Integer 

For x = 5000 to 4 step -1 '---> or change as you want //Thanx 4 KazJaw 

    set r = range("E" & format(x)) 
    if ucase(r.Value) = "NONE" then 
    Rows(x).EntireRow.Delete 
    end if 

Next 
+0

С 5000+ записей лучше фильтровать и удалять, а не циклировать. – Santosh

+0

@Santosh .. возможно, вы правы! .. Я постараюсь добавить .. – matzone

+1

@matzone, вы не должны использовать такой цикл для удаления процесса. Всегда используйте 'For i = 5000 to 4 Step -1', если вы хотите удалить все элементы определенного типа точно! –

1

Это упоминалось в другом комментарии, но вы могли бы попробовать что-то вроде этого.

Sub FilterAndDelete() 

Application.DisplayAlerts = False 

    With Sheet1 'Change this to your sheet name 

     .AutoFilterMode = False 
     .Range("A3:K3").AutoFilter 
     .Range("A3:K3").AutoFilter Field:=5, Criteria1:="none" 
     .UsedRange.Offset(1, 0).Resize(ActiveSheet.UsedRange.Rows.Count - 1).Rows.Delete 

    End With 

Application.DisplayAlerts = True 

End Sub 

Я не проверял это, и это из памяти, поэтому может потребоваться некоторые настройки, но он должен получить работу без зацикливания через тысячи строк. Вам нужно будет удалить 11-июля так, чтобы UsedRange был правильным или изменил смещение на 2 строки вместо 1 в .Offset(1,0).

Как правило, перед тем, как я сделаю .Delete Я буду запускать макрос с .Select вместо Delete таким образом. Я могу быть уверен, что правильный диапазон будет удален, что может быть полезно сделать, чтобы проверить, удаляется ли соответствующий диапазон.

16

Хорошо, я знаю, что это для VBA, но если вам нужно сделать, это для отключения сразу насыпью удаления вы можете использовать следующие функции Excel: http://blog.contextures.com/archives/2010/06/21/fast-way-to-find-and-delete-excel-rows/ Надеюсь, что это помогает любому

Пример глядя для строки «бумага»:

  1. В диалоговом окне «Найти и заменить» введите «бумага» в поле «Найти».
  2. Нажмите «Найти все», чтобы просмотреть список ячеек с «бумагой»
  3. Выберите элемент в списке и нажмите Ctrl + A, чтобы выбрать весь список, и выберите все ячейки «бумага» на Рабочий лист.
  4. На вкладке «Главная лента» нажмите «Удалить», а затем «Удалить строки листов».
+0

Блестящий! Единственный способ, которым я мог найти это навалом (не используя VBA). – Holf

+0

Это ответ, который должен был быть принят. Использование фильтров неосуществимо, когда у вас есть 50 000 + строк. –

+0

FYI: Это решение только для Windows, не работает в OSX Excel unfortunatley. –

2

В «вкладке разработчика» перейдите к «Visual Basic» и создайте модуль. Скопируйте вставить следующее. Помните об изменении кода, в зависимости от того, что вы хотите. Затем запустите модуль.

Sub sbDelete_Rows_IF_Cell_Contains_String_Text_Value() 
    Dim lRow As Long 
    Dim iCntr As Long 
    lRow = 390 
    For iCntr = lRow To 1 Step -1 
     If Cells(iCntr, 5).Value = "none" Then 
      Rows(iCntr).Delete 
     End If 
    Next 
    End Sub 

lRow: Поместите количество строк, что текущий файл.

число «5» в «Если» для пятой (E) колонок

4

Я хотел бы добавить @ ответ МОК в. Хотя я нашел ответ @ MBK очень полезным при решении подобной проблемы, было бы лучше, если бы @MBK включил скриншот, как фильтровать определенный столбец. enter image description here

Смежные вопросы