Exécuter une macro dans plusieurs feuilles d'1 classeur

Exécuter une macro dans plusieurs feuilles d'1 classeur - VB/VBA/VBS - Programmation

Marsh Posté le 10-02-2010 à 15:37:02    

Bonjour à tous.
 
Je bosse sur un fichier Excel avec macro VBA.
 
Je cherche à extraire des données selon certaines conditions tel que mon code le fait très bien sur une page définie :
 

Code :
  1. Dim lig As Long
  2. Dim compteur As Long
  3. Dim compteur2 As Long
  4. Dim feuil As String
  5. 'pour feuille 1
  6. compteur = 7
  7. For lig = 12 To 211
  8.     Sheets("1" ).Select
  9.     If Cells(lig, 2) < 30 Then
  10.     If Cells(lig, 2) = 0 Then GoTo 10
  11.         Range(Cells(lig, 6), Cells(lig, 7)).Select
  12.         Selection.Copy
  13.     Sheets("suivi" ).Select
  14.         compteur = compteur + 1
  15.         Range("D" & compteur).PasteSpecial 3
  16.     Sheets("1" ).Select
  17.         Range("F4" ).Select
  18.         Selection.Copy
  19.     Sheets("suivi" ).Select
  20.         Range("F" & compteur).PasteSpecial 3
  21.          
  22.     End If
  23. 10
  24. Next lig


 
Mon problème est que j'aimerais que ce code soit appliqué sur plusieurs feuilles qui sont nommées de 1 à 54 (mais j'aimerais pouvoir définir le second chiffre selon mon nombre réel de feuille qui peut changer) sans les autres feuilles.
 
J'ai tenté un "for feuill = 1 to 54", mais j'échoue. je ne dois pas écrire mon code correctement...
 
auriez vous des pistes pour m'aider ?
 
Thomas

Message cité 1 fois
Message édité par psykocoic le 10-02-2010 à 15:39:32

---------------
Excel/VBA en apprentissage...
Reply

Marsh Posté le 10-02-2010 à 15:37:02   

Reply

Marsh Posté le 10-02-2010 à 15:59:58    

:hello:  
 
Salut !
Je ne sais pas si je vais réussir à répondre à ton problème mais j'ai eu un cas similaire.
J'ai également un classeur avec un certain nombre de feuilles (toutes ces feuilles ont la même structure) et je devais faire travailler une macro sur chacune d'elles à la suite...
Mon souci était que le nombre de ces feuilles étaient variables... et en plus, elles avaient chacune un nom spécifique... même pas numérique... genre A puis S25 puis XDE puis AAA... bref z'avez compris... hein  :D  
(le nombre de feuille est variable car j'ai une autre macro qui en crée en fonction des besoins)...
 
J'ai résolu mon problème en créant 2 feuilles nommées AAAAAAAAAA et ZZZZZZZZZZ.
La 1ère feuille, je l'ai placé en tout premier et la seconde en... dernier...  :p  
 
Ma macro de traitement global commence par se placer sur la feuille AAAAAAAAAA et ensuite il y a une boucle qui parcourt les feuilles une à une (peu importe le nom de ces feuilles)... j'utilise ActiveSheet.Next.Select (ou un truc comme ça)... je sors de ma boucle dès que la macro se trouve sur la feuille ZZZZZZZZZZ.
 
Voili...
 
Bon, cela oblige à avoir 2 feuilles en plus... mais bon, je m'en sers pour autre chose... ;)


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 10-02-2010 à 16:08:42    

Merci pour la réponse.
j'ai vu des messages similaires à ce que tu me dis.
 
seulement, je ne souhaite pas que ma macro passe par toutes les feuilles. seules celles avec un nom en numérique m'intérresse.
 
en gros, j'ai, dans l'ordre :
 
- index
- fiche
- suivi
- 1
- 2
- 3
- 4
- 5 ... ... jusqu'à un nombre défini.

Reply

Marsh Posté le 10-02-2010 à 17:01:17    

Et bien, dans la boucle, tu analyse le nom de la feuille active... s'il est numérique, ta macro s'exécute sinon non...
Ou alors, la feuille AAAAAAAAAA dans mon exemple est la feuille suivi dans ton cas... ;)


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 10-02-2010 à 17:12:07    

merci encore. tu aurais un exemple de code pour chacune des deux solutions que tu proposes ?

Reply

Marsh Posté le 10-02-2010 à 17:28:38    

Pour ton cas, je pencherai vers ça :
 

