boucle trop longue.....

  • Initiateur de la discussion p@nda
  • Date de début
P

p@nda

Guest
salut a ts j4ai sa qui fontionne mais lorsque je lui met une boucle trop longue sa marche plus que faut il faire pour sa fonctionne ....

Pour ceux que sa interesserais cette macro fais un copier coller ...
le i c le nombre de ligne a coller a partir de la colonne K...
N et le nombre de fois que l on fais le copier coler .....

Dim i As Byte, N As Byte, L As Integer
L = Range("k65536").End(xlUp).Row
If L = 1 Then L = 0
For i = 1 To 9
Range("O" & i & ":q" & i).Copy ' nombre de collone par ligne a coller...
For N = 1 To 1073 'cette variable peut etre tres longue.....
With ActiveSheet
L = L + 1
.Paste Destination:=Range("K" & L)
End With
Next N
Next i
Application.CutCopyMode = False
End Sub


Par avance MERCI.....
 
S

Sylvain123

Guest
Bonjour,

Quand on a un problème de rapidité, il faut souvent essayer de réduire ce que l'on doit faire.

As tu réellement besoin de copier les données et les formats, fond et bordure ?

Et très souvent, au début, on fait une boucle pour traiter les cellules une par une, ce qui est très long. (Excel recherche la cellule, puis la valeur, puis tu fais le traitement, puis excel recherche la cellule cible, et place la valeur pour chaque cellule)

Par contre si tu traite une plage de cellules, c'est beaucoup plus rapide.
(Excel recherche la plage de cellule source, tu fais le traitement, puis excel place les valeur dans la plage de cellule cible et c'est fini)


Si tu as juste la valeur à copier, tu peux essayer un truc du genre :

Dim i As Byte, N As Byte, L As Integer
L = Range("k65536").End(xlUp).Row
If L = 1 Then L = 0
ActiveSheet.Range("K" & L+1:"M" & L+1+1073).Value=Range("O" & 9 & ":Q" & 9).Value
Application.CutCopyMode = False
End Sub

Par contre, j'ai pas compris le pourquoi de ta boucle :
For i = 1 To 9 ???

Car cette boucle sert apparement pour copier 9 zones sources les une après les autres.
Mais elle sont toute copier dans la même zone finale !
Donc seul la denière copie pour i=9 est apparement utile.

Par contre, je ne vois pas trop à quoi celà peut te servir de recopier autant de fois ces données...
Regarde si il n'y aurait pas une autre solution pour arriver à ton but sans autant de recopie...

@+
 
S

Sylvain123

Guest
Rebonjour,

Oui, N en integer !!!

Ma 1er solution, c'était pour réduire le temps d'execution de la boucle.

Byte = Nombre entier entre 0 et 255
Integer = nombre entier entre -32 768 et 32 767

Plus d'info sur les types de données :
Dans l'aide de VBA, rechercher Integer
Puis clic sur Voir aussi... et choisir Résumer des type de données.

@+
 
P

p@nda

Guest
Si a tous pour vos reponses....

la solution c bien pascal 76 "N en Byte mais en integer"

sylvain il colle pas les un sur les autres mais a la suite .... merci pour tes remarques vais y jeter un coup de yeux .... ( les deux ....)
 
R

Roland

Guest
Bonjour à tous


Un bon conseil pour réduire le temps d' exécution

Application.ScreenUpdating = False

en début de code évite la mise à jour inutile de l'écran pendant l'exécution

et
Application.ScreenUpdating = True

en fin de code pour faire plaisir au puriste, car la sortie de sub le réinitialise automatiquement

Amicalement Roland
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 370
Messages
2 087 693
Membres
103 641
dernier inscrit
anouarkecita2