Usuwanie komórek za pomocą "Dla każdego... Pętla Dalej w programie Excel

Uwaga

Nazwa usługi Office 365 ProPlus została zmieniona na Aplikacje usługi Microsoft 365 dla przedsiębiorstw. Aby uzyskać więcej informacji na temat tej zmiany, przeczytaj ten wpis w blogu.

Podsumowanie

Program Microsoft Excel 2002 i nowsze wersje programu Excel usuwają komórki w ciągu "Dla każdego... Pętla Dalej" w inny sposób niż w programie Microsoft Excel 97 i wcześniejszych wersjach programu Excel.

W tym artykule opisano różnice i pokazano w nim przykład makr języka Visual Basic for Applications, który przedstawia sposób usuwania komórek w pętli.

Więcej informacji

Firma Microsoft podaje przykłady programowania tylko dla celów ilustracyjnych, nie udzielając żadnej rękojmi, wyrażonej wprost ani dorozumianej, w tym także, ale nie tylko, dorozumianej rękojmi co do przydatności handlowej lub do określonych celów. W tym artykule zakłada się, że czytelnik zna demonstrowany język programowania oraz narzędzia używane do tworzenia i debugowania procedur. Inżynierowie pomocy technicznej firmy Microsoft mogą pomóc w objaśnieniach funkcjonalności określonej procedury. Nie będą one jednak modyfikować tych przykładów w celu zapewnienia dodatkowych funkcji ani konstruowania procedur w celu spełnienia określonych wymagań.

Dane przykładowe

Aby użyć makra w tym artykule, wpisz następujące przykładowe dane w arkuszu:

A1: a B1: 1
A2: b B2: 2
A3: x B3: 3
A4: x B4: 4
A5: c B5: 5
A6: x B6: 6
A7: d B7: 7
A8: x B8: 8
A9: x B9: 9
A10: e B10: 10

Przykładowe makro

W nowym module makra wpisz następujące makro.

Sub DeleteCells()

     'Loop through cells A1:A10 and delete cells that contain an "x."
     For Each c in Range("A1:A10")
        If c = "x" Then c.EntireRow.Delete
    Next

End Sub

Zachowanie przykładowego makra w programie Excel 2002 i nowszych wersjach programu Excel

Po uruchomieniu makra DeleteCells w programie Excel 2002 i nowszych wersjach programu Excel usuwane są tylko wiersze 3, 6 i 8. Chociaż wiersze 4 i 9 zawierają w kolumnie A znak "x", makro nie usuwa wierszy. Wyniki makra są następujące:

A1: a B1: 1
A2: b B2: 2
A3: x B3: 4
A4: c B4: 5
A5: d B5: 7
A6: x B6: 9
A7: e B7: 10

Gdy program Microsoft Excel usunie wiersz 3, wszystkie komórki są przesuwane o jeden wiersz w górę. Na przykład komórka A3 przyjmuje zawartość komórki A4, komórka A4 przyjmuje zawartość komórki A5 itd. Po godzinie "Dla każdego" Następna pętla oblicza komórkę, oblicza następną komórkę; dlatego zmiana komórek może spowodować ich pominięcie w pętli.

Zachowanie przykładowego makra w programach Microsoft Excel 5.0 i Microsoft Excel 7.0

Po uruchomieniu makra DeleteCells w programie Excel 5.0 i Excel 7.0 makro usuwa wszystkie wiersze zawierające znak "x". Wyniki makra są następujące:

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

Po usunięciu wiersza 3 wszystkie komórki są przesuowane o jeden wiersz w górę. Następnie w komórce A3 jest założona zawartość komórki A4, komórka A4 przyjmuje zawartość komórki A5 i tak dalej.

Jednak w przeciwieństwie do zachowania pętli w programie Excel 2002 i w nowszych wersjach programu Excel, gdy "Dla każdego... W pętli "Dalej" komórka w programie Excel 5.0 i Excel 7.0 jest ponownie oceniana przez pętlę, jeśli komórka zostanie usunięta w pętli. Dlatego komórki nie są pomijane.

Aby usunąć komórki w pętli, użyj następującego makra:

Sub DeleteCells2()

     Dim rng As Range
     Dim i As Integer, counter As Integer
    
     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")
    
     'initialize i to 1
     i = 1
    
     'Loop for a count of 1 to the number of rows
     'in the range that you want to evaluate.
     For counter = 1 To rng.Rows.Count
    
          'If cell i in the range contains an "x",
           'delete the row.
           'Else increment i
            If rng.Cells(i) = "x" Then
                rng.Cells(i).EntireRow.Delete
            Else
                i = i + 1
            End If
    
     Next

End Sub

Wyniki tego makra we wszystkich wersjach programu Excel są następujące:

A1: a B1: 1
A2: b B2: 2
A3: c B3: 5
A4: d B4: 7
A5: e B5: 10

Dodatkowa metoda używania pętli do usuwania komórek

Jest to metoda alternatywna dla metody pokazanej powyżej. Ta metoda daje takie same wyniki.

 Sub DeleteCells3()

     Dim rng As Range, i As Integer

     'Set the range to evaluate to rng.
     Set rng = Range("A1:A10")

     'Loop backwards through the rows
     'in the range that you want to evaluate.
     For i = rng.Rows.Count To 1 Step -1
    
             'If cell i in the range contains an "x", delete the entire row.
             If rng.Cells(i).Value = "x" Then rng.Cells(i).EntireRow.Delete
     Next

End Sub