Code :
  1. Sheets("suivi" ).Select
  2. Do
  3. ActiveSheet.Next.Select
  4. If ActiveSheet.Name = "ZZZZZZZZZZ" Then
  5. Exit Do
  6. End If
  7. ton code à insérer ici
  8. Loop Until ActiveSheet.Next.Name = "ZZZZZZZZZZ"


Désolé mais je ne sais pas comment sortir d'une boucle sans l'Exit Do
Voili


---------------
iMac 4Ghz (fin 2015) RAM 16Go SSD 256Go SSD 2To
Reply

Marsh Posté le 10-02-2010 à 18:29:53    

ok. merci, je vais tester.
 
bonne soirée.

Reply

Marsh Posté le 10-02-2010 à 18:42:11    

Bon... test raté... je comprends pas pourquoi...
 
j'ai adapté le code comme suis :
 

Code :
  1. Sheets("suivi" ).Select
  2.    Do
  3.    ActiveSheet.Next.Select
  4.    If ActiveSheet.Name = "ZZZZZ" Then
  5.    Exit Do
  6.    End If
  7.  
  8. Dim lig As Long
  9. Dim compteur As Long
  10. compteur = 7
  11. For lig = 12 To 211
  12.     If Cells(lig, 2) < 30 Then
  13.     If Cells(lig, 2) = 0 Then GoTo 10
  14.         Range(Cells(lig, 6), Cells(lig, 7)).Select
  15.         Selection.Copy
  16.     Sheets("suivi" ).Select
  17.         compteur = compteur + 1
  18.         Range("D" & compteur).PasteSpecial 3
  19.              
  20.     End If
  21. 10
  22. Next lig
  23.  
  24.    Loop Until ActiveSheet.Next.Name = "ZZZZZ"


 
mais ça ne fonctionne pas, ça tourne en boucle en restant sur la première valeur à copié trouvé...

Reply

Marsh Posté le 11-02-2010 à 10:44:55    

Bonjour à tous.
 
quelqu'un aurait une idée pour me dépanner ? je n'ai pas réussi à appliquer l'idée soumise par scaryfan.
 
du coup, pour le moment, je suis obligé de faire tourner comme suit :
 

Code :
  1. 'pour feuille 1
  2. compteur = 7
  3. For lig = 12 To 211
  4.     Sheets("1" ).Select
  5.     If Cells(lig, 2) < 30 Then
  6.     If Cells(lig, 2) = 0 Then GoTo 10
  7.         Range(Cells(lig, 6), Cells(lig, 7)).Select
  8.         Selection.Copy
  9.     Sheets("suivi" ).Select
  10.         compteur = compteur + 1
  11.         Range("D" & compteur).PasteSpecial 3
  12.     Sheets("1" ).Select
  13.         Range("F4" ).Select
  14.         Selection.Copy
  15.     Sheets("suivi" ).Select
  16.         Range("F" & compteur).PasteSpecial 3
  17.          
  18.     End If
  19. 10
  20. Next lig
  21. 'pour feuille 2
  22. For lig = 12 To 211
  23.     Sheets("2" ).Select
  24.     If Cells(lig, 2) < 30 Then
  25.     If Cells(lig, 2) = 0 Then GoTo 11
  26.         Range(Cells(lig, 6), Cells(lig, 7)).Select
  27.         Selection.Copy
  28.     Sheets("suivi" ).Select
  29.         compteur = compteur + 1
  30.         Range("D" & compteur).PasteSpecial 3
  31.     Sheets("2" ).Select
  32.        Range("F4" ).Select
  33.        Selection.Copy
  34.     Sheets("suivi" ).Select
  35.         Range("F" & compteur).PasteSpecial 3
  36.      
  37.     End If
  38. 11
  39. Next lig
  40. 'pour feuille 3
  41. For lig = 12 To 211
  42.     Sheets("3" ).Select
  43.     If Cells(lig, 2) < 30 Then
  44.     If Cells(lig, 2) = 0 Then GoTo 12
  45.         Range(Cells(lig, 6), Cells(lig, 7)).Select
  46.         Selection.Copy
  47.     Sheets("suivi" ).Select
  48.         compteur = compteur + 1
  49.         Range("D" & compteur).PasteSpecial 3
  50.     Sheets("3" ).Select
  51.        Range("F4" ).Select
  52.        Selection.Copy
  53.     Sheets("suivi" ).Select
  54.         Range("F" & compteur).PasteSpecial 3
  55.      
  56.     End If
  57. 12
  58. Next lig


 
avec autant de bloc que de pages...
 
merci de vos idées


