Excel Déplacement d'une feuille et des macros

Résolu/Fermé
ppil Messages postés 33 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 8 octobre 2009 - 1 oct. 2007 à 15:12
ppil Messages postés 33 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 8 octobre 2009 - 9 oct. 2007 à 13:22
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
A voir également:

9 réponses

ppil Messages postés 33 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 8 octobre 2009 13
8 oct. 2007 à 13:14
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
Utilisateur anonyme
8 oct. 2007 à 14:15
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
ppil Messages postés 33 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 8 octobre 2009 13
9 oct. 2007 à 13:22
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
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
1 oct. 2007 à 18:51
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ppil Messages postés 33 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 8 octobre 2009 13
2 oct. 2007 à 08:09
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
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
2 oct. 2007 à 12:14
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
ppil Messages postés 33 Date d'inscription lundi 1 octobre 2007 Statut Membre Dernière intervention 8 octobre 2009 13
4 oct. 2007 à 14:53
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
Utilisateur anonyme
4 oct. 2007 à 17:06
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
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