Macro sur plusieurs feuilles

Pendibidu

XLDnaute Nouveau
Bonjour à tous,
J'ai crée une macro qui permet d'automatiser certaines taches. Problemes je voudrais savoir comment utiliser la meme macro sur des feuilles différentes qui portent sur l'année.
J'ai utilisé une formule avec Index(...);Equiv(année!)....
En fait j'ai une feuille pour l'année 2002, une pour 2003, une pour 2004, et une pour 2005.
Merci pour votre aide,
Pendibidu :)
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Pendibidu, le Forum


Voici une première approche ...


Sub TheSpreadSheetMacroRunner()
Dim WS As Worksheet

   
For Each WS In ThisWorkbook.Worksheets
       
Select Case WS.Name
           
Case 2002, 2003, 2003, 2005
            TheBigMacro
       
End Select
   
Next
End Sub

Sub TheBigMacro()
MsgBox 'Hello, il est ' & Format(Now, 'HH:DD:SS')
End Sub


On pourrait aussi gérer le 'Case Else' si besoin d'un traitement différent...

Bon Aprèm
[ol]@+Thierry[/ol]
 

Pendibidu

XLDnaute Nouveau
resalut à tous,
Après un contrôle je me rends compte que la macro exécute à l'identique des infos contenues dans la feuille 2002, donc sur 2003, 2004 et 2005 je me retrouves avec des résultats qui ne correspondonent pas à la formule initiale mais plutot à ceux de 2002
Merci à ceux qui se pencheront sur le cas!

Pendibidu
 

niki42

XLDnaute Occasionnel
Bonjour à tous

Pendibidu

Il faudrait peut être adapter ton code en fonction de la feuille, à savoir pour chaque feuille mettre with worksheets('feuille 2002'), with worksheets('feuille 2003'), etc...

Voilà en espérant que ma réponse t'aidera


@++

:)
 

Pendibidu

XLDnaute Nouveau
salut Niki42,
voici la partie du code VB concernant la manip au niveau des feuilles.
Peut etre que ce sera plus explicite pour ma question:

ActiveCell.FormulaR1C1 = _
'=INDEX(CATEGORIES!R3C2:R38C2,MATCH('2005'!RC[-4],CATEGORIES!R3C1:R38C1,0))'
En fait c'est le match ('2005'! que je voudrais qu'il fonctionne pour toutes les feuilles
Merci
Pendibidu
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Pendibidu, Niki, le Forum

Oui Niki, tu as raisons selon toute vraissemblance.
En fait on peut passer en argument l'Object WorkSheet directement depuis la Boucle comme suit :

Sub TheSpreadSheetMacroRunner()
Dim WS As Worksheet

   
For Each WS In ThisWorkbook.Worksheets
       
Select Case WS.Name
           
Case 2002, 2003, 2003, 2005
            TheLocalMacroDePendibidu WS
       
End Select
   
Next
End Sub

Sub TheLocalMacroDePendibidu(WS As Worksheet)
MsgBox 'La Cellule A1 de la Feuille ' & WS.Name & ' contient ' & WS.Range('A1')
End Sub

Le Passage d'Argument se fait comme ceci :
TheLocalMacroDePendibidu WS

TheLocalMacroDePendibidu(WS As Worksheet)

NB Il n'est pas nécessaire de passer l'argument avec le même nom... J'aurais très bien pu écrire la Sub de réception d'argument ainsi :

Sub TheLocalMacroDePendibidu(LaFeuille As Worksheet)
MsgBox 'La Cellule A1 de la Feuille ' & LaFeuille.Name & ' contient ' & LaFeuille.Range('A1')
End Sub


Cependant étant donné que Pendibidi semble débuter il est fort probable aussi qu'il travaille sur les Range Actives ... Or dans ce cas il faut s'y prendre autrement, voici une autre Suggestion :

Sub TheSpreadSheetMacroRunner()
Dim WS As Worksheet

   
For Each WS In ThisWorkbook.Worksheets
       
Select Case WS.Name
           
Case 2002, 2003, 2003, 2005
            TheLocalMacroDePendibiduAvecFeuilleActive
            WS.Activate
       
End Select
   
Next
End Sub

Sub TheLocalMacroDePendibiduAvecFeuilleActive()
MsgBox 'La Cellule A1 de la Feuille ' & ActiveSheet.Name & ' contient ' & Range('A1')
End Sub


Bonne Soirée
@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Phillippe, re le Fil

