Copier coller rapidement des formules par VBA

pingouinal

XLDnaute Occasionnel
Bonjour,

J'ai un souci de rapidité sur une macro qui fait un simple copier coller d'une dizaine de lignes.
Le problème est que ces lignes comportent un peu de format (couleurs) mais surtout énormément de formules avec notamment des liens vers d'autres classeurs. Je ne peux malheureusement pas mettre l'exemple concret en ligne, il est très gros et confidentiel.

Par contre voici mon code :

Code:
Sub Create_BC()
Dim PSSD, Promo, NoPromo As Worksheet, Rec As Worksheet
Dim l, config As String

Set PSSD = Sheets("PSSD")
Set Promo = Sheets("Promo")
Set NoPromo = Sheets("No Promo")

l = 3
Do While PSSD.Cells(l, 1).Value <> ""
    Promo.Rows("8:19").Copy
    config = 8 + 12 * (PSSD.Cells(l, 1).Value - 1)
    Promo.Cells(config, 1).Select
    ActiveSheet.Paste

l = l + 1
Loop

End Sub

Ma question est donc la suivante : est-il possible de faire en sorte qu'un copier-coller de formules se fasse plus rapidement? Actuellement il prend une dizaine de secondes, et comme l'opération peut avoir à se répéter plusieurs centaines de fois, ça peut vite être long.
Je précise que l'option Calcul est en manuel et ne se fait donc pas à chaque collage.

D'avance merci pour ceux qui pourront m'aider et désolé de ne pas joindre d'exemple concret en pièce jointe. Si jamais vous avez besoin d'infos que j'aurais oublié de donner, n'hésitez pas à demander.
 

kjin

XLDnaute Barbatruc
Re : Copier coller rapidement des formules par VBA

Bonjour,
1 - ta macro me parait pour le moins...étonnante
2 - pourquoi copier toute les lignes
3 - si l'on demande un fichier, ce n'est pas pour t'ennuyer et dans ton cas ça s'avère indispensable;d'autant qu'ici, 2 feuilles suffisent contenant qq données bidons
A+
kjin
 

PMO2

XLDnaute Accro
Re : Copier coller rapidement des formules par VBA

Bonjour,

A tout hasard (et sans garantie) essayez le code suivant

Code:
Sub Create_BC()
Dim PSSD  As Worksheet, Promo  As Worksheet, NoPromo As Worksheet, Rec As Worksheet
Dim l As Long, config As String
Dim var
Dim R As Range
Set PSSD = Sheets("PSSD")
Set Promo = Sheets("Promo")
Set NoPromo = Sheets("No Promo")
var = PSSD.Range("a1:a" & PSSD.[a3].End(xlDown).Row & "")
Set R = Promo.Rows("8:19")
R.Copy
For l = 3 To UBound(var, 1)
  config = 8 + (12 * (var(l, 1) - 1))
  Promo.Cells(config, 1).Select
  ActiveSheet.Paste
Next l
End Sub

Si cela n'a pas planté vérifiez bien pour voir si vous avez le résultat escompté.

Cordialement.

PMO
Patrick Morange
 

pingouinal

XLDnaute Occasionnel
Re : Copier coller rapidement des formules par VBA

Bonjour kjin et PMO2,

Tout d'abord merci pour vos réponses.
En esssayant de préparer un fichier "light" pour kjin, je me suis rendu compte que si les classeurs nommés dans les liens sont ouverts, l'opération se fait en moins de 2 secondes au lieu des 10 que j'avais.
Je vais donc essayer en demandant à ma macro d'ouvrir les fichiers sources.

PMO2, je vais quand même essayer cette modification, ça rendra peut-être l'opération encore plus rapide.

Merci encore pour votre temps.
 

ROGER2327

XLDnaute Barbatruc
Re : Copier coller rapidement des formules par VBA

Bonsoir à tous
Je suis moi aussi un peu étonné par la procédure. Je verrais bien quelque chose de ce genre :
Code:
[COLOR="DarkSlateGray"][B]Sub Create_BC()
Dim PSSD As Worksheet, Promo As Worksheet
Dim l&

Set PSSD = Sheets("PSSD")
Set Promo = Sheets("Promo")

With Application: .ScreenUpdating = 0: .Calculation = -4135: .EnableEvents = 0: End With

l = 3
Do While PSSD.Cells(l, 1).Value <> ""
  Promo.Rows("8:19").Copy Destination:=Promo.Cells(-4 + 12 * PSSD.Cells(l, 1).Value, 1)
  l = l + 1
Loop

With Application: .EnableEvents = 1: .Calculation = -4105: .ScreenUpdating = 1: End With

End Sub[/B][/COLOR]
ROGER2327
#4351


Dimanche 15 Haha 138 (Nativité de l' Œstre, artificier, ST)
29 Vendémiaire An CCXIX
2010-W42-3T17:24:28Z
 

pingouinal

XLDnaute Occasionnel
Re : Copier coller rapidement des formules par VBA

Bonsoir ROGER2327,

Merci pour ton commentaire.
Comme je l'ai dit plus haut, en ouvrant les classeurs dans lesquels j'ai des liens, je gagne déjà beaucoup en rapidité.
Par contre ton code est intéressant car je ne connaissais pas la ligne :
Code:
With Application: .ScreenUpdating = 0: .Calculation = -4135: .EnableEvents = 0: End With

Je ne connais pas non plus le "Dim l&" et je ne le comprends pas. Pourrais-tu me l'expliquer?

D'avance merci.
 

Discussions similaires

Réponses
2
Affichages
475