Excel Déplacement d'une feuille et des macros

Résolu
ppil Messages postés 34 Statut Membre -  
ppil Messages postés 34 Statut Membre -
Bonjour,

Voilà mon problème:

J'ai déplacé une feuille Excel dans un nouveau fichier. Ceci avec ce code en VBA:

Private Sub DéplacementFeuillePlannig()
' Donne le chemin actuel
vRépertoireActuelle = ThisWorkbook.Path
' donne le nom de la feuille active actuelle
vFeuilActuelle = ActiveSheet.Name
' Déplace la feuille Actuelle active
Sheets(vFeuilActuelle).Move
' Sauvegarde le nouveau fichier
ActiveWorkbook.SaveAs Filename:=vRépertoireActuelle & "\Planning semaine\" & vFeuilActuelle
End Sub

Ce dont j'aimerai encore c'est inclure dans mon déplacement une partie des macros qui se trouve dans le répertoires MODULES du projet (VBAPROJET)NOmDuFichier.xls)) de mon fichier source.

Merci d'avance.

ppil
Configuration: Windows XP
Internet Explorer 6.0
Excel 2003

9 réponses

  1. ppil Messages postés 34 Statut Membre 13
     
    Bonjour,

    Merci à Lupin et Eric. Grace à vous deux mon problème est résolu. Voici le code final:

    Sub ExportCodeMod()
    ' Dimension variables
    Dim strCode As String
    Dim vbCom As VBComponent
    Dim modObj As Object
    Dim strCode1 As String
    Dim vbCom1 As VBComponent
    Dim modObj1 As Object
    Dim iNumFeuil As Integer
    '
    ' Copie des macros de la feuille 6
    '
    ' Set object to the module you want to export.
    Set modObj1 = _
    Application.VBE.ActiveVBProject.VBComponents.Item("Feuil6")
    ' Place code in a string.
    strCode1 = modObj1.CodeModule.Lines(1, modObj1.CodeModule.CountOfLines)
    '
    ' Copie des macros du module 3
    '
    ' Set object to the module you want to export.
    Set modObj = _
    Application.VBE.ActiveVBProject.VBComponents.Item("Module3")
    ' Place code in a string.
    strCode = modObj.CodeModule.Lines(1, modObj.CodeModule.CountOfLines)
    '
    ' Déplace la feuille active
    '
    ' Donne le chemin actuel
    vRépertoireActuelle = ThisWorkbook.Path
    ' Donne le nom de la feuille active actuelle
    vFeuilActuelle = ActiveSheet.Name
    ' Déplace la feuille Actuelle active
    Sheets(vFeuilActuelle).Move
    ' Add code to sheet(2) from string variable.
    ' Cherche le numéro de la feuille
    For i = 1 To 2
    If Left(ActiveWorkbook.VBProject.VBComponents(i).Name, 5) = "Feuil" Then
    iNumFeuil = i
    End If
    Next i
    ' Add code to "FeuilX" from string variable.
    Application.VBE.ActiveVBProject.VBComponents(1) _
    .CodeModule.AddFromString (strCode1)
    ' Create a new module in workbook.
    Application.VBE.ActiveVBProject.VBComponents.Add (vbext_ct_StdModule)
    ' Add code to new module from string variable.
    Application.VBE.ActiveVBProject.VBComponents.Item("Module1") _
    .CodeModule.AddFromString (strCode)
    ' Sauvegarde le nouveau fichier
    ActiveWorkbook.SaveAs Filename:=vRépertoireActuelle & "\Planning semaine\" & vFeuilActuelle
    End Sub

    Il n'est pas forcèment optimal, mais il marche très bien.

    ppil
    1
  2. Utilisateur anonyme
     
    Bonjour,

    Voici donc quelques observations et quelques variantes :-)

    Sub ExportCodeMod()
    
        ' Dimension variables
        Dim strCode As String, vbCom As VBComponent
        Dim modObj As Object, modObj1 As Object
        Dim vbCom1 As VBComponent, iNumFeuil As Integer
        Dim CheminFichier As String
     
        ' Copie des macros de la feuille 6
        With Application.VBE.ActiveVBProject
        ' Sélectionner l'objet (le module) que vous vouler exporter.
            Set modObj1 = .VBComponents.Item("Feuil6")
            ' Place le code dans une variable "string" (chaîne).
            strCode1 = modObj1.CodeModule.Lines(1, modObj1.CodeModule.CountOfLines)
    
            ' Copie des macros du module 3
            ' Sélectionner l'objet (le module) que vous vouler exporter.
            Set modObj = .VBComponents.Item("Module3")
            ' Place le code dans une variable "string" (chaîne).
            strCode = modObj.CodeModule.Lines(1, modObj.CodeModule.CountOfLines)
        End With
        
        ' Donne le chemin actuel
        vRépertoireActuelle = ThisWorkbook.Path
        ' Donne le nom de la feuille active actuelle
        vFeuilActuelle = ActiveSheet.Name
        ' Déplace la feuille Actuelle active
        Sheets(vFeuilActuelle).Move
        
        ' Cherche le numéro de la feuille
        For i = 1 To 2
            If Left(ActiveWorkbook.VBProject.VBComponents(i).Name, 5) = "Feuil" Then
                iNumFeuil = i
            End If
        Next i
        
        With Application.VBE.ActiveVBProject
            ' Ajoute le code à la "FeuilX" en provenance de la variable.
            .VBComponents(1).CodeModule.AddFromString (strCode1)
            ' Création d'un nouveau module VBA dans le classeur actif.
            .VBComponents.Add (vbext_ct_StdModule)
            ' Add code to new module from string variable.
            .VBComponents.Item("Module1").CodeModule.AddFromString (strCode)
        End With
    
        ' Sauvegarde le nouveau fichier
        CheminFichier = vRépertoireActuelle & "\Planning semaine\" & vFeuilActuelle
        ActiveWorkbook.SaveAs Filename:=CheminFichier
    
    End Sub
    '
    


    je ne comprends pas la suite d'instruction :

    Sheets(vFeuilActuelle).Move 
    ' Add code to sheet(2) from string variable. 
    ' Cherche le numéro de la feuille 
    For i = 1 To 2 
    


    il me semble qu'il manque des paramètres à l'instruction [Move].

    genre : [ Sheets("Feuil1").Move After:=Sheets(2) ]

    Cordialement

    Lupin
    1
  3. ppil Messages postés 34 Statut Membre 13
     
    Lupin,

    Non, l'instruction que j'ai mis suffis.

    Le paramètre [ Sheets("Feuil1").Move After:=Sheets(2) ] ne fonctionnerai pas. Du fait que je n'ai qu'une seule feuille (sheet) dans mon nouveau fichier (classeur).

    Donc parfois la simplicité marche aussi.

    Amitié

    ppil
    1
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Bonjour,

    Pas de réponse à ta question mais pourquoi ne traites-tu pas ton pb autrement ?
    Supprimer les autres feuilles et enregistrer sous...
    eric
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ppil Messages postés 34 Statut Membre 13
     
    Bonjour Eric,

    Oui, merci, mais...

    J'y avais déjà penser, mais le problème est que l'on perd toute les modifs du fichier source. Alors il faut d'abord enregistrer la source puis Supprimer les autres feuilles et enregistrer sous... Mais cela prends un temps fou. Et mon but premier est de racourcir les temps de traitements, notre réseau est lent, voir très lent par moment.

    Il faut plus de 2 minutes pour sauvegarder le fichier source.

    Donc je cherche à l'allèger

    Et je ne voulais pas copier toutes les (nombreuses) macros du fichier.

    Je suis peut-être un peu exigeant, mais je trouve étrange de ne pas pouvoir le faire...

    ppil
    0
  7. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    Sûrement que ça existe mais je suis comme toi, je n'ai jamais rencontré de fonctions/methodes pour gérer les modules, désolé.
    Pour gagner un peu de temps en attendant il y a la solution de travailler sur une copie locale et d'envoyer en dernier une fois toutes les modifs faites.
    eric
    0
  8. ppil Messages postés 34 Statut Membre 13
     
    Merci Eric,

    Travailler en local n'est pas non plus possible. C'est un fichier commun. Différents utilisateurs viennent durant la journée, nourrir le fichier.

    J'ai trouvé une demie solution. J'ai mis les macros concernées au niveau de la feuille que je déplace. Cela marche très bien. Les macros suivent la copie. Mais...

    Le problème que j'ai avec cette solution, est que je ne sais pas comment, en VBA, affecté une macro à un bouton. C'est-à-dire que la macro est liés à la feuille, donc mon code initial suivant n'est pas suffisant:

    Selection.OnAction = "RemarquesLundi"

    "RemarquesLundi" étant le nom de ma macro

    Le code dans ce cas devrait être :

    Selection.OnAction = "Feuil8!RemarquesLundi"

    Malheureusement je ne connais pas le numéro de la feuille, 8 dans mon exemple, car il peut varier d'une fois à l'autre.

    Est-ce que quelqu'un à une solution?

    ppil
    0
  9. Utilisateur anonyme
     
    Bonjour,

    Vous trouverez tout le code VBA nécessaire à manipuler les objets VBA ainsi que les objets Excel dans
    le classeur [ VisioXLA ] publié sur Excel-Download.

    Vous trouverez une routine qui lit les modules. De plus il y a un menu attaché au classeur Excel, ce menu
    est généré de façon automatique à l'ouverture et supprimer à la fermeture du classeur.

    https://www.excel-downloads.com/resources/categories/utilitaires.18/
    ( reperer VisioXla )

    Lupin
    0
  10. eriiic
     
    Bonsoir,

    https://support.microsoft.com/en-us/help/245801/

    Résumé
    Vous souhaitez peut-être insérer le code VBA stocké par programme dans un nouveau classeur que vous créez avec la méthode Workbooks.Add. Cela peut être nécessaire si vous créez par programme les nouveau classeur dans lesquels vous souhaitez que place des données et macro.

    Cet article décrit les méthodes automatisées que vous pouvez utiliser pour que prendre le code VBA stocké dans un module dans un autre classeur ouvert, une plage nommée d'un calcul ou un fichier texte et pouvez l'insérer dans un nouveau classeur vide

    (traduction microsoft ;-) )

    Tu y trouveras des choses pouvant t'interesser...
    eric
    0