Exécuter une macro dans plusieurs feuilles d'1 classeur - VB/VBA/VBS - Programmation
Marsh Posté le 10-02-2010 à 15:59:58
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
(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...
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...
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.
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...
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 ?
Marsh Posté le 10-02-2010 à 17:28:38
Pour ton cas, je pencherai vers ça :
Code :
|
Désolé mais je ne sais pas comment sortir d'une boucle sans l'Exit Do
Voili
Marsh Posté le 10-02-2010 à 18:42:11
Bon... test raté... je comprends pas pourquoi...
j'ai adapté le code comme suis :
Code :
|
mais ça ne fonctionne pas, ça tourne en boucle en restant sur la première valeur à copié trouvé...
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 :
|
avec autant de bloc que de pages...
merci de vos idées
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 :
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 :
|
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 :
|
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).
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à ?
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 !
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 :
|
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 |
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 |
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.
|
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.
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 :
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 édité par psykocoic le 10-02-2010 à 15:39:32
---------------
Excel/VBA en apprentissage...