2013-07-12 26 views
30

Jestem nowy w VBA i próbuję wymyślić sposób usunięcia wszystkich wierszy (i przesunięcia komórek w górę, jeśli to możliwe), gdzie komórka kolumny witryny zawiera słowo none. Tabela zawiera 5000 rekordów, co zaoszczędziłoby mi sporo czasu.Usuń cały wiersz, jeśli komórka zawiera ciąg X

Doceniam wszelkie sugestie. Z góry bardzo dziękuję!

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

+3

Czy wypróbowałeś jakiś kod (są ** bardzo ** wiele przykładów na tej stronie, jak usuwać wiersze za pomocą VBA), a jeśli nie, to czy rozważałeś sortowanie, a następnie usuwanie sąsiedniego zakresu, który dla dużych objętości może być w każdym razie szybszym? – pnuts

+0

Istnieje odpowiedź, która jest prawie dokładnie tym, czego szukasz. Po prostu trzeba zmodyfikować kryteria autofiltra. [Wydajny sposób na usunięcie całego wiersza, jeśli ...] (http://stackoverflow.com/a/16901714/138938) –

Odpowiedz

61

To nie jest zadanie VBA - To konkretne zadanie jest najłatwiejsze niż automatyczne filtrowanie.

filtr

1. Włóż Auto (w Excelu 2010 kliknięcie strona główna-> (edycja) Sortuj & Filter -> Filter)
2. filtr na kolumnie 'stron internetowych'
3. Zaznaczyć 'none' i usuwać im
4. Wyczyść filtr

0

Spróbuj tego ...

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

Przy 5000+ rekordach lepiej filtrować i usuwać niż zapętlać. – Santosh

+0

@Santosh .. możesz mieć rację! .. Spróbuję dodać .. – matzone

+1

@matzone, nie powinieneś używać tego rodzaju pętli do usuwania procesu. Zawsze używaj 'For i = 5000 to 4 Step -1', jeśli chcesz usunąć wszystkie elementy pewnego typu na pewno! –

1

ten nawiązywał do innego komentarza, ale można spróbować czegoś takiego.

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 

Nie testowałem tego i to z pamięci, więc może to wymagać trochę szczypanie, ale powinien otrzymać pracę bez zapętlenie przez tysiące wierszy. Musisz usunąć 11-Jul, aby UsedRange był poprawny lub zmienić offset na 2 wiersze zamiast 1 w .Offset(1,0).

Generalnie, przed wykonaniem .Delete uruchomię makro z .Select zamiast Usuń w ten sposób, mogę być pewien, że poprawny zakres zostanie usunięty, co może być warte zrobienia, aby sprawdzić, czy odpowiedni zakres jest usuwany.

16

Ok wiem, że to dla VBA, ale jeśli trzeba to zrobić na raz off luzem usunąć można użyć następujących funkcji programu Excel: http://blog.contextures.com/archives/2010/06/21/fast-way-to-find-and-delete-excel-rows/ nadzieję, że pomoże każdemu

Przykład patrząc dla ciągu "papier":

  1. W oknie dialogowym Znajdź i zamień wpisz "papier" w polu Znajdź.
  2. Kliknij Znajdź wszystko, aby wyświetlić listę komórek z "papierem"
  3. Wybierz pozycję z listy, a następnie naciśnij Ctrl + A, aby wybrać całą listę, a następnie zaznacz wszystkie "papierowe" komórki na liście. arkusz roboczy.
  4. Na karcie Strona wstążki kliknij przycisk Usuń, a następnie kliknij przycisk Usuń wiersze arkusza.
+0

Genialny! Jedyny sposób, jaki mogłem znaleźć, aby zrobić to luzem (nie używając VBA). – Holf

+0

To jest odpowiedź, która powinna zostać przyjęta. Używanie filtrów nie jest możliwe, gdy masz 50 000 wierszy. –

+0

FYI: To jest tylko rozwiązanie dla systemu Windows, nie działa w systemie OSX Excel niefortunnie. –

2

W zakładce "Developer" przejdź do "Visual Basic" i utwórz moduł. Skopiuj wklej następujące. Pamiętaj o zmianie kodu, w zależności od tego, co chcesz. Następnie uruchom moduł.

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: Put liczbę rzędów, że obecny plik.

numer "5" w "If" to piąty (E) Kolumna

4

Chciałbym dodać do @ MBK za odpowiedź. Chociaż odpowiedź @ MBK okazała się bardzo pomocna w rozwiązaniu podobnego problemu, lepiej byłoby, gdyby @MBK zawierał zrzut ekranu dotyczący sposobu filtrowania konkretnej kolumny. enter image description here

Powiązane problemy