Création de macro avec un macro

Bonjour le forum,

Je voulais savoir si il était possible de créer un macro a partir d'un autre macro. Je connais les lignes du macro qui sera crée a partir de l'autre , il y a juste quelques lignes qui changeront ( pour les modification je vais prendre en référence des cases que j'aurais écris moi même sur une feuille excel )

Est ce que c'est possible , si oui comment faire ?

N’hésitez pas a me dire si j'ai pas été claire ^^

Merci d'avance

Cordialement

Laurene

Bonjour,

Il existe une manière pour une macro de rédiger une macro ...

Cela dit, je ne connais pas ton degré de familairité avec Excel ...

Avant de te lancer sur cette piste, mieux vaut avoir clairement expliqué ton objectif ... car il existe peut-être une solution plus simple ...

pour le problème que tu veux résoudre ....

Bonjour James ,

Mon niveau en macro est relativement faible.

Je dois créer un fichier permettant de gérer des données. Dans mon fichier , j'importe des fichiers et pour importer j'ai un macro pour chaque fichier. ( les macros se ressemblent à 95% )

Le problème c'est que mes macros sont lourdes et des personnes ne savant pas utiliser les macros doivent savoir utiliser mon fichier excel. Si une autre personne veut importer un nouveaux fichier il doit créer une macro , echanger des mots dans des lignes ect... et le risque d'erreurs est assez élevé je pense.

Donc je voudrais une macro ( que l'on va appeler M1 ) qui créer une autre macro (M2)

Donc je voudrais que M1 créer une macro M2 avec ca comme code :

Sub  [u][color=#FF00BF]Recherche[/color][/u] 

'enlever les messages
Application.DisplayAlerts = False

'augmenter la rapidité du programme
Application.ScreenUpdating = False

'supprimer les lignes de bases
Columns("A:BZ").Select
Selection.ClearContents

'Importation du documents
Dim wb1 As Workbook, wb2 As Workbook
Set wb1 = ActiveWorkbook

TheFile = Application.GetOpenFilename("Classeurs Excel(*.*),*.*")
Set wb2 = Workbooks.Open(TheFile)

derlig2 = Workbooks(wb2.Name).Sheets("registre").Range("A15536").End(xlUp).Row
derlig1 = Workbooks(wb1.Name).Sheets("[u]DEM HADE[/u]").Range("A15536").End(xlUp).Row
Workbooks(wb2.Name).Sheets("registre ").Range(Cells(1, 1), Cells(derlig2, [u]54[/u])).Copy
Workbooks(wb1.Name).Sheets("[u]DEM [/u]").Cells(derlig1 + 0, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Workbooks(wb1.Name).Sheets("[u]DEM HADE[/u]").Cells(derlig1 + 0, 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone _
        , SkipBlanks:=False, Transpose:=False
        wb1.Worksheets("version").Range("A10") = wb2.Name
Workbooks(wb2.Name).Close
Workbooks(wb1.Name).Activate

'transformation du tableau
Dim maplage As Range
Set maplage = Range("A1").CurrentRegion
ActiveWorkbook.Names.Add Name:="Tableau100", RefersTo:=maplage
ActiveSheet.ListObjects.Add(xlSrcRange, Range("Tableau100"), , xlYes).Name = _
        " [color=#FF4080]Tableau13[/color] "
Range("Tableau13[#All]").Select
ActiveSheet.ListObjects(T"ableau13").TableStyle = "TableStyleLight2"

'Verification des cellules

'
        With Sheets("[u]DEM HADE[/u]")
            For i = 1 To 54
                If Sheets("Regroupement ARO").Cells(1, i) <> .Cells(1, i) Then
                MsgBox "cellule " & Cells(1, i).Address & " différente"
                .Cells(1, i).Font.Underline = xlUnderlineStyleSingle
                .Cells(1, i).Font.ColorIndex = 3
                .Cells(1, i).Font.Bold = True
                .Cells(1, i).Interior.Color = vbYellow
                End If
            Next i
        End With

' masque de certaines colonne
Columns("W:AJ").Select
    Selection.EntireColumn.Hidden = True

'Augmenter la rapidité
Selection.EntireColumn.Hidden = True

'enlever les messages
Application.DisplayAlerts = True

'Rajout du bouton pour facilité l'accés au programme
    ActiveSheet.Buttons.Add(10.5, 3, 388.5, 26.25).Select
    Selection.OnAction = "[u]Recherche[/u]"
    Selection.Characters.Text = "[u]Recherche[/u] "
    With Selection.Characters(Start:=1, Length:=34).Font
        .Name = "Calibri"
        .FontStyle = "Normal"
        .Size = 12
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone

End Sub

et que des lignes soient changées automatiquement comme la première ou le nom du Macro M2 doit prendre la valeur d'une case du fichier excel.

Je pense que c'est la solution la plus envisageable pour ce problème.

Re,

Merci pour ton explication ...

Sans avoir creusé dans ta macro ... je comprends que tu veux la rendre générique ...

A priori cela doit être possible ... sans passer par le chemin ardu que tu envisageais ...

Dès que j'ai un moment, je creuserai pour comprendre ta macro ...

Ok super , merci de me consacrer de ton temps

Re,

A la première lecture ... tu n'as que quelques cinq Feuilles définies en variables ...

Sheets("registre")

Sheets("DEM HADE")

Sheets("DEM")

Sheets("version")

Sheets("registre")

Est-ce-que tu dois considérer ces onglets comme des variables ... ou ces feuilles sont-elles communes aux différents fichiers ...???

J'ai pas mis en évidence toute les variables , il y en a un peu plus. Une seule sera nécessaire a faire , le reste je pourrai le faire moi même si j'ai un exemple ( je pense )

Les variables sont toutes différentes pour chaque onglets et donc différentes pour chaque macro.

Et le nom de chaque onglets est différent pour chaque fichier.

Je sais pas si j'ai répondu a ta question , je ne l'ai pas trop comprise.

Re,

Je comprends que les noms donnés aux onglets sont différents de fichier en fichier ...

Mais pourrais-tu t'appuyer alors sur leur séquence dans le fichier ...par exemple l'onglet "registre" est la première Feuille du fichier ... et dans un autre fichier, il porte un autre nom ... mais cet onglet reste la première Feuille du fichier ...??? (c.-à-d. CodeName)

Ah oui ce que je n'ai pas préciser c'est que l'exemple que j'ai mis c'est un des macros me permettant d'importer un des fichiers déja existant ^^

Donc dans l'exemple , registre est le nom de l'onglet d'origine qui est le deuxième de la feuille. Le nom de l'onglet sur le fichier final pour ce fichier est DEM HADE et il est le sixieme onglet

Apres mon programme pour importer marche peut importe l'ordre des onglets , il se base sur le nom des fichier. Pour le nom du fichier d'origine je l'ouvre manuellement , donc pas besoin de nom de fichier.

Pour les variables je comptais faire un onglet avec le nom/valeurs des variables a indiquer pour la création du fichier.

Par exemple en case A1 on devra mettre le nom de l'onglet d'origine.

en A2 le nom de l'onglet final ect...

Re,

La solution d'une liste est également une possibilité ... si tu n'utilises pas le CodeName ...c'est-à-dire Feuil1, Feuil2, etc ...

Entretemps, j'ai quelque peu nettoyé ton code initial ...

Option Explicit

Sub Recherche()
' déclaration des variables
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim TheFile As String
Dim derlig2 As Integer
Dim derlig1 As Integer
Dim maplage As Range
Dim i As Integer

' enlever les messages
Application.DisplayAlerts = False

' augmenter la rapidité du programme (en ne rafraichissant pas l'écran)
Application.ScreenUpdating = False

' déclarer le fichier actuel
Set wb1 = ActiveWorkbook

' supprimer les lignes de bases
wb1.ActiveSheet.Columns("A:BZ").ClearContents

' déterminer la dernière ligne de la feuille DEM HADE
derlig1 = wb1.Sheets("DEM HADE").Range("A15536").End(xlUp).Row

' Ouverture du second Fichier
TheFile = Application.GetOpenFilename("Classeurs Excel(*.xlsx),*.xlsx")
Set wb2 = Workbooks.Open(TheFile)

' déterminer la dernière ligne de la feuille registre
derlig2 = wb2.Sheets("registre").Range("A15536").End(xlUp).Row

' copier 1 fois les Valeurs  et 1 fois les Formats
' depuis la source wb2 (onglet registre) vers les onglets DEM et DEM HADE
wb2.Sheets("registre").Range(Cells(1, 1), Cells(derlig2, "text-decoration")).Copy
' Valeurs
wb1.Sheets("DEM").Cells(derlig1 + 0, 1).PasteSpecial Paste:=xlPasteValues
' Formats
wb1.Sheets("DEM HADE").Cells(derlig1 + 0, 1).PasteSpecial Paste:=xlPasteFormats

wb1.Sheets("version").Range("A10") = wb2.Name
wb2.Close

' Toute la suite pourrait être une macro "cosmétique" ......

' Transformation - mise en forme du tableau
Set maplage = Range("A1").CurrentRegion
ActiveWorkbook.Names.Add Name:="Tableau100", RefersTo:=maplage
ActiveSheet.ListObjects.Add(xlSrcRange, Range("Tableau100"), , xlYes).Name = "Tableau13"
Range("Tableau13[#All]").TableStyle = "TableStyleLight2"

'Verification des cellules
       With Sheets("DEM HADE")
            For i = 1 To 54
                If Sheets("Regroupement ARO").Cells(1, i) <> .Cells(1, i) Then
                MsgBox "cellule " & Cells(1, i).Address & " différente"
                .Cells(1, i).Font.Underline = xlUnderlineStyleSingle
                .Cells(1, i).Font.ColorIndex = 3
                .Cells(1, i).Font.Bold = True
                .Cells(1, i).Interior.Color = vbYellow
                End If
            Next i
        End With

' Masquer certaines colonnes
 Columns("W:AJ").EntireColumn.Hidden = True

' permettre le retour des messages
 Application.DisplayAlerts = True

' permettre le rafraichissement de l'écran
 Application.ScreenUpdating = True

'Rajout du bouton pour facilité l'accés au programme - pas vraiment utile ......
    ActiveSheet.Buttons.Add(10.5, 3, 388.5, 26.25).Select
    Selection.OnAction = "Recherche"
    Selection.Characters.Text = "Recherche"
    With Selection.Characters(Start:=1, Length:=34).Font
        .Name = "Calibri"
        .FontStyle = "Normal"
        .Size = 12
     End With

End Sub

Une liste serait plus simple mais demanderait plus de temps lors de l'utilisation. Car il faut importer régulièrement les fichiers pour les mettre à jour.

Après je sais pas comment utiliser le code name pour faire du vba.

Merci d'avoir nettoyé mon programme!

Re,

Après je ne sais pas comment utiliser le code name pour faire du vba

Je vais te donner un exemple pour ton onglet qui porte le nom registre ...

1. Tu peux utiliser dans ton code : Sheets("registre")

ou si tu veux permettre aux utilisateurs de modifier le nom de l'onglet, tu peux utiliser le Code Name de cet onglet ...

2. Si, par exemple, cet onglet est le premier son CodeName sera Feuil1 que tu pourras utiliser à la place de Sheets("registre")

ci-dessous, une image explicative ....

codename
Rechercher des sujets similaires à "creation macro"