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éinitialiserRowCount code> et vous n'avez pas besoin de fairerangé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 utiliserdébogage.print Row & ":" & ActiveHeet.cells (rangée, 7) .value & "," & "," & "," & ActiveHeet.Cells (Rangée, 9) .Value code> Pour vérifier les valeurs avant de faire votresi 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.