Rechercher : dans
Par :

Excel Déplacement d'une feuille et des macros

Dernière réponse le 9 oct 2007 à 13:22:21 ppil, le 1 oct 2007 à 15:12:05 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Excel Déplacement d'une feuille et des macros » dans :
[Excel] Chemin et nom de stockage de feuille de calcul VoirIndiquer automatiquement le chemin d'accès (path) et le nom de stockage de toute feuille de calcul Noter dans une cellule (A& par exemple) la formule : =cellule("nomfichier";A1) A chaque sauvegarde et/ou déplacement de fichier dans votre...
Télécharger MOREFUNC (Macro complémentaire EXCEL) VoirMorefunc est une macro complémentaire proposant 67 nouvelles fonctions de feuille de calcul pour Excel. Ces fonctions sont compatibles avec Excel 95 à 2007. Elles ne sont pas portables sur d'autres plate-formes que Windows, ni sur d'autres...
Exécuter une macro VoirExécuter une macro Excel et Calc proposent plusieurs façons d’exécuter une macro : en la sélectionnant dans une liste, dans la boîte de dialogue Macro ; par un raccourci clavier ; en l’attachant à un bouton de la barre d’outils ; ...

1

eriiic, le 1 oct 2007 à 18:51:38

Bonjour,

Pas de réponse à ta question mais pourquoi ne traites-tu pas ton pb autrement ?
Supprimer les autres feuilles et enregistrer sous...
eric

Répondre à eriiic

2

ppil, le 2 oct 2007 à 08:09:51

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

Répondre à ppil

3

eriiic, le 2 oct 2007 à 12:14:22

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

Répondre à eriiic

4

ppil, le 4 oct 2007 à 14:53:19

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

Répondre à ppil

5

Lupin.A, le 4 oct 2007 à 17:06:40

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.

http://www.excel-downloads.com/...
( reperer VisioXla )

Lupin

Répondre à Lupin.A

6

eriiic, le 4 oct 2007 à 19:50:53

Bonsoir,

http://support.microsoft.com/kb/245801/appliesto

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

Répondre à eriiic

7

ppil, le 8 oct 2007 à 13:14:35

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

Répondre à ppil

8

Lupin.A, le 8 oct 2007 à 14:15:00

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

Répondre à Lupin.A

9

 ppil, le 9 oct 2007 à 13:22:21

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

Répondre à ppil