Odstranění buněk pomocí příkazu "For Each... Další" smyčka v Excelu

Souhrn

Aplikace Microsoft Excel 2002 a novější verze aplikace Excel odstraňují buňky v objektu "For Each... Další" smyčka jiným způsobem než Microsoft Excel 97 a starší verze excelu.

Tento článek popisuje rozdíly a poskytuje příklad makra jazyka Visual Basic for Applications, který ukazuje, jak odstranit buňky ve smyčce.

Další informace

Společnost Microsoft poskytuje ukázky programování pouze pro ilustraci, bez žádné záruky výslovně uvedené nebo odvozené, včetně, bez omezení, odvozených záruk vztahujících se k obchodovatelnosti nebo vhodnosti pro určitý účel. Tento článek předpokládá, že uživatel je obeznámen s programovacím jazykem, který je předmětem ukázky, a s nástroji použitými pro vytvoření a ladění skriptu. Technici podpory společnosti Microsoft mohou pomoci vysvětlit funkce konkrétního postupu. Nebudou však upravovat tyto příklady tak, aby poskytovaly přidanou funkcionalitu nebo sestavovaly postupy, které splňují vaše specifické požadavky.

Ukázková data

Chcete-li použít makro v tomto článku, zadejte do listu následující ukázková data:

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

Ukázkové makro

V novém modulu makra zadejte následující 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

Chování ukázkového makra v Excelu 2002 a novějších verzích Excelu

Při spuštění makra DeleteCells v aplikaci Excel 2002 a novějších verzích aplikace Excel jsou odstraněny pouze řádky 3, 6 a 8. I když řádky 4 a 9 obsahují ve sloupci A "x", makro řádky neodstraní. Výsledky makra jsou následující:

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

Když aplikace Microsoft Excel odstraní řádek 3, všechny buňky se přesunou o jeden řádek nahoru. Například buňka A3 přebírá obsah buňky A4, buňka A4 převezme obsah buňky A5 atd. Za pro každý... Smyčka Next vyhodnocuje buňku, vyhodnotí další buňku; proto, když jsou buňky posunuty, mohou být vynechány smyčkou.

Chování ukázkového makra v Microsoft Excelu 5.0 a Microsoft Excelu 7.0

Když spustíte makro DeleteCells v Aplikaci Excel 5.0 a Excel 7.0, makro odstraní všechny řádky, které obsahují "x". Výsledky makra jsou následující:

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

Po odstranění řádku 3 se všechny buňky přesunou o jeden řádek nahoru. Buňka A3 pak převezme obsah buňky A4, buňka A4 převezme obsah buňky A5 atd.

Na rozdíl od chování smyčky v aplikaci Excel 2002 a novějších verzích aplikace Excel, když "For Each... Smyčka Next" vyhodnocuje buňku v Aplikaci Excel 5.0 a v Excelu 7.0 smyčka znovu vyhodnotí buňku, pokud je odstraněna ve smyčce. Proto se buňky nepřeskočí.

Pokud chcete k odstranění buněk použít smyčku, použijte následující makro:

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

Výsledky tohoto makra ve všech verzích Excelu jsou následující:

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

Další metoda pro odstranění buněk pomocí smyčky

Jedná se o alternativní metodu metody, která je uvedena výše. Tato metoda generuje stejné výsledky.

 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