Je ne sais si Pendibidu s'en sortira, mais ce que je constate c'est que tu as été un peu sec :
Philippe écrit:
On ne passe pas comme ca de l'enregistrement macro à la programmation, meme simple (sauf si on connait Visual Basic)
Une piste pour apprendres
Ce lien n'existe plus

Philippe NOSS

Je connais ton Excellente réputation sur le Net et je ne pense pas que tu aurais apprécié qu'on te décourage dès tes premiers pas.

Par ailleurs je sais que tu connais David, mais perso, nous tous ici dans le Forum XLD nous mettons un point d'honneur à éviter tout lien vers des pages de vente de Soft ou de Développement, ici dans ce Forum on est tous en terrain 'neutre', ni Pub, ni Trompette, Ni Canon !

Bonne Fin D'après Midi
@+Thierry
 
P

Pendibidu

Guest
Merci Thierry,
Bien que je n'y comprenne rien dans le jargon du code mais j'apprecie tout sincèrement tes explications et conseils!
Par contre les remarques à 2 balles du genre celle de Philippe, je les prends plutôt tres sport.
Mon objectif est de parvenir à résoudre mon problème tout en sachant que cela passe par des reflexions de tous genres sur le forum

Merci encore pour ton aide, j'essaie de comprendre posemment les conseils que tu viens de me filer!
@ +
Pendibidu
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonsoir Pendibidu, Philippe, Niki, le Forum

En fait Pendibidu (c'est marrant comme pseudo), une erreur usuelle et tout à fait normale des débutants en VBA c'est de faire souvent la retranscription de ce que l'enregistreur leur donne...

Une Simple Formule écrite en cellule 'A1' => =SUM(B1:B30)

Devient ceci en VBA enregistrée :
ActiveCell.FormulaR1C1 = '=SUM(RC[1]:R[29]C[1])'

Alors que l'on peut éviter cet horrible syntax avec R1C1 comme ceci
ActiveCell.Formula = '=SUM(B1:B30)'

Par la suite on apprendra à écrire

Range('A1').Formula = '=SUM(B1:B30)'
Au lieu d'aller activer une Cellule...

Ensuite on Apprendra à passer une Variable dans la Formule

Dim MyRange As String
MyRange = 'B1:B30'
Range('A1').Formula = '=SUM(' & MyRange & ')'

Enfin voilà quelques bases... Sinon pour tout problème concret voici ce que j'ai ccompris :

Sub TheSpreadSheetMacroRunner()
Dim WS As Worksheet

   
For Each WS In ThisWorkbook.Worksheets
       
Select Case WS.Name
           
Case 2002, 2003, 2003, 2005
            TheLocalMacroDePendibidu WS
       
End Select
   
Next
End Sub

Sub TheLocalMacroDePendibidu(WS As Worksheet)
'Ici Déclaration des Variables (Toutes de Type String (Chaine de Caractères)
Dim StrWSDestination As String
Dim StrWSCategorie As String
Dim StrRangeIndex As String
Dim StrRangeMatch As String
Dim StrFormulaString As String

'Ici on Déclare une Variable Range pour la Cellule de Destination
Dim ObjRangeDestination As Range

'Et ici on intialise l'Objet Range avec un Set
Set ObjRangeDestination = WS.Range('E1') ' (E1) A Adapter ...
'(Attention vers la droite D1 ou F1 ou G55 etc MAIS PAS D1 ou moins ... Sinon BOUM !!!' LOL)


'Ici Initialisation des Variables
StrWSDestination = WS.Name
'Cela vient de l'argument passé
StrWSCategorie = 'CATEGORIES'
StrRangeIndex = '$B$3:$B$38'
StrRangeMatch = '$A$3:$A$38'



'Ici on Contruit une Concaténation de la Formule à 2crire en Utilisant les Variables
StrFormulaString = '=INDEX(' & StrWSCategorie & '!' & StrRangeIndex & _
                    ',MATCH(
'' & StrWSDestination & ''!' & _
                    ObjRangeDestination.Offset(0, -4).Address(0, 0) & _
                    ',' & StrWSCategorie & '!' & StrRangeMatch & ',0))'


   
'Ici on envoie le tout sur la range de destination
    ObjRangeDestination.Formula = StrFormulaString

End Sub


J'ai essayé d'être détaillé, toutes ces Variables sont plutôt là pour ta compréhension, plutôt que pour faire un code directe.

Bon Courage et Welcome to VBA's World
[ol]@+Thierry[/ol]
 

Discussions similaires

Réponses
8
Affichages
442

Statistiques des forums

Discussions
312 671
Messages
2 090 758
Membres
104 654
dernier inscrit
elisabete_custodio