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 Réponses :
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
J'ai appris du débordement de pile >> Ne jamais utiliser activeheet code> 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
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
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
Ceci utilise un filtre plutôt que de boucler.
J'ai également utilisé .cells (.rowows.count, 1) .end (xlup) .ROW code> plutôt que
useRange code> comme cela peut renvoyer des résultats incorrects.
Inverser la boucle pour que vous alliez de
rowcount code> à
0 code> - vous n'avez pas besoin de réinitialiser
RowCount code> et vous n'avez pas besoin de faire
rangée = rangée - 1 code>. Moins de lignes codées signifie généralement une probabilité plus faible pour les insectes.
Juste pour double vérifier - vous do i> voulez vérifier "la valeur est
0 code>" et non "cellule est vide" (
activeheet.cells (ligne, 7). Valeur = "" code>)? 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 code> Pour vérifier les valeurs avant de faire votre
si code> 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.