Message édité par psykocoic le 11-02-2010 à 10:57:29
Reply

Marsh Posté le 13-02-2010 à 17:35:39    

psykocoic a écrit :

Bonjour à tous.

 

Je bosse sur un fichier Excel avec macro VBA.

 

Je cherche à extraire des données selon certaines conditions tel que mon code le fait très bien sur une page définie :

 
Code :
  1. Dim lig As Long
  2. Dim compteur As Long
  3. Dim compteur2 As Long
  4. Dim feuil As String
  5. 'pour feuille 1
  6. compteur = 7
  7. For lig = 12 To 211
  8.     Sheets("1" ).Select
  9.     If Cells(lig, 2) < 30 Then
  10.     If Cells(lig, 2) = 0 Then GoTo 10
  11.         Range(Cells(lig, 6), Cells(lig, 7)).Select
  12.         Selection.Copy
  13.     Sheets("suivi" ).Select
  14.         compteur = compteur + 1
  15.         Range("D" & compteur).PasteSpecial 3
  16.     Sheets("1" ).Select
  17.         Range("F4" ).Select
  18.         Selection.Copy
  19.     Sheets("suivi" ).Select
  20.         Range("F" & compteur).PasteSpecial 3
  21.          
  22.     End If
  23. 10
  24. Next lig
 

Mon problème est que j'aimerais que ce code soit appliqué sur plusieurs feuilles qui sont nommées de 1 à 54 (mais j'aimerais pouvoir définir le second chiffre selon mon nombre réel de feuille qui peut changer) sans les autres feuilles.

 

J'ai tenté un "for feuill = 1 to 54", mais j'échoue. je ne dois pas écrire mon code correctement...

 

auriez vous des pistes pour m'aider ?

 

Thomas

 

Essaye ça :

Code :
  1. Dim lig As Long
  2. Dim compteur As Long
  3. Dim compteur2 As Long
  4. Dim feuil As String
  5. Dim i As Integer
  6. Dim nbFeuille As Integer
  7. 'Choix du nombre de feuille
  8. nbFeuille = InputBox("Saisir le nombre de feuilles" )
  9. 'Début de la boucle : de la feuille 1 à la feuille nbFeuille
  10. For i = 1 To nbFeuille
  11. compteur = 7
  12. For lig = 12 To 211
  13.     Sheets(i).Select
  14.     If Cells(lig, 2) < 30 Then
  15.     If Cells(lig, 2) = 0 Then GoTo 10
  16.         Range(Cells(lig, 6), Cells(lig, 7)).Select
  17.         Selection.Copy
  18.     Sheets("suivi" ).Select
  19.         compteur = compteur + 1
  20.         Range("D" & compteur).PasteSpecial 3
  21.     Sheets("1" ).Select
  22.         Range("F4" ).Select
  23.         Selection.Copy
  24.     Sheets("suivi" ).Select
  25.         Range("F" & compteur).PasteSpecial 3
  26.        
  27.     End If
  28. 10
  29. Next lig
  30. next i


Message édité par otobox le 13-02-2010 à 17:38:30

---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 13-02-2010 à 17:35:39   

Reply

Marsh Posté le 13-02-2010 à 22:29:35    

MErci, je vais tester.

Reply

Marsh Posté le 16-02-2010 à 14:48:17    

Bonjour
 
Pour compléter l'idée de OtObOx, voici un moyen de connaitre le nombre de feuille sous Excel :
Sheets.Count
 
Ce qui donnerait avec le début de code de OtObOx :

Code :
  1. Dim lig As Long
  2. Dim compteur As Long
  3. Dim compteur2 As Long
  4. Dim feuil As String
  5. Dim i As Integer
  6. Dim nbFeuille As Integer
  7. 'Choix du nombre de feuille/Compte le nb de feuille
  8. nbFeuille = Sheets.Count


Message édité par SuppotDeSaTante le 16-02-2010 à 14:48:52

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 16-02-2010 à 17:49:29    

Je pense qu'il peut y avoir un petit problème dans le code que j'ai posté. Pour tester, j'avais renommé ma première feuille 1, la deuxième 2 et la troisième 3.
Ca fonctionne, merci :)
Mais c'est un hasard, car le nom des feuilles suit leur numérotation (index).
Je pense que ça fonctionnera mieux en indiquant que c'est le nom de la feuille "1" et pas le numéro (1). Il faut convertir le numéro en chaine de caractère avec la fonction cstr()
 
Pour se faire, modifier cette ligne :

Sheets(i).Select


par :

Sheets(cstr(i)).Select


