Cette @#&...@@ de macro efface toutes les colonnes du premier onglet,
au lieu de n'effacer que certaines colonnes de tous les onglets (sauf
Récap.)
Sub ménage()
Dim Sh As Worksheet
'Application.ScreenUpdating = False
For Each Sh In ThisWorkbook.Sheets
If Sh.Name <> "Récap" Then
'Insère une colonne avant A
Columns("A:A").Insert Shift:=xlToRight
'Numérote les lignes pour le tri
Range("A1").FormulaR1C1 = "1"
Range("A2").FormulaR1C1 = "2"
Range("A1:A2").AutoFill Destination:=Range("A1:A1000"),
Type:=xlFillDefault
'Trie sur colonnes C et A
Rows("1:1000").Sort Key1:=Range("C1"), Order1:=xlAscending,
Key2:=Range("A1") _
, Order2:=xlAscending, Header:=xlGuess,
OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
'Supprime les colonnes A et B
Columns("A:B").Delete Shift:=xlToLeft
'Supprime les colonnes G à M
Columns("G:M").Delete Shift:=xlToLeft
'Ajuste la largeur des colonnes
Cells.EntireColumn.AutoFit
'Range("A1").CurrentRegion.Select
'Selection.Copy
End If
'*********DEVRAIT PASSER A L'ONGLET SUIVANT, MAIS NON
Next Sh
' ;-( ;-(
'Application.ScreenUpdating = True
End Sub
Avec mes remerciements zanticipés zé chaleureux.
--
Bien amicordialement,
P. Bastard
Merci pour toutes ces précisions. C'est grâce à ce type de réponses qu'on peut progresser "à petits pas maîtrisés".
-- Bien amicordialement, P. Bastard
Enfin pour finir, prends garde aux incohérences potentielles de tes déclarations de variables par rapport à la réalité de ton classeur. En effet , autant il est de bon usage de déclarer ses variables autant on peut se trouver dans des situations inconfortables. Dans ton code, tu écris Dim sh as worksheet puis tu parcours la collection sheets de thisworkbook, or si tu as p.e une feuille graphique (qui fait partie de la collection sheets mais n'est pas une worksheet) , ton code va se planter car sh n'est pas un objet Chart . Si tu es certain de ne pas avoir d'autres objets que des worksheets tu peux écrire sans inquiétude ce que tu as écrit. Dans le cas contraire, une déclaration de variable de type Object sera + adaptée. Ceci dit, ca ne te dispenserait pas de faire une gestion d'erreur étant entendu que tu ne peux pas faire un certain nombre d'actions permises sur une feuille de type worksheet mais pas sur une feuille de type Chart.
Bonjour, *anonymousA* J'ai lu ton post 42a4a151$0$25050$ avec le plus grand intéret :
Pourtant, actuellement, ça mAAArche. Je vais tester de ce pas le sh.activate de Modeste.
P.S : j'aime pô les surprises douloureuses.
Bien amicordialement, Schtroumpf GrincheuxEtDouillet
eh oui!. Utiliser la mot clé with sh -end with la rendrait d'ailleurs à la fois encore plus lisible et plus rapide. me semble d'ailleurs qu'il manque encore un sh. devant Rows("1:1000") ainsi que devant Range("C1") et Range("A1") car tous les range quelqu'ils soient doivent être référencés à la feuille en cours de la collection, sinon tu risques à terme d'avoir des surprises douloureuses. Cordialement,
Bonjour, *anonymousA* J'ai lu ton post 42a489c5$0$25050$ avec le plus grand intéret :
Sub ménage2() Dim Sh As Worksheet 'Application.ScreenUpdating = False For Each Sh In ThisWorkbook.Sheets If Sh.Name <> "Récap" Then Sh.Columns("A:A").Insert Shift:=xlToRight Sh.Range("A1").FormulaR1C1 = "1" Sh.Range("A2").FormulaR1C1 = "2" Sh.Range("A1:A2").AutoFill Destination:=Sh.Range("A1:A1000"), Type:=xlFillDefault Rows("1:1000").Sort Key1:=Range("C1"), Order1:=xlAscending, Key2:=Range("A1") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _ :=xlSortNormal Sh.Columns("A:B").Delete Shift:=xlToLeft Sh.Columns("G:M").Delete Shift:=xlToLeft Sh.Cells.EntireColumn.AutoFit 'Range("A1").CurrentRegion.Select 'Selection.Copy End If Next Sh 'Application.ScreenUpdating = True End Sub
Comme ça, ça marche.
Merci, beaucoup...
Re, *anonymousA*
Merci pour toutes ces précisions.
C'est grâce à ce type de réponses qu'on peut progresser "à petits pas
maîtrisés".
--
Bien amicordialement,
P. Bastard
Enfin pour finir, prends garde aux incohérences potentielles de tes
déclarations de variables par rapport à la réalité de ton classeur. En
effet , autant il est de bon usage de déclarer ses variables autant on
peut se trouver dans des situations inconfortables.
Dans ton code, tu écris Dim sh as worksheet puis tu parcours la
collection sheets de thisworkbook, or si tu as p.e une feuille
graphique (qui fait partie de la collection sheets mais n'est pas une
worksheet) , ton code va se planter car sh n'est pas un objet Chart .
Si tu es certain de ne pas avoir d'autres objets que des worksheets tu
peux écrire sans inquiétude ce que tu as écrit. Dans le cas contraire,
une déclaration de variable de type Object sera + adaptée. Ceci dit,
ca ne te dispenserait pas de faire une gestion d'erreur étant entendu
que tu ne peux pas faire un certain nombre d'actions permises sur une
feuille de type worksheet mais pas sur une feuille de type Chart.
Bonjour, *anonymousA*
J'ai lu ton post 42a4a151$0$25050$8fcfb975@news.wanadoo.fr
avec le plus grand intéret :
Pourtant, actuellement, ça mAAArche.
Je vais tester de ce pas le sh.activate de Modeste.
P.S : j'aime pô les surprises douloureuses.
Bien amicordialement,
Schtroumpf GrincheuxEtDouillet
eh oui!. Utiliser la mot clé with sh -end with la rendrait
d'ailleurs à la fois encore plus lisible et plus rapide.
me semble d'ailleurs qu'il manque encore un sh. devant
Rows("1:1000") ainsi que devant Range("C1") et Range("A1") car tous
les range quelqu'ils soient doivent être référencés à la feuille en
cours de la collection, sinon tu risques à terme d'avoir des
surprises douloureuses.
Cordialement,
Bonjour, *anonymousA*
J'ai lu ton post 42a489c5$0$25050$8fcfb975@news.wanadoo.fr
avec le plus grand intéret :
Sub ménage2()
Dim Sh As Worksheet
'Application.ScreenUpdating = False
For Each Sh In ThisWorkbook.Sheets
If Sh.Name <> "Récap" Then
Sh.Columns("A:A").Insert Shift:=xlToRight
Sh.Range("A1").FormulaR1C1 = "1"
Sh.Range("A2").FormulaR1C1 = "2"
Sh.Range("A1:A2").AutoFill
Destination:=Sh.Range("A1:A1000"), Type:=xlFillDefault
Rows("1:1000").Sort Key1:=Range("C1"),
Order1:=xlAscending, Key2:=Range("A1") _
, Order2:=xlAscending,
Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom,
DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
Sh.Columns("A:B").Delete Shift:=xlToLeft
Sh.Columns("G:M").Delete Shift:=xlToLeft
Sh.Cells.EntireColumn.AutoFit
'Range("A1").CurrentRegion.Select
'Selection.Copy
End If
Next Sh
'Application.ScreenUpdating = True
End Sub
Merci pour toutes ces précisions. C'est grâce à ce type de réponses qu'on peut progresser "à petits pas maîtrisés".
-- Bien amicordialement, P. Bastard
Enfin pour finir, prends garde aux incohérences potentielles de tes déclarations de variables par rapport à la réalité de ton classeur. En effet , autant il est de bon usage de déclarer ses variables autant on peut se trouver dans des situations inconfortables. Dans ton code, tu écris Dim sh as worksheet puis tu parcours la collection sheets de thisworkbook, or si tu as p.e une feuille graphique (qui fait partie de la collection sheets mais n'est pas une worksheet) , ton code va se planter car sh n'est pas un objet Chart . Si tu es certain de ne pas avoir d'autres objets que des worksheets tu peux écrire sans inquiétude ce que tu as écrit. Dans le cas contraire, une déclaration de variable de type Object sera + adaptée. Ceci dit, ca ne te dispenserait pas de faire une gestion d'erreur étant entendu que tu ne peux pas faire un certain nombre d'actions permises sur une feuille de type worksheet mais pas sur une feuille de type Chart.
Bonjour, *anonymousA* J'ai lu ton post 42a4a151$0$25050$ avec le plus grand intéret :
Pourtant, actuellement, ça mAAArche. Je vais tester de ce pas le sh.activate de Modeste.
P.S : j'aime pô les surprises douloureuses.
Bien amicordialement, Schtroumpf GrincheuxEtDouillet
eh oui!. Utiliser la mot clé with sh -end with la rendrait d'ailleurs à la fois encore plus lisible et plus rapide. me semble d'ailleurs qu'il manque encore un sh. devant Rows("1:1000") ainsi que devant Range("C1") et Range("A1") car tous les range quelqu'ils soient doivent être référencés à la feuille en cours de la collection, sinon tu risques à terme d'avoir des surprises douloureuses. Cordialement,
Bonjour, *anonymousA* J'ai lu ton post 42a489c5$0$25050$ avec le plus grand intéret :
Sub ménage2() Dim Sh As Worksheet 'Application.ScreenUpdating = False For Each Sh In ThisWorkbook.Sheets If Sh.Name <> "Récap" Then Sh.Columns("A:A").Insert Shift:=xlToRight Sh.Range("A1").FormulaR1C1 = "1" Sh.Range("A2").FormulaR1C1 = "2" Sh.Range("A1:A2").AutoFill Destination:=Sh.Range("A1:A1000"), Type:=xlFillDefault Rows("1:1000").Sort Key1:=Range("C1"), Order1:=xlAscending, Key2:=Range("A1") _ , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _ False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _ :=xlSortNormal Sh.Columns("A:B").Delete Shift:=xlToLeft Sh.Columns("G:M").Delete Shift:=xlToLeft Sh.Cells.EntireColumn.AutoFit 'Range("A1").CurrentRegion.Select 'Selection.Copy End If Next Sh 'Application.ScreenUpdating = True End Sub
Comme ça, ça marche.
Merci, beaucoup...
Modeste
Bonsour® anonymousA eh oui!. Tes remarques sont en effet tout a fait justifiées : 1- For Each Sh In ThisWorkbook.Worksheets 2- Activate en effet il m'était arrivé de ne pouvoir travailler sur une feuille masquée ou avec graphe incorporé qu'a l'aide de Activate, chose que je ne m'étais pas expliqué ....
mais il ne faut pas confondre Activate et Select : l'impact en terme de ralentissement est surtout sensible dans le cas de Select d'un objet Range le Activate ne s'appliquant qu'à une feuille, à le même effet que With Sh Le danger vient cependant de ce que la derniere feuille activée par la proc RESTE ACTIVE et tout autre code suivant qui n'en tiendrai pas compte s'appliquerai pas défaut à cette dernière feuille active.
;o))) @+
Bonsour® anonymousA
eh oui!. Tes remarques sont en effet tout a fait justifiées :
1- For Each Sh In ThisWorkbook.Worksheets
2- Activate
en effet il m'était arrivé de ne pouvoir travailler sur une feuille masquée
ou avec graphe incorporé qu'a l'aide de Activate, chose que je ne m'étais
pas expliqué ....
mais il ne faut pas confondre Activate et Select : l'impact en terme de
ralentissement est surtout sensible dans le cas de Select d'un objet Range
le Activate ne s'appliquant qu'à une feuille, à le même effet que With Sh
Le danger vient cependant de ce que la derniere feuille activée par la proc
RESTE ACTIVE et tout autre code suivant qui n'en tiendrai pas compte
s'appliquerai pas défaut à cette dernière feuille active.
Bonsour® anonymousA eh oui!. Tes remarques sont en effet tout a fait justifiées : 1- For Each Sh In ThisWorkbook.Worksheets 2- Activate en effet il m'était arrivé de ne pouvoir travailler sur une feuille masquée ou avec graphe incorporé qu'a l'aide de Activate, chose que je ne m'étais pas expliqué ....
mais il ne faut pas confondre Activate et Select : l'impact en terme de ralentissement est surtout sensible dans le cas de Select d'un objet Range le Activate ne s'appliquant qu'à une feuille, à le même effet que With Sh Le danger vient cependant de ce que la derniere feuille activée par la proc RESTE ACTIVE et tout autre code suivant qui n'en tiendrai pas compte s'appliquerai pas défaut à cette dernière feuille active.
;o))) @+
anonymousA
re,
un bon essai vaut mieux qu'un long discours. Sur un PC moyen comme le mien et sur une boucle de 103 feuilles sur une proc
for each sh in thisworkbooks.sheets sh.range("A1")=3 next
les résultats en vitesse sont les suivants suivant l'utilisation de activate , select ou sans l'un ou l'autre et pour ce dernier avec une utilisation de with :
activate:L'opération a pris 0,247266552797478 seconds select : L'opération a pris 0,237686287590661 seconds boucle sans activate ni select: L'opération a pris 0,126542304526887 seconds boucle avec with et sans activate ni select : L'opération a pris 0,120125010266665 seconds
A+
Bonsour® anonymousA eh oui!. Tes remarques sont en effet tout a fait justifiées : 1- For Each Sh In ThisWorkbook.Worksheets 2- Activate en effet il m'était arrivé de ne pouvoir travailler sur une feuille masquée ou avec graphe incorporé qu'a l'aide de Activate, chose que je ne m'étais pas expliqué ....
mais il ne faut pas confondre Activate et Select : l'impact en terme de ralentissement est surtout sensible dans le cas de Select d'un objet Range le Activate ne s'appliquant qu'à une feuille, à le même effet que With Sh Le danger vient cependant de ce que la derniere feuille activée par la proc RESTE ACTIVE et tout autre code suivant qui n'en tiendrai pas compte s'appliquerai pas défaut à cette dernière feuille active.
;o))) @+
re,
un bon essai vaut mieux qu'un long discours. Sur un PC moyen comme le mien
et sur une boucle de 103 feuilles sur une proc
for each sh in thisworkbooks.sheets
sh.range("A1")=3
next
les résultats en vitesse sont les suivants suivant l'utilisation de activate
, select ou sans l'un ou l'autre et pour ce dernier avec une utilisation de
with :
activate:L'opération a pris 0,247266552797478 seconds
select : L'opération a pris 0,237686287590661 seconds
boucle sans activate ni select: L'opération a pris 0,126542304526887 seconds
boucle avec with et sans activate ni select : L'opération a pris
0,120125010266665 seconds
A+
Bonsour® anonymousA
eh oui!. Tes remarques sont en effet tout a fait justifiées :
1- For Each Sh In ThisWorkbook.Worksheets
2- Activate
en effet il m'était arrivé de ne pouvoir travailler sur une feuille masquée
ou avec graphe incorporé qu'a l'aide de Activate, chose que je ne m'étais
pas expliqué ....
mais il ne faut pas confondre Activate et Select : l'impact en terme de
ralentissement est surtout sensible dans le cas de Select d'un objet Range
le Activate ne s'appliquant qu'à une feuille, à le même effet que With Sh
Le danger vient cependant de ce que la derniere feuille activée par la proc
RESTE ACTIVE et tout autre code suivant qui n'en tiendrai pas compte
s'appliquerai pas défaut à cette dernière feuille active.
un bon essai vaut mieux qu'un long discours. Sur un PC moyen comme le mien et sur une boucle de 103 feuilles sur une proc
for each sh in thisworkbooks.sheets sh.range("A1")=3 next
les résultats en vitesse sont les suivants suivant l'utilisation de activate , select ou sans l'un ou l'autre et pour ce dernier avec une utilisation de with :
activate:L'opération a pris 0,247266552797478 seconds select : L'opération a pris 0,237686287590661 seconds boucle sans activate ni select: L'opération a pris 0,126542304526887 seconds boucle avec with et sans activate ni select : L'opération a pris 0,120125010266665 seconds
A+
Bonsour® anonymousA eh oui!. Tes remarques sont en effet tout a fait justifiées : 1- For Each Sh In ThisWorkbook.Worksheets 2- Activate en effet il m'était arrivé de ne pouvoir travailler sur une feuille masquée ou avec graphe incorporé qu'a l'aide de Activate, chose que je ne m'étais pas expliqué ....
mais il ne faut pas confondre Activate et Select : l'impact en terme de ralentissement est surtout sensible dans le cas de Select d'un objet Range le Activate ne s'appliquant qu'à une feuille, à le même effet que With Sh Le danger vient cependant de ce que la derniere feuille activée par la proc RESTE ACTIVE et tout autre code suivant qui n'en tiendrai pas compte s'appliquerai pas défaut à cette dernière feuille active.