Ta bort celler med hjälp av "För varje... Loopa till Nästa i Excel

Anteckning

Office 365 ProPlus byter namn till Microsoft 365-appar för företag. Mer information om den här ändringen finns i det här blogginlägget.

Sammanfattning

I Microsoft Excel 2002 och senare versioner av Excel tas celler bort i "För varje... Loopa sedan på ett annat sätt än Microsoft Excel 97 och tidigare versioner av Excel.

I den här artikeln beskrivs skillnaderna och ett exempel på Visual Basic for Applications-makron som visar hur du tar bort celler i en slinga.

Mer information

Microsoft tillhandahåller programmeringsexempel enbart i förklarande syfte och gör inga utfästelser, varken uttryckligen eller underförstått. Detta omfattar men begränsas inte till underförstådd garanti för säljbarhet eller lämplighet för ett visst syfte. I denna artikel förutsätts att du känner till det programmeringsspråk som demonstreras och de verktyg som används för att skapa och felsöka procedurer. Microsofts supporttekniker kan hjälpa dig att förklara funktionaliteten i en viss procedur. De ändrar dock inte de här exemplen för att ge ytterligare funktioner eller skapa procedurer så att de uppfyller dina specifika krav.

Exempeldata

Om du vill använda makrot i den här artikeln skriver du följande exempeldata i ett kalkylblad:

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

Exempelmakro

I en ny makromodul skriver du följande 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

Beteende för exempelmakro i Excel 2002 och i senare versioner av Excel

När du kör makrot DeleteCells i Excel 2002 och i senare versioner av Excel tas bara raderna 3, 6 och 8 bort. Även om rad 4 och 9 innehåller ett "x" i kolumn A tar makrot inte bort raderna. Resultatet av makrot är följande:

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

När microsoft Excel tar bort rad 3 flyttas alla celler uppåt en rad. Cell A3 antar till exempel innehållet i cell A4, cell A4 antar innehållet i cell A5 och så vidare. Efter för varje ... Nästa slinga utvärderar en cell, den utvärderar nästa cell. När celler flyttas kan de därför hoppas över av loopen.

Beteende för exempelmakro i Microsoft Excel 5.0 och Microsoft Excel 7.0

När du kör makrot DeleteCells i Excel 5.0 och Excel 7.0, tas alla rader som innehåller ett "x" bort i makrot. Resultatet av makrot är följande:

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

När rad 3 tas bort flyttas alla celler uppåt en rad. Cell A3 antar sedan innehållet i cell A4, cell A4 antar innehållet i cell A5 och så vidare.

Men till skillnad från loopen i Excel 2002 och i senare versioner av Excel, när "För varje... Med loopen Next utvärderas en cell i Excel 5.0, och i Excel 7.0 omvärderas cellen om den tas bort i loopen. Därför hoppas inte cellerna över.

Använd följande makro när du vill använda en slinga för att ta bort celler:

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

Resultatet av det här makrot i alla versioner av Excel är följande:

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

Ytterligare metod för att använda en slinga för att ta bort celler

Det här är en alternativ metod än den metod som visas ovan. Den här metoden ger samma resultat.

 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