La différence est subtile, mais importante ;)
 
(ceci dit, je n'ai pas testé, mais ça devrait fonctionner).


Message édité par otobox le 16-02-2010 à 17:49:52

---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 16-02-2010 à 18:21:17    

le problème était bien là... entre comment je nommais les feuilles et leur ordre dans le classeur.
 
quand on dit for feuil 1 to i, ça prend la premièrre feuille sans distinction de son  nom jusqu'à la i...
 
je suis compréhensible là ?

Reply

Marsh Posté le 16-02-2010 à 19:05:13    

Oui, puisque les feuilles peuvent être identifiées par leur numéro unique ou par leur nom !
Le numéro unique est de type numérique, le nom est de type string (chaine de caractères)
En convertissant la variable numérique i par un string i, la procédure reconnait que tu sélectionnes un nom de feuille et pas sa référence numérique !


---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 16-02-2010 à 22:05:35    

ok pour le string...
 
punaise... encore une solution "facile et simple" pour laquelle j'ai galéré quelques heures...
 
Merci à tout ceux qui sont intervenus. je vous mets le code que j'ai retenu pour le moment :
 

Code :
  1. Dim lig As Long
  2. Dim compteur As Long
  3. Dim feuil As Long
  4. Dim chiffre As String
  5. 'on va chercher combien de feuilles sont à regarder
  6. Sheets("Index" ).Select
  7. Range("J26" ).Select
  8. chiffre = ActiveCell.Value
  9. ' on extrait
  10. compteur = 7
  11. For feuil = 4 To chiffre
  12.      Sheets(feuil).Select
  13. For lig = 12 To 211
  14.     If Cells(lig, 2) < 30 Then
  15.     If Cells(lig, 2) = 0 Then GoTo 1
  16.         Range(Cells(lig, 6), Cells(lig, 7)).Select
  17.         Selection.Copy
  18.     Sheets("suivi" ).Select
  19.         compteur = compteur + 1
  20.         Range("D" & compteur).PasteSpecial 3
  21.     Sheets(feuil).Select
  22.         Range("F4" ).Select
  23.         Selection.Copy
  24.     Sheets("suivi" ).Select
  25.         Range("F" & compteur).PasteSpecial 3
  26.          
  27.     End If
  28. 1
  29. Next lig
  30. Next feuil
  31. End Sub


Message édité par psykocoic le 16-02-2010 à 22:06:47
Reply

Marsh Posté le 17-02-2010 à 07:49:47    

A partir du moment où tu mets un for...next, tu incrémentes un chiffre...
Or, dans ta boucle :

For feuil = 4 To chiffre


feuil est une variable de type Integer et chiffre une variable que tu as déclaré en type String :  

Dim chiffre As String


Ca ne va pas fonctionner ! Incompatibilité de type !
 
Il faut que tu transformes le type de ta variable en Integer :

Dim chiffre As Integer


puis quand tu sélectionnes ta feuille, il faut convertir cette variable feuil de type Integer en type String ! Et seulement à cet endroit là !

Sheets(cstr(feuil)).Select


Message édité par otobox le 17-02-2010 à 07:53:24

---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 17-02-2010 à 08:57:28    

d'après mes premiers tests, ça avait l'air de fonctionner... mais je suis toujours ok pour améliorer les codes et apprendre. n'ayant pas de formation sur le domaine, je tatonne sur la création de mes codes.
 
par contre, étant donner que je cherche mes feuillets via leur numéro et non plus le nom que je leur donne, ceci est-il encore nécessaire ?  
 

Sheets(cstr(feuil)).Select

Reply

Marsh Posté le 17-02-2010 à 18:23:59    

psykocoic a écrit :

d'après mes premiers tests, ça avait l'air de fonctionner... mais je suis toujours ok pour améliorer les codes et apprendre. n'ayant pas de formation sur le domaine, je tatonne sur la création de mes codes.
 
par contre, étant donner que je cherche mes feuillets via leur numéro et non plus le nom que je leur donne, ceci est-il encore nécessaire ?
 

Sheets(cstr(feuil)).Select



Ben non, comme je tentais de l'expliquer dans mon message précédent, le cstr converti un nombre en chaine de caractère. Donc, pour appeler les feuilles par leur nom, pas par leur n° unique.


---------------
OtObOxBlOg - - - Etre seul à avoir tort  c'est plus difficile, mais c'est bien plus beau que d'avoir raison avec une bande de cons
Reply

Marsh Posté le 17-02-2010 à 18:34:31    

ok. j'avais donc bien compris. merci.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed