Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Boucle qui ne se complète pas

2 réponses
Avatar
Roland Miller
Bonjour,

Dans un tableau dont j'ai 8000 lignes je lance la macro ci-dessous. Une foi=
s qu'elle serait compl=C3=A9t=C3=A9e il y aurait approximativement 50000 li=
gnes.

Mais elle ne r=C3=A9ussit pas =C3=A0 se compl=C3=A9ter. Je dois faire une c=
ontrol alt supprime pour arr=C3=AAter le tout.

Cependant =E2=80=A6 si je l'arr=C3=AAte =C3=A0 chaque ligne dont =C3=A7a aj=
oute les lignes (valeur 5) =C3=A7a ne bloque pas.

=C3=80 votre avis =E2=80=A6 est-ce parce qu'il manque un bout de code comme=
DoEvents ou Wait ??? Merci =C3=A0 l'avance.


For i =3D Feuil54.Range("CN_FMDetFMIdentifZone").Cells.Count To 1 Step -1

If Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Value =3D 5 And _
Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Interior.ColorIndex =3D=
35 Then

'MsgBox (Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Row)

Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Interior.ColorIndex=
=3D 15
=20
Feuil54.Range("CN_FMDetAmounts5RowsFormCopy").EntireRow.Copy

Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).EntireRow.Insert

Application.CutCopyMode =3D False
'Feuil54.DisplayPageBreaks =3D False

'Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Interior.ColorInde=
x =3D 15

'MsgBox (Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Row)

End If

Next

2 réponses

Avatar
MichD
Le 14/08/19 à 09:55, Roland Miller a écrit :
Bonjour,
Dans un tableau dont j'ai 8000 lignes je lance la macro ci-dessous. Une fois qu'elle serait complétée il y aurait approximativement 50000 lignes.
Mais elle ne réussit pas à se compléter. Je dois faire une control alt supprime pour arrêter le tout.
Cependant … si je l'arrête à chaque ligne dont ça ajoute les lignes (valeur 5) ça ne bloque pas.
À votre avis … est-ce parce qu'il manque un bout de code comme DoEvents ou Wait ??? Merci à l'avance.
For i = Feuil54.Range("CN_FMDetFMIdentifZone").Cells.Count To 1 Step -1
If Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Value = 5 And _
Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Interior.ColorIndex = 35 Then
'MsgBox (Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Row)
Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Interior.ColorIndex = 15
Feuil54.Range("CN_FMDetAmounts5RowsFormCopy").EntireRow.Copy
Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).EntireRow.Insert
Application.CutCopyMode = False
'Feuil54.DisplayPageBreaks = False
'Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Interior.ColorIndex = 15
'MsgBox (Feuil54.Range("CN_FMDetFMIdentifZone").Cells(i).Row)
End If
Next

Bonjour,
Ce serait bien d'expliquer ce que tu tentes de faire lorsque tu publies
une macro. Quand une macro ne fonctionne pas comme l'usager le voudrait
nous devons tenter d'extraire la question à partir d'un code déficient.
Dans la boucle "For", tu insères de nouvelles lignes. Ces lignes
s'insèrent jusqu'au-dessus de la ligne identifiée. À l'aide de la touche
F8, fais tourner la boucle et observe ce qui se passe...
'------------------------
Sub Exemple()
Dim A As Long, B As Long
B = 10
For A = B To 1 Step -1
A = B + 1
Next
End Sub
'------------------------
Moi, je te propose une approche beaucoup plus rapide :
Dans ma procédure, remplace le nom de la feuille et de la plage de
cellules pour ceux de ton environnement.
Au lieu d'utiliser ceci :.Range("CN_FMDetFMIdentifZone"), emploie
par exemple la colonne où se retrouve la valeur 5 et la bonne couleur.
Comme tu insères des lignes, exemple, la plage pourrait être :
C10:C1000000 pour être certain d'inclure toutes les lignes même celles
que la procédure ajoute.
Dans la boucle, à toi de définir le code qui doit s'exécuter.
'------------------------------------
Sub TrouverFormat()
Dim Rg As Range, C As Range
Dim LeCellFormat As CellFormat
Set LeCellFormat = Application.FindFormat
'Détermine les caractéristiques
'du format de cellule recherché.
With LeCellFormat
.Clear 'S'assurer d'effacer les critères
'des anciennes recherches
.Interior.ColorIndex = 35
'La liste pourrait être plus longue ...
End With
'Détermine la plage de cellules où s'effectue
'la recherche
With Worksheets("Feuil1") 'Nom de la feuille à définir
'Faire la recherche dans toute la colonne A, à adapter
Set Rg = .Range("A:A")
'Pour limiter la recherche à une colonne particulière
'Set Rg = .Range("A:A")
End With
Application.EnableEvents = False
Application.ScreenUpdating = False
'Trouve la cellule ayant le bon format pour
'y effectuer une ou des opérations quelconques...
With Rg
Set C = .Find(What:=5, SearchFormat:=True)
If Not C Is Nothing Then
adr = C.Offset(1).Address
Do
'Le code que tu veux exécuter
'la ligne à copier + la ligne à insérer
C.Insert
'pour passer à la cellule suivante ...
Set C = .Find(What:="5", after:=C, SearchFormat:=True)
Loop Until C.Address = adr
End If
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'------------------------------------
MichD
Avatar
MichD
Dans ta procédure, tu as une ligne de code qui se lit comme suit :
Feuil54.Range("CN_FMDetAmounts5RowsFormCopy").EntireRow.Copy
Comme cette ligne est à l'intérieur d'une boucle, elle est copiée dans
le presse-papier aussi souvent qu'il y a de boucles.
Tu pourrais plutôt faire comme cela :
'Déclaration de la variable dans le haut de la procédure.
Dim Rg As range
'Avant le début de la boucle
Set Rg = Feuil54.Range("CN_FMDetAmounts5RowsFormCopy").EntireRow
ET dans la boucle, tu n'a qu'à insérer cette ligne de code
En supposant que tu veux copier la plage de cellule dans la ligne qui
vient d'être ajouté lorsque ladite cellule C = 5 et que sa couleur = 35
Rg.copy c.offset(-1)
Le traitement se fera plus rapidement!
MichD