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

temps éxécution macro trop long

23 réponses
Avatar
Caroual
Bonjour,
J'aurais aimé avoir un peu d'aide pour améliorer mon code.
J'ai un fichier texte sur 12000 lignes et 16 colonnes. Dans excel je
voudrais mettre 5 lignes sur une seule ligne et supprimer les lignes qui ont
été recopiées.
J'ai écrit ce code qui marche mais cela me semble anormalement long. (2
minutes d'éxécution)


Sub essai()
Application.ScreenUpdating = False
tata = Application.GetOpenFilename
Workbooks.OpenText Filename:=tata, Origin:=xlMSDOS, StartRow:=1,
DataType:=xlFixedWidth, FieldInfo:= _
Array(Array(0, 1), Array(4, 1), Array(10, 1), Array(16, 1), Array(22,
1), Array(28, 1), _
Array(34, 1), Array(40, 1), Array(46, 1), Array(52, 1), Array(58, 1),
Array(64, 1), Array( _
70, 1), Array(76, 1), Array(82, 1), Array(88, 1), Array(94, 1)),
TrailingMinusNumbers _
:=True
fin = Range("a35000").End(xlUp)
Range("a1").Select
For k = 1 To fin
For n = 2 To 5
Cells(k, 1).Select
Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
Paste:=xlPasteValues
Next
Range(Cells(k + 1, 1), Cells(k + 4, 18)).Delete
Next
End Sub

J'avais désactivé les calculs auto mais il n'y a aucune formule dans ce
fichier donc cela ne doit servir à rien.
Peut être est-ce normal. J'aimerais votre un avis.
Merci
Caroual

10 réponses

1 2 3
Avatar
HD
Effectivement, la suppression d'un grand nombre de cellules les unes après
les autres peut prendre du temps... j'ai déjà eu le "problème"...
Personnellement, j'ai résolu le problème en utilisant "union". Parcours les
cellules, et ne supprime pas celles que tu souhaites voir disparaître mais
mets unis les en une seule plage à détruire tout à la fin de ta macro. Tu y
gagneras beaucoup de temps..

@+
HD
Avatar
LSteph
Bonjour,

(je dois partir, mais tu devrais y arriver avec ces qqs indications)

détail:
For i = 1 to fin
Définis fin en haut du module
Dim fin as long
'....
Plus important:
mets y la ligne pas la valeur
> fin = Range("a35000").End(xlUp)
fin = [a65536].end(xlup).row

