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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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
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
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
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
Dans ta procédure, tu as une ligne de code qui se lit comme suit :
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)
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