-1
votes

Tout ce que je peux faire pour améliorer mon code VBA?

J'ai écrit une macro VBA pour supprimer automatiquement certaines lignes, Je ne sais pas pourquoi ça ne finit jamais le traitement.

pourrait-il être une erreur dans mon code? P>

Appréciez toute aide. P>

Sub AutoProcess()

Application.ScreenUpdating = False
Application.Calculation = xlManual

Dim Row, RowCount

RowCount = ActiveSheet.UsedRange.Rows.Count

For Row = 3 To RowCount
    If ActiveSheet.Cells(Row, 7).Value = 0 And ActiveSheet.Cells(Row, 9).Value = 0 Then
        Rows(Row).Delete
        RowCount = ActiveSheet.UsedRange.Rows.Count
        Row = Row - 1
    End If
Next Row

MsgBox ("finished")

Application.Calculate
Application.ScreenUpdating = True

End Sub


4 commentaires

Inverser la boucle pour que vous alliez de rowcount à 0 - vous n'avez pas besoin de réinitialiser RowCount et vous n'avez pas besoin de faire rangée = rangée - 1 . Moins de lignes codées signifie généralement une probabilité plus faible pour les insectes.


Juste pour double vérifier - vous do voulez vérifier "la valeur est 0 " et non "cellule est vide" ( activeheet.cells (ligne, 7). Valeur = "" )? Essayez de passer à travers une ligne à la fois avec F8 pour voir où il passe mal, et éventuellement utiliser débogage.print Row & ":" & ActiveHeet.cells (rangée, 7) .value & "," & "," & "," & ActiveHeet.Cells (Rangée, 9) .Value Pour vérifier les valeurs avant de faire votre si Déclaration


@Enigmativity Oui! C'est une très bonne idée. Merci


@ Chronocidal Je veux vérifier si son 0 pas vide, bonne idée étape par étape.


4 Réponses :


1
votes
For Row = RowCount to 3 Step -1
    If ActiveSheet.Cells(Row, 7).Value = 0 And ActiveSheet.Cells(Row, 9).Value = 0 Then
        Rows(Row).EntireRow.Delete
    End If
Next Row

4 commentaires

J'ai appris du débordement de pile >> Ne jamais utiliser activeheet et il est préférable d'utiliser une variable pour la feuille. C'est vraiment utile.


Merci, bon de savoir devrait éviter une feuille d'activité. Cependant, Row = Row-1 est pour, quand une ligne est supprimée, je suppose que toute la ligne suivante déplacerait une rangée vers le haut (peut-être que je me trompe? Besoin de test)


Vous n'avez pas besoin de ligne = rangée-1 dans le code ci-dessus si vous utilisez Step-1 et que vous vous déplacez vers le haut de la ligne inférieure


Ah, vous calculez en arrière! Sûr que c'est une meilleure idée que la mienne



1
votes

Essayez d'utiliser Union pour la vitesse

Sub Delete_Rows_Using_Evaluate()
    Dim x, ws As Worksheet, r As Range

    Application.ScreenUpdating = False
    Application.Calculation = xlManual
        Set ws = ThisWorkbook.Sheets("Sheet1")

        With ws
            Set r = .Range("G3:G" & .Cells(Rows.Count, 7).End(xlUp).Row)
            x = Filter(.Evaluate("TRANSPOSE(IF((" & r.Address & "=0)+(" & r.Offset(, 2).Address & "=0),""A"" & ROW(" & r.Address & ")))"), False, False)
            If UBound(x) = -1 Then Exit Sub
            .Range(Join(x, ",")).EntireRow.Delete
        End With
    Application.Calculation = xlAutomatic
    Application.ScreenUpdating = True
End Sub


0 commentaires

0
votes

Vous pouvez utiliser une colonne "Helper" et une formule

With Range(Cells(3, 7), Cells(Rows.Count, 7).End(xlUp))
    With .Offset(, .Parent.UsedRange.Columns.Count)
        .FormulaR1C1 = "=IF(SUM(RC7,RC9)=0,1,"""")"
        .SpecialCells(xlCellTypeFormulas, xlNumbers).EntireRow.Delete
        .Delete
    End With
End With


0 commentaires

0
votes

Ceci utilise un filtre plutôt que de boucler.
J'ai également utilisé .cells (.rowows.count, 1) .end (xlup) .ROW plutôt que useRange comme cela peut renvoyer des résultats incorrects. xxx


0 commentaires