Amelioration d'une macro EXCEL
Résolu/Fermé
mantaTM
Messages postés
20
Date d'inscription
mercredi 15 juillet 2009
Statut
Membre
Dernière intervention
27 juillet 2012
-
23 juil. 2009 à 22:03
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 24 juil. 2009 à 19:32
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 24 juil. 2009 à 19:32
A voir également:
- Amelioration d'une macro EXCEL
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Liste déroulante excel - Guide
- Déplacer une colonne excel - Guide
- Calculer une moyenne sur excel - Guide
- Si et excel - Guide
11 réponses
gbinforme
Messages postés
14946
Date d'inscription
lundi 18 octobre 2004
Statut
Contributeur
Dernière intervention
24 juin 2020
4 711
23 juil. 2009 à 22:58
23 juil. 2009 à 22:58
bonjour
Tu peux remplacer :
par 2 car de toute façon si tu copies plus de 2 colonnes elles sont écrasées ensuite mais tu ne vas pas mettre le turbo sauf si tes onglets sont mal saisis.
Tu peux remplacer :
.Cells.SpecialCells(xlCellTypeLastCell).Column
par 2 car de toute façon si tu copies plus de 2 colonnes elles sont écrasées ensuite mais tu ne vas pas mettre le turbo sauf si tes onglets sont mal saisis.
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 247
24 juil. 2009 à 16:32
24 juil. 2009 à 16:32
Sous cette forme, dans un module, ça marche :
Mais en relisant ton post initial je trouve que 25s est vraiment énorme pour copier des données même s'il y en a beaucoup.
Il n'y a vraiment pas des formules qui seraient recalculées suite au copy ?
Et ton fichier est bien sur le disque dur et pas sur un disque réseau ?
eric
Sub Actualisation() With Sheets("Feuil1") Dim ligs As Long, cols As Long ligs = .Cells.SpecialCells(xlCellTypeLastCell).Row cols = .Cells.SpecialCells(xlCellTypeLastCell).Column 'ou cols=2 'avec l'amélioration de gb ActiveSheet.Cells(3, 1).Resize(ligs, cols).Value = .Cells(1, 1).Resize(ligs, cols).Value End With End SubReste à voir si le gain est conséquent...
Mais en relisant ton post initial je trouve que 25s est vraiment énorme pour copier des données même s'il y en a beaucoup.
Il n'y a vraiment pas des formules qui seraient recalculées suite au copy ?
Et ton fichier est bien sur le disque dur et pas sur un disque réseau ?
eric
mantaTM
Messages postés
20
Date d'inscription
mercredi 15 juillet 2009
Statut
Membre
Dernière intervention
27 juillet 2012
3
23 juil. 2009 à 23:21
23 juil. 2009 à 23:21
Merci pour le coup de main, on a gagné 5 secondes...
Y'aurait-il un moyen de simplifier l'operation, en sachant que l'onglet General avec la vue d'ensemble est le premier, et que je n'ai que 8 onglets ensuites, dans l'ordre ci dessus et avec les noms indiqués ci dessus (et ils sont bien saisis)?
Y'aurait-il un moyen de simplifier l'operation, en sachant que l'onglet General avec la vue d'ensemble est le premier, et que je n'ai que 8 onglets ensuites, dans l'ordre ci dessus et avec les noms indiqués ci dessus (et ils sont bien saisis)?
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 247
23 juil. 2009 à 23:23
23 juil. 2009 à 23:23
Bonsoir,
Si les plages que tu copies ont beaucoup de formules (et les sommeprod() sont très gourmands) il faudrait peut-être voir à améliorer celles-ci si c'est possible.
Par exemple un morceau de formule utilisé de nombreuses fois peut être mis dans un nom, ainsi il n'est évalué qu'une fois.
Ou bien utiliser un calcul intermédiaire dans une colonne masquée si il peut être repris dans plusieurs colonnes.
eric
Si les plages que tu copies ont beaucoup de formules (et les sommeprod() sont très gourmands) il faudrait peut-être voir à améliorer celles-ci si c'est possible.
Par exemple un morceau de formule utilisé de nombreuses fois peut être mis dans un nom, ainsi il n'est évalué qu'une fois.
Ou bien utiliser un calcul intermédiaire dans une colonne masquée si il peut être repris dans plusieurs colonnes.
eric
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mantaTM
Messages postés
20
Date d'inscription
mercredi 15 juillet 2009
Statut
Membre
Dernière intervention
27 juillet 2012
3
23 juil. 2009 à 23:32
23 juil. 2009 à 23:32
Il ne s'agit pas de calculs, mais d'une base de donnees... des references et des designations en fait...
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 247
24 juil. 2009 à 07:31
24 juil. 2009 à 07:31
Re,
Tu as une autre technique de copie qui serait plus rapide que .copy :
[A1:A10].Value = Worksheets("Feuil1").[A1:A10].Value
eric
Tu as une autre technique de copie qui serait plus rapide que .copy :
[A1:A10].Value = Worksheets("Feuil1").[A1:A10].Value
eric
mantaTM
Messages postés
20
Date d'inscription
mercredi 15 juillet 2009
Statut
Membre
Dernière intervention
27 juillet 2012
3
24 juil. 2009 à 14:52
24 juil. 2009 à 14:52
Bonjour,
Eriic, j'ai essayé ta formule, mais ça ne marche pas...
Eriic, j'ai essayé ta formule, mais ça ne marche pas...
michel_m
Messages postés
16603
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
16 décembre 2023
3 310
24 juil. 2009 à 15:30
24 juil. 2009 à 15:30
Bonjour tout le monde,
en me basant sur le principe d'Eric
suite d'appel de macros param^mtrées en n'utilisant pas resize ( dans ma p'tite t^te manipulation de cellule=lenteur, mais c'est pas gagné!) j'ai considéré qu'il y avait que 2 lignes dans la source par felmme, je n'ai pas déclaré les variables
curieux de voir ce que ca donne
en me basant sur le principe d'Eric
suite d'appel de macros param^mtrées en n'utilisant pas resize ( dans ma p'tite t^te manipulation de cellule=lenteur, mais c'est pas gagné!) j'ai considéré qu'il y avait que 2 lignes dans la source par felmme, je n'ai pas déclaré les variables
Sub recopie_interne(wsh, lig_dep, col_dep) With Sheets(wsh) col = .Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious).Column .Range(.Cells(lig_dep, col_dep), .Cells(lig_dep + 1, col_dep + col - 1)).Value = .Range(.Cells(1, 1), .Cells(2, col)).Value End With End Sub Sub test() recopie_interne "Feuil1", 3, 13 End Sub
curieux de voir ce que ca donne
mantaTM
Messages postés
20
Date d'inscription
mercredi 15 juillet 2009
Statut
Membre
Dernière intervention
27 juillet 2012
3
24 juil. 2009 à 15:51
24 juil. 2009 à 15:51
Bonjour Michel_m
Cela ne marche pas non plus, runtime error 9, subscript out of range.
Cela ne marche pas non plus, runtime error 9, subscript out of range.
mantaTM
Messages postés
20
Date d'inscription
mercredi 15 juillet 2009
Statut
Membre
Dernière intervention
27 juillet 2012
3
24 juil. 2009 à 19:10
24 juil. 2009 à 19:10
C'est bon eriic, celle ci marche tres bien, merci beaucoup !!!
De plus cela m'a permis de voir ou etait le probleme dans ma macro precedente... Le Cells.Clear du debut devait prendre enormement de temps, plus que la copie en elle meme...
Ceci etant dis, j'ai quan meme besoin de vider le contenu de certaines cellules, pour qu l'actualisation de la base de donnees se fasse proprement...
je n'arrive pas a faire effacer les cellules d'un champ seulement...
J'ai tenté
Range[A5;Z10000].Clear
mais raté, ça plante... une idée quelqu'un?? Merci d'avance!
edit : le fichier est bien sur le disque dur. Il n'y a pas de formules. J'ai 9 onglets, dont 8 sont copiés vers le premier. tous ont deux colonnes seulement, le plus petit a une 50aine de ligne, le plus grand presque 3000.
J'ai de plus une autre macro de recherche, une sorte de ctrl+F, mais qui n'est pas active lors de la macro copie.
edit again : c'est bon trouvé : Range("A5:Z10000").ClearContents
Merci a tous
De plus cela m'a permis de voir ou etait le probleme dans ma macro precedente... Le Cells.Clear du debut devait prendre enormement de temps, plus que la copie en elle meme...
Ceci etant dis, j'ai quan meme besoin de vider le contenu de certaines cellules, pour qu l'actualisation de la base de donnees se fasse proprement...
je n'arrive pas a faire effacer les cellules d'un champ seulement...
J'ai tenté
Range[A5;Z10000].Clear
mais raté, ça plante... une idée quelqu'un?? Merci d'avance!
edit : le fichier est bien sur le disque dur. Il n'y a pas de formules. J'ai 9 onglets, dont 8 sont copiés vers le premier. tous ont deux colonnes seulement, le plus petit a une 50aine de ligne, le plus grand presque 3000.
J'ai de plus une autre macro de recherche, une sorte de ctrl+F, mais qui n'est pas active lors de la macro copie.
edit again : c'est bon trouvé : Range("A5:Z10000").ClearContents
Merci a tous
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 247
24 juil. 2009 à 19:32
24 juil. 2009 à 19:32
.clear ???
.clearcontents plutôt
et tant qu'à faire avec une , et non un ;
Et si tu utilises la notation abrégée de range c'est à dire avec des [ ], range n'a rien à faire là
Donc soit:
range("A5:Z10000").clearcontents
ou:
[A5:Z10000].clearcontents
.clearcontents plutôt
et tant qu'à faire avec une , et non un ;
Et si tu utilises la notation abrégée de range c'est à dire avec des [ ], range n'a rien à faire là
Donc soit:
range("A5:Z10000").clearcontents
ou:
[A5:Z10000].clearcontents