Surtout pour aller plus vite:
Supprime les select inutiles
(particulièrement en boucle, c'est désastreux))

> For k = 1 To fin
> For n = 2 To 5

> Cells(k, 1).Select ''''''''cette ligne ne sert à rien

> Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
> Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
> Paste:=xlPasteValues
> Next

Enfin quand tu supprime des lignes faut remonter.

For i=fin to 1 step -1



@+

--
lSteph

Caroual a écrit :
Bonjour,
J'aurais aimé avoir un peu d'aide pour améliorer mon code.
J'ai un fichier texte sur 12000 lignes et 16 colonnes. Dans excel je
voudrais mettre 5 lignes sur une seule ligne et supprimer les lignes qui ont
été recopiées.
J'ai écrit ce code qui marche mais cela me semble anormalement long. (2
minutes d'éxécution)


Sub essai()
Application.ScreenUpdating = False
tata = Application.GetOpenFilename
Workbooks.OpenText Filename:=tata, Origin:=xlMSDOS, StartRow:=1,
DataType:=xlFixedWidth, FieldInfo:= _
Array(Array(0, 1), Array(4, 1), Array(10, 1), Array(16, 1), Array(22,
1), Array(28, 1), _
Array(34, 1), Array(40, 1), Array(46, 1), Array(52, 1), Array(58, 1),
Array(64, 1), Array( _
70, 1), Array(76, 1), Array(82, 1), Array(88, 1), Array(94, 1)),
TrailingMinusNumbers _
:=True
fin = Range("a35000").End(xlUp)
Range("a1").Select
For k = 1 To fin
For n = 2 To 5
Cells(k, 1).Select
Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
Paste:=xlPasteValues
Next
Range(Cells(k + 1, 1), Cells(k + 4, 18)).Delete
Next
End Sub

J'avais désactivé les calculs auto mais il n'y a aucune formule dans ce
fichier donc cela ne doit servir à rien.
Peut être est-ce normal. J'aimerais votre un avis.
Merci
Caroual




Avatar
PAN GOT
Bonjour,
tu peux aussi gelé l'affichage en début de macro
Application.SceenUpdating = False

et le réactivé à la fin
Application.SceenUpdating = True

Sur certaines macro, le résultat est impressionnant.
@+


"LSteph" a écrit dans le message de news:
%
Bonjour,

(je dois partir, mais tu devrais y arriver avec ces qqs indications)

détail:
For i = 1 to fin
Définis fin en haut du module
Dim fin as long
'....
Plus important:
mets y la ligne pas la valeur
> fin = Range("a35000").End(xlUp)
fin = [a65536].end(xlup).row

Surtout pour aller plus vite:
Supprime les select inutiles
(particulièrement en boucle, c'est désastreux))

> For k = 1 To fin
> For n = 2 To 5

> Cells(k, 1).Select ''''''''cette ligne ne sert à rien

> Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
> Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
> Paste:=xlPasteValues
> Next

Enfin quand tu supprime des lignes faut remonter.

For i=fin to 1 step -1



@+

--
lSteph

Caroual a écrit :
Bonjour,
J'aurais aimé avoir un peu d'aide pour améliorer mon code.
J'ai un fichier texte sur 12000 lignes et 16 colonnes. Dans excel je
voudrais mettre 5 lignes sur une seule ligne et supprimer les lignes qui
ont été recopiées.
J'ai écrit ce code qui marche mais cela me semble anormalement long. (2
minutes d'éxécution)


Sub essai()
Application.ScreenUpdating = False
tata = Application.GetOpenFilename
Workbooks.OpenText Filename:=tata, Origin:=xlMSDOS, StartRow:=1,
DataType:=xlFixedWidth, FieldInfo:= _
Array(Array(0, 1), Array(4, 1), Array(10, 1), Array(16, 1), Array(22,
1), Array(28, 1), _
Array(34, 1), Array(40, 1), Array(46, 1), Array(52, 1), Array(58, 1),
Array(64, 1), Array( _
70, 1), Array(76, 1), Array(82, 1), Array(88, 1), Array(94, 1)),
TrailingMinusNumbers _
:=True
fin = Range("a35000").End(xlUp)
Range("a1").Select
For k = 1 To fin
For n = 2 To 5
Cells(k, 1).Select
Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
Paste:=xlPasteValues
Next
Range(Cells(k + 1, 1), Cells(k + 4, 18)).Delete
Next
End Sub

J'avais désactivé les calculs auto mais il n'y a aucune formule dans ce
fichier donc cela ne doit servir à rien.
Peut être est-ce normal. J'aimerais votre un avis.
Merci
Caroual




Avatar
Caroual
"LSteph" a écrit dans le message de news:
%
Bonjour,

(je dois partir, mais tu devrais y arriver avec ces qqs indications)

détail:
For i = 1 to fin
Définis fin en haut du module
Dim fin as long
'....
Plus important:
mets y la ligne pas la valeur
> fin = Range("a35000").End(xlUp)
fin = [a65536].end(xlup).row




Si je mets ta ligne, fin = 12000 et j'exécute sur 12000 lignes alors qu'en
les supprimant au fur et à mesure elle ne doit s'exécuter que 2400 fois ce
qui convient



Surtout pour aller plus vite:
Supprime les select inutiles
(particulièrement en boucle, c'est désastreux))



C'est pour cela que j'essayais de coller sans select mais je n'y arrive pas


> For k = 1 To fin
> For n = 2 To 5

> Cells(k, 1).Select ''''''''cette ligne ne sert à rien


Cette ligne permet de se replacer car lorsque je colle il semble que je sois
obligée de sélectionner l'endroit où je colle, donc cette ligne me
permettait de revenir pour continuer la boucle


> Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
> Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
> Paste:=xlPasteValues
> Next

Enfin quand tu supprime des lignes faut remonter.

For i=fin to 1 step -1



@+

--
lSteph





Merci de ton aide je vais déjà déclarer ma variable qu'effectivement je
zappe souvent.
Si tu peux m'indiquer comment coller sans se déplacer cela m'intéresse.
Caroual

Caroual a écrit :
Bonjour,
J'aurais aimé avoir un peu d'aide pour améliorer mon code.
J'ai un fichier texte sur 12000 lignes et 16 colonnes. Dans excel je
voudrais mettre 5 lignes sur une seule ligne et supprimer les lignes qui
ont été recopiées.
J'ai écrit ce code qui marche mais cela me semble anormalement long. (2
minutes d'éxécution)


Sub essai()
Application.ScreenUpdating = False
tata = Application.GetOpenFilename
Workbooks.OpenText Filename:=tata, Origin:=xlMSDOS, StartRow:=1,
DataType:=xlFixedWidth, FieldInfo:= _
Array(Array(0, 1), Array(4, 1), Array(10, 1), Array(16, 1), Array(22,
1), Array(28, 1), _
Array(34, 1), Array(40, 1), Array(46, 1), Array(52, 1), Array(58, 1),
Array(64, 1), Array( _
70, 1), Array(76, 1), Array(82, 1), Array(88, 1), Array(94, 1)),
TrailingMinusNumbers _
:=True
fin = Range("a35000").End(xlUp)
Range("a1").Select
For k = 1 To fin
For n = 2 To 5
Cells(k, 1).Select
Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
Paste:=xlPasteValues
Next
Range(Cells(k + 1, 1), Cells(k + 4, 18)).Delete
Next
End Sub

J'avais désactivé les calculs auto mais il n'y a aucune formule dans ce
fichier donc cela ne doit servir à rien.
Peut être est-ce normal. J'aimerais votre un avis.
Merci
Caroual




Avatar
Caroual
Si je dis v1=mes 16 premiéres valeurs puis v2 les 16 suivantes etc ...
comment je fais pour les poser toutes sur une même ligne
J'ai essayé : Range("a1")=union(v1,v2,v3,v4,v5) mais cela ne marche pas.
Je dois oublier quelque chose

Merci
Caroual


"HD" a écrit dans le message de news:
gt8v4j$2bhd$
Effectivement, la suppression d'un grand nombre de cellules les unes après
les autres peut prendre du temps... j'ai déjà eu le "problème"...
Personnellement, j'ai résolu le problème en utilisant "union". Parcours
les cellules, et ne supprime pas celles que tu souhaites voir disparaître
mais mets unis les en une seule plage à détruire tout à la fin de ta
macro. Tu y gagneras beaucoup de temps..

@+
HD



Avatar
Caroual
Je suis d'accord avec toi mais je l'avais déjà fait .
Je cherche toujours...
Caroual

"PAN GOT" a écrit dans le message de news:
%
Bonjour,
tu peux aussi gelé l'affichage en début de macro
Application.SceenUpdating = False

et le réactivé à la fin
Application.SceenUpdating = True

Sur certaines macro, le résultat est impressionnant.
@+


"LSteph" a écrit dans le message de news:
%
Bonjour,

(je dois partir, mais tu devrais y arriver avec ces qqs indications)

détail:
For i = 1 to fin
Définis fin en haut du module
Dim fin as long
'....
Plus important:
mets y la ligne pas la valeur
> fin = Range("a35000").End(xlUp)
fin = [a65536].end(xlup).row

Surtout pour aller plus vite:
Supprime les select inutiles
(particulièrement en boucle, c'est désastreux))

> For k = 1 To fin
> For n = 2 To 5

> Cells(k, 1).Select ''''''''cette ligne ne sert à rien

> Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
> Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
> Paste:=xlPasteValues
> Next

Enfin quand tu supprime des lignes faut remonter.

For i=fin to 1 step -1



@+

--
lSteph

Caroual a écrit :
Bonjour,
J'aurais aimé avoir un peu d'aide pour améliorer mon code.
J'ai un fichier texte sur 12000 lignes et 16 colonnes. Dans excel je
voudrais mettre 5 lignes sur une seule ligne et supprimer les lignes qui
ont été recopiées.
J'ai écrit ce code qui marche mais cela me semble anormalement long. (2
minutes d'éxécution)


Sub essai()
Application.ScreenUpdating = False
tata = Application.GetOpenFilename
Workbooks.OpenText Filename:=tata, Origin:=xlMSDOS, StartRow:=1,
DataType:=xlFixedWidth, FieldInfo:= _
Array(Array(0, 1), Array(4, 1), Array(10, 1), Array(16, 1),
Array(22, 1), Array(28, 1), _
Array(34, 1), Array(40, 1), Array(46, 1), Array(52, 1), Array(58,
1), Array(64, 1), Array( _
70, 1), Array(76, 1), Array(82, 1), Array(88, 1), Array(94, 1)),
TrailingMinusNumbers _
:=True
fin = Range("a35000").End(xlUp)
Range("a1").Select
For k = 1 To fin
For n = 2 To 5
Cells(k, 1).Select
Range(Cells(n + k - 1, 2), Cells(n + k - 1, 16)).Copy
Cells(k, 200).End(xlToLeft).Offset(, 1).PasteSpecial
Paste:=xlPasteValues
Next
Range(Cells(k + 1, 1), Cells(k + 4, 18)).Delete
Next
End Sub

J'avais désactivé les calculs auto mais il n'y a aucune formule dans ce
fichier donc cela ne doit servir à rien.
Peut être est-ce normal. J'aimerais votre un avis.
Merci
Caroual








Avatar
LSteph
Bonsoir,

Si je mets ta ligne, fin = 12000 et j'exécute sur 12000 lignes alors qu'en





Pas du tout regarde l'exemple de MichDenis
Fin = Source.Range("A65000").End(xlUp).Row



Sauf si tuaqs mis 2400 dans la cellule Fin et que tusavais d'avance que
tuu n'aurais que 2400 lignes.
Dans ce cas l'instruction n'aurait plus de sens...

... le reste est à l'avenant,

Suppression des Select inutiles
ça ce n'est plus à démontrer!

hors mis la façon de traiter la suppression,
j'en reviens que si tu dois le faire en boucle
remonter est plus sûr!

Cordialement.

--
lSteph
Avatar
Philippe.R
Bonsoir Caroual,
Sommes nous bien d'accord (excuses moi si j'ai un doute) sur le fait que
l'expression :

fin = Range("a35000").End(xlUp)

sert à trouver la dernière cellule non vide de la colonne A ?

Cette expression renverra telle quelle la valeur de cette cellule, alors
qu'assortie d'un ".row", elle renverra le numéro de la ligne.
--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/mpfe/connexion.php
News://news.microsoft.com/microsoft.public.fr.excel
"Caroual" a écrit dans le message de
news:49f890b6$0$17099$

"LSteph" a écrit dans le message de news:
%
Bonjour,




[...]
mets y la ligne pas la valeur
> fin = Range("a35000").End(xlUp)
fin = [a65536].end(xlup).row




[...]
Si je mets ta ligne, fin = 12000 et j'exécute sur 12000 lignes alors
qu'en les supprimant au fur et à mesure elle ne doit s'exécuter que 2400
fois ce qui convient




[...]
@+

--
lSteph





Avatar
Caroual
Désolée je me suis mal expliqée, mais je pensais cela accessoire..
En fait j'ai des infos avec des pas horaires, ces infos sont indiquées dans
un fichier txt sur 5 lignes pour le même pas, donc je dois faire non autant
de traitement que de lignes mais autant de traitement que de lignes divisée
par 5. Donc en récupérant la valeur de la dernière cellule je récupère le
nombre de traitements de ces 5 lignes à recopier sur une seule ligne.
Bon là si quelqu'un m'a comprise .....
J'ai récupéré ce code sur le net :
Cela me permet de ne pas sélectionner avant de coller, je pensais gagner du
temps : c'est toujours aussi long
Peut être ne faudrait-il pas delete mais un tri en fin de macro, je vais
essayer

fin = Range("a65000").End(xlUp)
For n = 1 To fin
ActiveWorkbook.Worksheets("titi").Range(Cells(n + 1, 2), Cells(n + 1,
17)).Cut _
Destination:¬tiveWorkbook.Worksheets("titi").Range(Cells(n, 18),
Cells(n, 33))
ActiveWorkbook.Worksheets("titi").Range(Cells(n + 2, 2), Cells(n + 2,
16)).Cut _
Destination:¬tiveWorkbook.Worksheets("titi").Range(Cells(n, 33),
Cells(n, 48))
ActiveWorkbook.Worksheets("titi").Range(Cells(n + 3, 2), Cells(n + 3,
16)).Cut _
Destination:¬tiveWorkbook.Worksheets("titi").Range(Cells(n, 48),
Cells(n, 63))
ActiveWorkbook.Worksheets("titi").Range(Cells(n + 4, 2), Cells(n + 4,
11)).Cut _
Destination:¬tiveWorkbook.Worksheets("titi").Range(Cells(n, 63),
Cells(n, 74))
ActiveCell.Range("a2:q5").Delete
ActiveCell.Offset(1).Select

Caroual

"Philippe.R" <AS_rauphil_chez_wanadoo.fr> a écrit dans le message de news:

Bonsoir Caroual,
Sommes nous bien d'accord (excuses moi si j'ai un doute) sur le fait que
l'expression :

fin = Range("a35000").End(xlUp)

sert à trouver la dernière cellule non vide de la colonne A ?

Cette expression renverra telle quelle la valeur de cette cellule, alors
qu'assortie d'un ".row", elle renverra le numéro de la ligne.
--
Avec plaisir
http://dj.joss.free.fr/trombine.htm
http://jacxl.free.fr/mpfe/trombino.html
Philippe.R
Pour se connecter au forum :
http://www.excelabo.net/mpfe/connexion.php
News://news.microsoft.com/microsoft.public.fr.excel
"Caroual" a écrit dans le message de
news:49f890b6$0$17099$

"LSteph" a écrit dans le message de news:
%
Bonjour,




[...]
mets y la ligne pas la valeur
> fin = Range("a35000").End(xlUp)
fin = [a65536].end(xlup).row




[...]
Si je mets ta ligne, fin = 12000 et j'exécute sur 12000 lignes alors
qu'en les supprimant au fur et à mesure elle ne doit s'exécuter que 2400
fois ce qui convient




[...]
@+

--
lSteph








Avatar
Caroual
Pour info :
Je pense que je gère bien mon nombre de lignes :
Je récupère un fichier txt qui note des infos correspondant à un pas horaire
sur 5 lignes. donc dans ma première colonne j'ai mes pas horaires répétés 5
fois. Si je cherche la dernière ligne pour savoir combien de fois je vais
faire le traitement, je vais répéter l'action trop de fois puisque je
supprime 4 lignes sur 5. Par contre si je ne supprime pas les lignes
effectivement il vaut mieux que je travaille sur le numéro de la dernière
ligne.
Je ne sais jamais combien je vais avoir de lignes, par contre je sais
toujours que mes numéros de lignes sont répétés 5 fois.
Pour 3 pas horaires j'aurais 15 lignes mais seulement 3 traitements.
Si je récupère le numéro de la dernière ligne je vais faire 15 traitements.
Caroual





"LSteph" a écrit dans le message de news:
e9Xt$
Bonsoir,

Si je mets ta ligne, fin = 12000 et j'exécute sur 12000 lignes alors
qu'en





Pas du tout regarde l'exemple de MichDenis
Fin = Source.Range("A65000").End(xlUp).Row



Sauf si tuaqs mis 2400 dans la cellule Fin et que tusavais d'avance que
tuu n'aurais que 2400 lignes.
Dans ce cas l'instruction n'aurait plus de sens...

... le reste est à l'avenant,

Suppression des Select inutiles
ça ce n'est plus à démontrer!

hors mis la façon de traiter la suppression,
j'en reviens que si tu dois le faire en boucle
remonter est plus sûr!

Cordialement.

--
lSteph


1 2 3