Cellen verwijderen met behulp van een 'Voor elke... Volgende" lus in Excel

Samenvatting

Microsoft Excel 2002 en latere versies van Excel verwijderen cellen in een 'Voor elke... Volgende" lus op een andere manier dan Microsoft Excel 97 en eerdere versies van Excel doen.

In dit artikel worden de verschillen beschreven en wordt een Visual Basic for Applications-macrovoorbeeld weergegeven dat laat zien hoe u cellen in een lus verwijdert.

Meer informatie

Microsoft verstrekt programmeervoorbeelden alleen ter illustratie, zonder expliciete of impliciete garantie. daaronder mede begrepen, maar niet beperkt tot impliciete garanties met betrekking tot de verkoopbaarheid en/of geschiktheid voor een bepaald doel. In dit artikel wordt ervan uitgegaan dat u bekend bent met de programmeertaal VBScript, alsmede met de hulpprogramma's waarmee procedures worden gemaakt en waarmee fouten in procedures worden opgespoord. Ondersteuningsmedewerkers van Microsoft kunnen helpen bij de uitleg over de functionaliteit van een bepaalde procedure. Deze medewerkers zullen de voorbeelden echter niet aanpassen om extra functionaliteit toe te voegen of om procedures te maken die aan uw specifieke eisen voldoen.

Voorbeeldgegevens

Als u de macro in dit artikel wilt gebruiken, typt u de volgende voorbeeldgegevens in een werkblad:

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

Voorbeeldmacro

Typ in een nieuwe macromodule de volgende macro.

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

Gedrag van de voorbeeldmacro in Excel 2002 en in latere versies van Excel

Wanneer u de macro DeleteCells uitvoert in Excel 2002 en in latere versies van Excel, worden alleen de rijen 3, 6 en 8 verwijderd. Hoewel rij 4 en 9 een 'x' in kolom A bevatten, worden de rijen niet verwijderd door de macro. De resultaten van de macro zijn als volgt:

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

Wanneer Rij 3 in Microsoft Excel wordt verwijderd, worden alle cellen één rij omhoog verplaatst. Cel A3 gaat bijvoorbeeld uit van de inhoud van cel A4, cel A4 van de inhoud van cel A5, enzovoort. Na de For Each... De volgende lus evalueert een cel en de volgende cel; Wanneer cellen worden verschoven, kunnen ze daarom door de lus worden overgeslagen.

Gedrag van de voorbeeldmacro in Microsoft Excel 5.0 en Microsoft Excel 7.0

Wanneer u de macro DeleteCells uitvoert in Excel 5.0 en in Excel 7.0, verwijdert de macro alle rijen met een 'x'. De resultaten van de macro zijn als volgt:

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

Wanneer rij 3 wordt verwijderd, worden alle cellen één rij omhoog verplaatst. Vervolgens wordt in cel A3 uitgegaan van de inhoud van cel A4, cel A4 de inhoud van cel A5, enzovoort.

In tegenstelling tot het gedrag van de lus in Excel 2002 en in latere versies van Excel, wanneer de "Voor elke... De lus Next" evalueert een cel in Excel 5.0 en in Excel 7.0 evalueert de lus de cel opnieuw als deze in de lus wordt verwijderd. Daarom worden de cellen niet overgeslagen.

Gebruik de volgende macro als u een lus wilt gebruiken om cellen te verwijderen:

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

De resultaten van deze macro in alle versies van Excel zijn als volgt:

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

Aanvullende methode voor het gebruik van een lus om cellen te verwijderen

Dit is een alternatieve methode voor de methode die hierboven wordt weergegeven. Deze methode produceert dezelfde resultaten.

 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