Répétition de macro sur plusieurs feuilles d'un classeur
likemonster
Messages postés40Date d'inscriptionvendredi 16 janvier 2009StatutMembreDernière intervention29 octobre 2009
-
12 févr. 2009 à 19:21
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 2010
-
16 févr. 2009 à 00:58
Bonsoir, je viens de créer une petite macro pour traiter des données, seulement j'ai un petit souci! Cette macro doit être utilisé sur plusieurs feuilles "DDV1, DDV2,....DDV30"! Ces 30 feuilles ont la même structure mais je n'arrive pas à effectuer le code sans répéter la macro pour chaque feuille! Sachant qu'il y a d'autres feuilles et que seul les "DDVi" doivent être soumise à cette macro! Voici le code:
Range("D50:E409").Sort Key1:=Range("D50"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
End Sub
likemonster
Messages postés40Date d'inscriptionvendredi 16 janvier 2009StatutMembreDernière intervention29 octobre 2009 12 févr. 2009 à 20:34
Super!!! ça marche nikel j'ai testé en vitesse et a priori ça convient.... je re-testerai demain au boulot avec le vrai fichier!! Merci beaucoup Néanmoins je viens de me rendre conte d'un souci dans mon code:
Le classement ne s'effectue pas sachant qu'il s'agit des valeurs récupéré dans un tableau (voir code juste au dessus!). Aurais tu une idée pourquoi ça ne marche pas?? j'ai bien les valeurs mais elles ne sont pas classé!! alors que mes 2 autres codes de classement eux fonctionnent nikel....
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 13 févr. 2009 à 10:31
Salut
c'est vrai que pour les tris, je ne me suis pas attardé. Orohena a bien vu cela
Sub copie()
Dim sh As Worksheet
With ActiveWorkbook
For Each sh In Worksheets
With sh
.Range("K50:K161").Value = .Range("P17:P128").Value
' et la suite des copies ' '
' ici ce font les TRIS (ne pas oublier les "." devant "Range")
.Range("K50:M609").Sort Key1:=.Range("K50"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
.Range("D50:E409").Sort Key1:=.Range("D50"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
Next
End With
End Sub
CNTJC
Vous n’avez pas trouvé la réponse que vous recherchez ?
likemonster
Messages postés40Date d'inscriptionvendredi 16 janvier 2009StatutMembreDernière intervention29 octobre 2009 13 févr. 2009 à 16:03
Merci beaucoup cnt et horoena, j'ai juste deux questions? une pour info, pourquoi faut il mettre un point avant range?? je ne vois pas la différence... et enfin mon dernier souci est que la macro s'effectu sur toutes les page or je ne veux qu'elle s'efffectue que sur les feuille nommé de DDV1 à DDV30? Faudrait pas faire une declaration de variable genre DDVi quelque chose de ce genre pour que juste ces feuilles soient utilisé par la macro et pas les autres!
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 13 févr. 2009 à 19:11
Bonjour
Je réponds à ta question sur le point.
Le point introduit par cnt fait partie de la syntaxe des blocs With / End With. Il évite de répéter le nom de la variable qui suit le premier mot With. Ca veut dire que :
With sh
.Range("K50:K161").Value = .Range("P17:P128").Value
End With
La clause With <variable> est très parlante, elle veut dire que <variable> est au coeur des opérations qui suivent. End With, de la même manière, veut dire que ces opérations sont terminées. Un programme écrit avec de nombreux blocs With intelligemment utilisés peut être très agréable à lire et facile à déchiffrer.
Pour en savoir plus, tu peux consulter l'aide en ligne du mot-clé With.
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 13 févr. 2009 à 19:31
Pour la deuxième question
Effectivement tu avais précisé dès ton premier message que tu voulais que seules les feuilles DDV1 à DDV30 soient traitées. Autrement dit, il ne faut traiter une feuille DDVi que si i <= 30. Pour cela, tu dois retoucher ton code comme suit (les retouches sont en caractères gras) :
Dim i As Integer
For Each sh In WorkSheets
With sh
i = Val(Mid(.Name,4))
If i < = 30 Then .Range("K50:K161").Value = .Range("P17:P128").Value
etc, etc
End If
End With
Next
J'en profite pour corriger une petite erreur dans mon message précédent. Il faut lire :
likemonster
Messages postés40Date d'inscriptionvendredi 16 janvier 2009StatutMembreDernière intervention29 octobre 2009 14 févr. 2009 à 19:33
Bonsoir Orohena! Merci infiniment pour tes réponses mais le code que tu viens d'écrire ne change rien... la macro s'exécute toujours sur toutes les pages !! Je rappel que j'ai une feuille "Paramètres", "Lancement" et le reste de "DDV1" à "DDV30"! Seul les feuilles DDVi doivent être exécutées par la macro! Est-ce possible?!
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 14 févr. 2009 à 19:48
Salut
Cela devrait suffire pour accéder aux feuilles "DDVi"
Dim i As Integer, sh As Worksheet
For Each sh In Worksheets
With sh
If UCase(Left(.Name, 3) = "DDV") Then
.Range("K50:K161").Value = .Range("P17:P128").Value
etc , etc
End If
End With
Next
likemonster
Messages postés40Date d'inscriptionvendredi 16 janvier 2009StatutMembreDernière intervention29 octobre 2009 15 févr. 2009 à 13:43
Effectivement, il me semblait l'avoir signalé mais non.... désolé! en tout cas le code de cnt me convient, ça correspond exactement à ce que je voulais!! Merci beaucoup à vous deux car grâce aux infos que vous m'avez donné je vais pouvoir faire de petites macros sympa qui vont me faciliter la vie. D'ailleur j'ai voulu intégrer dans la boucle le tracer d'un graphe avec le code suivant:
Dim i As Integer, sh As Worksheet
For Each sh In Worksheets
With sh
If UCase(Left(.Name, 3) = "DDV") Then
Mais la macro bloc au niveau des codes rouge, je pensais qu'en intégrant ce code dans la boucle ça générerai un graph à chaque fois qu'on est sur une feuille DDVi! Je tiens à préciser que dans la structure des feuilles DDVi il y a déjà le graphe, je veux simplement y a ajouter les série de données! Vs auriez une idée?
likemonster
Messages postés40Date d'inscriptionvendredi 16 janvier 2009StatutMembreDernière intervention29 octobre 2009 15 févr. 2009 à 19:42
Complètement tu as raison, l'erreur était sous mon nez.... j'ai pas mal bossé sur mon code cet aprem je l'ai fini a 90%, il ne me reste plus qu'à rajouter une condition! En gros sur chacune des feuilles DDVi, il y a une valeur en "A2" qui n'est pas
la même sur toutes les feuilles. L'objectif de la condition est qu'elle
marque toutes les valeurs de la colonne D de la feuille "Lancer
simulation" sur la feuille DDVi en "A5"si elles sont inférieur à "A2". Voici mon
code, je pense que j'ai un problème pour déclarer la case "A2" des
feuilles DDVi.
Dim i As Integer, sh As Worksheet
Dim DerniereLigne As Long 'dans la feuille à écrire "DDVi"
Dim LigneActive As Long 'dans la feuille à lire "Lancer simulation"
For Each sh In Worksheets
With sh
If UCase(Left(.Name, 3) = "DDV") Then
Sheets("Lancer simulation").Select
Range("D5").Select
While ActiveCell.Value <> Empty
LigneActive = ActiveCell.Row 'n° de la ligne "à lire"
If Cells(LigneActive, 4).Value <= .Range("A2") Then
DerniereLigne = .Range("A65536").End(xlUp).Offset(1, 0).Row 'n° de la ligne "à écrire"
.Cells(DerniereLigne, 1).Value = Cells(LigneActive, 4). Value 'écrit dans la 1ère colonne la valeur trouvée dans la colonne D
Wend
........ suite du code........
Je suis presque au bout, il ne me reeste que cette grosse condition et quelques petit arrangement..... mais la ça veux pas!!
cnt
Messages postés219Date d'inscriptionlundi 21 novembre 2005StatutMembreDernière intervention20 décembre 20101 16 févr. 2009 à 00:58
Si j'ai bien compris ta démarche, voila une solution:
Dim i As Integer, sh As Worksheet
Dim DerniereLigne As Long 'dans la feuille à écrire "DDVi"
Dim LigneActive As Long 'dans la feuille à lire "Lancer simulation"
For Each sh In Worksheets
With sh
If UCase(Left(.Name, 3) = "DDV") Then
Sheets("Lancer simulation").Select
Range("D5").Select
While ActiveCell.Value <> Empty
LigneActive = ActiveCell.Row 'n° de la ligne "à lire"
If Cells(LigneActive, 4).Value <= .Range("A2").Value Then
'n° de la ligne "à écrire"
DerniereLigne = .Range("A65536").End(xlUp).Offset(1, 0).Row
'écrit dans la 1èreligne(non pas colonne) la valeur trouvée dans la colonne D
.Cells(DerniereLigne, 1).Value = Cells(LigneActive, 4).Value
End If
'nouvelle cellule active D5,D6,etc...
Range(ActiveCell.Offset(1, 0).Address).Select
Wend
End If
End With
Nextsh
Si ce n'est pas ça, décrit plus mieux la procédure