Macro capable de générer une macro

cs_JPh007 Messages postés 37 Date d'inscription mardi 12 août 2008 Statut Membre Dernière intervention 17 juillet 2012 - 12 nov. 2008 à 20:49
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 14 nov. 2008 à 11:49
Bonjour,

Je vais essayer d'être le plus explicite possible tout en rentrant pas trop dans les détails:

Voilà mon besoin:

Dans le cadre d'un éditeur de feuilles de résultats j'ai créé un programme VBA me permettant de produire des feuilles de résultats de laboratoire. En fonction du type de prélèvement et du service la macro effectue un copier coller du tableau de valeur type que la feuille de résultat présenteras. Les différents tableaux se trouvent sur des feuilles du classeurs. Seulement cette méthode nécessite de créer les grilles au préalables et les macros en fonction du besoin...

Besoin qui évolue jour après jour ...

Alors j'ai dans l'idée de permettre à l'utilisateur d'ajouter de nouveaux types de prélèvements et de nouveaux services. Ceci me demanderait de réaliser une macro qui permettra:
 - d'une part de créer une nouvelle grille de donnée en ajoutant une feuille au classeur
- et d'autre part de créer une nouvelle macro rattachée avec un nouveau bouton dans le userform permettant un nouveau copié collé entre autre.

L'étape pour laquelle je m'interroge le plus est:

Est il possible de créer une macro capable de créer une autre macro?
En faite je m'explique les nouvelles macro créées en même temps que les nouvelles grilles seront basées exactement sur le même code mais avec des références de "feuil" différentes correspondant à la nouvelle feuille ajoutée au classeur.
Et t'il possible de faire cela ??

Suis-je assez clair ?

Merci beaucoup pour vos remarques.

4 réponses

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
12 nov. 2008 à 22:05
Salut,

oui c'est possible mais pourquoi ne pas faire une seul macro capable de s'adapter aux nouvelles grilles ? Par ce que la tu es parti pour faire une usine a gaz et il ne me semble pas (d'apres ce que je comprend) que tu ais en besoin de cette usine a gaz.

Donc pour le moment je te conseil plutot de regarder du coter d'une seul macro.

A+
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
13 nov. 2008 à 15:10
Bonjour,

J'suis du même avis que "big le vrai poisson"...

"Suis-je assez clair ?"
Euh... presque, mais bon on comprend...

"- d'une part de créer une nouvelle grille de donnée en ajoutant une feuille au classeur"
Donc il suffit de mettre le code exemple suivant :
Sheets.Add

"- et d'autre part de créer une nouvelle macro rattachée avec un nouveau bouton dans le userform permettant un nouveau copié collé entre autre."
Non. Pas de nouvelle macro nécessaire, mais une macro qui sait d'où elle appeler, donc sur quelle feuille.
Il est facile de faire une référence relative en récupérant le nom de la feuille, par exemple...
Avec : ActiveSheet.Name

Le bouton appelant la macro pouvant être intégrée dans un nouveau menu de la barre de menu d'Excel.

... Imaginer dupliquer le code de la macro, est évidemment une usine à gaz en comparaison... j'suis bien d'accord avec le message précédent.

Amicalement,
Us.
0
cs_JPh007 Messages postés 37 Date d'inscription mardi 12 août 2008 Statut Membre Dernière intervention 17 juillet 2012
13 nov. 2008 à 19:34
Bonsoir,

Ok je vois,

Voilà à quoi ressemble chacune des macros:

Sub AIRBIBERONNERIE()
'
' AIRBIBERONNERIE Macro
' Macro enregistrée le 09/04/2008 par JP
'

'
    ActiveWindow.SmallScroll Down:=57
    Application.Run "AIRGEN"
    Range("B2:H3").Select
    ActiveCell.FormulaR1C1 = "BIBERONNERIE"
    With ActiveCell.Characters(Start:=1, Length:=12).Font
        .Name = "Arial Black"
        .FontStyle = "Gras"
        .Size = 18
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    Range("B8:D8").Select
    ActiveCell.FormulaR1C1 = "Mr DUPONT"
    Range("B10:F10").Select
    ActiveCell.FormulaR1C1 = "PRELEVEMENTS DE CONTRÔLE HABITUEL"
    Range("B12:H12").Select
    ActiveCell.FormulaR1C1 = "APRES FERMETURE DU SERVICE"
     Rows("14:53").Select
    ActiveWindow.ScrollWorkbookTabs Position:=xlFirst
    Selection.Copy
    Sheets("FEUILLE EDITEE").Select
       
End Sub

Toutes les données de TEXTE en rouge sont des données changeantes en fonction du prélèvement et du services.  Y a t'il moyen de remplacer ce texte par des références relatives et avec des conditions ????

Encore merci pour votre coup de pousse
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
14 nov. 2008 à 11:49
Bonjour,

Il me semble que tu ne possède aucune connaissance en programmation, au vu du code... Il va donc être difficile de d'expliquer comment s'y prendre, dans la sens où il faudrait de faire un vrai cours de programmation...

Dans le principe, l'idée c'est d'utiliser une variable dans laquelle on stocke un contenu (d'une cellule particulière dans une feuille réservée aux stockages des données), qu'il suffit de mettre en référence à la place des textes en rouges.

Exemple : non, pas sur ton code pour simplifier mes propos.
Imaginons que dans A1 de la feuil1, on a le texte "Bonjour"
On veut faire une copie dans D1 de la feuil2...
plusieurs possibilités existent, notamment passer par une variable, soit :

x = Sheets("Feuil1").Range("A1").Value
Sheets("Feuil2").Range("D1").Value = x

Ici la variable est "x".

Maintenant, pour faire la corélation avec le code de ta macro, on pourrait écrire :

x = Sheets("Feuil1").Range("A1").Value



Sheets("Feuil2").Select
Range("D1").Select
ActiveCell.FormulaR1C1 = x


Le résultat final sera le même, mais moins rapide... je veux juste illustrer les choses avec les mêmes instructions que ce tu proposes (qui vient de l'enregistreur de macro).

Maintenant, pour remplacer toutes des textes, il faut procéder avec une boucle.
La boucle permettre d'incrément une autre variable, qui nous servira à pointer sur des références de cellules différentes, et ainsi remplir tout un emsemble de cellules à fois...

Second exemple :
imaginons de dans les cellules A1, A2, A3... de la feuil 1, on est les différents textes (un par cellule)
"BIBERONNERIE", "Mr DUPONT", "PRELEVEMENTS DE CONTRÔLE HABITUEL", etc...
on veut donc recopier ces cellules sur la feuil2, dans des cellules différentes mais non en ligne, par exemple D1, E2,F4..

Dim cellule(3)
cellule(1) = "D1"
cellule(2) = "E3"
cellule(3) = "F4"



For t = 1 To 3
    x = Sheets("Feuil1").Range("A" & t).Value
    Sheets("Feuil2").Range(cellule(t)).Value = x
Next t



Bon, donc la base...
Si tu veux mieux comprendre, je te conseille de lire qlq cours d'initiation à la programmation en VB...

Amicalement,
Us.
0
Rejoignez-nous