Copie d’un classeur : Supprimer seulement une des deux macros
Re,
Une proposition à étudier.
Cdlt.
Option Explicit
Option Private Module
'Necessite la référence : Microsoft Visual Basic for Applications Extensibility 5.3
Public Sub Creer_copie()
Dim ClasseurSource As Workbook
Dim VBProj As VBIDE.VBProject, VBComp As VBIDE.VBComponent, CodeMod As VBIDE.CodeModule
Dim Feuille As Worksheet
Dim Chemin As String, Fichier As String, Procedure As String
Dim StartLine As Long, NumLines As Long
Set ClasseurSource = ThisWorkbook
Set Feuille = ClasseurSource.Worksheets("Feuil1")
Chemin = ClasseurSource.Path & Application.PathSeparator
Fichier = "Copie - " & Feuille.Cells(2).Value & ".xlsm"
Feuille.Copy
With ActiveWorkbook
.SaveAs Filename:=Chemin & Fichier, FileFormat:=52
Set VBProj = Application.Workbooks(Fichier).VBProject
Set VBComp = VBProj.VBComponents("Feuil1")
Set CodeMod = VBComp.CodeModule
Procedure = "Worksheet_SelectionChange"
With CodeMod
StartLine = .ProcStartLine(Procedure, vbext_pk_Proc)
NumLines = .ProcCountLines(Procedure, vbext_pk_Proc)
.DeleteLines StartLine:=StartLine, Count:=NumLines
End With
.Save
End With
Feuille.Cells(2).Value = Feuille.Cells(2).Value + 1
End Sub@Yvouille
appuie sur la touche Windows et maintiens-là enfoncée, puis appuie sur la touche r : Windows r (run) ➯ fenêtre Exécuter ; tape cmd et clique sur le bouton OK ➯ fenêtre d'invite de commande, où tu peux taper des commandes DOS ; tu as la commande cd pour changer de répertoire (= dossier) ; va dans le répertoire où tu as mis ton fichier, puis tape la commande dir (= directory) : ça liste le contenu du répertoire, et parmi les fichiers, tu verras le nom exact du fichier : "Fichier 3.xlsm" ou "Fichier 3.xlsm.xlsm"
exemple :
pour aller dans ton dossier "Mes documents" : cd C:\Users\Yvouille\Documents
puis pour aller dans un sous-dossier "Compta" : cd Compta
si tu as besoin de retourner au répertoire précédent : cd..
cd = change directory ; d'ailleurs, tu peux aussi taper chdir au lieu de cd (c'est idem)
après avoir tapé une commande DOS, il faut appuyer sur la touche Entrée pour l'exécuter.
dhany
@ Jean-Eric,
Merci pour ta solution, mais celle-ci se réfère à mon premier fichier exemple, celui à partir duquel la copie se fait directement.
Puis j’ai expliqué que ma configuration est plus compliquée que cela et que je crée en réalité un Fichier 3 et un Fichier 4 depuis le Fichier 1 et par l’intermédiaire du Fichier 2.
C’est justement le fait que ce n’est pas ThisWorkbook qui est ouvert au moment où l’on veut supprimer la macro, mais la copie, soit ce nouveau Fichier 3 qui crée problème.
@ dhany
Il me semble que j’ai atteins la fenêtre d’invite de commande, mais après que je me sois trompé une ou deux fois de nom, le chemin inscrit semble trouvé, mais si je tape OK, ça me duplifie simplement la dernière ligne.
D’un autre côté, je me dit que dans l’explorateur, mon fichier s’appellerait Fichier 3.xlsm.xlsm, s’il y avait un problème, non ?
Re,
Un nouvel essai.
Ne pas oublier la référence à Microsoft Visual Basic for Applications Extensibilty 5.3.
Sub SupprimerMacroPrecise(Wb As Workbook, Mdl As String, NomMacro As String)
Dim VBProj As VBIDE.VBProject, VBComp As VBIDE.VBComponent, CodeMod As CodeModule
Dim startLine As Long, numLines As Long
Set VBProj = Application.Workbooks(Wb.Name).VBProject
Set VBComp = VBProj.VBComponents(Wb.Worksheets(Mdl).CodeName)
Set CodeMod = VBComp.CodeModule
With CodeMod
startLine = .ProcStartLine(NomMacro, vbext_pk_Proc)
numLines = .ProcCountLines(NomMacro, vbext_pk_Proc)
.DeleteLines startLine:=startLine, Count:=numLines
End With
End Sub@Yvouille
* oui, tu as bien trouvé la fenêtre d'invite de commande
* tu peux taper les commandes juste à droite du signe > : le 1er espace est inutile ; exemple :
C:\Users\lacy>cd Documents\Yves\Excel_Y\"Forum - Provisoire"
ou
C:\Users\lacy>cd "Documents\Yves\Excel_Y\Forum - Provisoire"
* ce qui est en rouge indique le répertoire actuel, donc après avoir appuyé sur Entrée, ça exécute la commande pour aller dans le répertoire indiqué, qui devient le nouveau répertoire en cours : C:\Users\lacy\Documents\Yves\Excel_Y\Forum - Provisoire>
et là, ça attend ta prochaine commande ; si tu tapes rien et que tu fais Entrée, ça exécute aucune commande, ça va à la ligne en affichant de nouveau le répertoire en cours (en fait, ce qui est en rouge est le prompt = message d'invite : « j'suis prêt pour exécuter la prochaine commande que tu vas taper »).
en fait, le prompt est paramétrable, et celui par défaut est : prompt $p$g
* j'ai pas compris pourquoi tu as écrit « si je tape OK » ; faut pas taper OK mais juste appuyer sur la touche Entrée
* en tout cas, t'es arrivé dans le bon répertoire ; j'suppose qu'après tu as tapé la commande dir puis Entrée
➯ liste du contenu du répertoire : sous-répertoires et fichiers
de toute façon, d'après ta copie d'écran de la fenêtre d'Explorateur, les extensions de fichier ne sont pas masquées
➯ on voit les noms réels entiers, donc y'a pas de double extension : c'est OK de c'côté-là.
dhany
Bonsoir vous tous,
@ dhany
Effectivement que je ne ‘’tapais pas OK’’, mais que j’appuyais sur ‘’Enter’’. Erreur d’explication probablement due à un gros coup de fatigue hier soir
@ Jean-Eric
Wow, wow, wow ! Ca fonctionne du tonnerre ! Après avoir remplacé l’ancienne macro ‘’SupprimerMacroPrecise’’ par la tienne, ça fonctionne à merveille ; les ‘’Fichier 3’’ et ‘’Fichier 4’’ sont bien créés et la macro souhaitée est bien effacée dans le ‘’Fichier 3’’
Je replace ici mes deux fichiers de base avec ta nouvelle macro.
Malheureusement un nouveau problème est alors apparu. Dans le ‘’Fichier 3’’ nouvellement créé, il y a le bouton ‘’Vider les champs en couleur’’ - sur la feuille ‘’Liste des membres’’ - qui reste relié avec la macro ‘’Vider_les_champs ‘’ qui y était affectée mais qui ne se trouve plus dans le ‘’Fichier 3’’. Ainsi, si je clique sur ce bouton, le ‘’Fichier 4’’ - s'il est fermé - est rouvert automatiquement afin que la macro puisse être utilisée !
Sais-tu comment faire afin que la macro ‘’Vider_les_champs’’ soit placée dans un module du ‘’Fichier 3’’ et affectée au bouton ‘’Vider les champs en couleur’’ de ce classeur ?
Chaleureusement.
Bonjour,
Quelles remarques !...
Dans Fichier 1_V2.xls, j'ai dû désactiver ces lignes (objets inconnus) pour le bon fonctionnement de la procédure Liste_pour_CdC_NEW()
'ActiveSheet.Shapes.Range(Array("Bouton 129")).Delete
'ActiveSheet.Shapes.Range(Array("Rounded Rectangle 3")).Select ' Apparemment il faut passer par Select
'Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = _
"Utilisez l'astérisque : *pierr trouve : Pierre, Pierrette, Marie-Pierre, Pierrot, etc."Dans le fichier 3, nouvellement crée, je n'ai pas de bouton ’Vider les champs en couleur’’ - sur la feuille ‘’Liste des membres’’.
Sinon, pourquoi ne pas cette procédure (Vider les champs) dans le module de la feuille Liste des membres du classeur 2 !?
A te relire.
Cdlt.
Salut Jean-Eric,
Merci pour ton message.
A la lecture de ce que tu m’indiques au sujet des lignes que tu as dû effacer, j’ai téléchargé les fichiers que j’avais placé dans mon dernier message à nouveau dans mon arborescence et ai relancé mes macros. Etrangement tout fonctionne sans problème chez moi.
Si j’ai bien deux boutons est un texte plus complet dans le rectangle de la feuille ‘’Liste des membres’’ du ‘’Fichier 2’’, il ne reste plus qu’un seul bouton et un texte raccourci dans le rectangle sur la même feuille du ‘’Fichier 3’’ nouvellement créé (voir les deux images ci-dessous : avant/après).
Bon, je ne m’explique pas que mes cellules en brun deviennent en vert, mais ça ne me dérange pas.
Puis j’ai tenté ta proposition de déplacer la macro dans le code de la feuille et – après avoir encore modifié le code afin d’affecter la macro du bon fichier au bouton qui reste en place dans le ‘’Fichier 3’’, sinon la macro qui est affectée à ce bouton se trouve dans un autre fichier – ça fonctionne également parfaitement. En tout cas pour l’instant
ActiveSheet.Shapes.Range(Array("Bouton 98")).Select
Selection.OnAction = "'Fichier 3.xlsm'!Feuil2.Vider_les_champs"Je vais encore devoir appliquer tout ça à mes fichiers réels et espérer que je n’ai pas de nouvelles mauvaises surprises.
Pour l’instant je te redis un tout grand merci pour ton aide.
A la prochaine.
Bonjour,
Lors de mon dernier message, j'avais souhaité ne pas tomber sur une nouvelle mauvaise surprise et ça n'a pas manqué
J'ai entre-temps changé d'ordinateur et mon code ne fonctionne plus sur ma nouvelle machine.
Ca bloque nouvellement sur le passage ci-dessous :
Je me demande alors si je ne dois pas activer une autre référence que Microsoft Visual Basic for Applications Extensibilty 5.3, autre référence que j’aurais activée sur mon ancien PC et pas sur le nouveau ??
Pour rappel ; je place les deux fichiers ci-joints dans le même dossier, j’ouvre le Fichier 1 et je lance la macro par le bouton ‘’Liste CdC’’.
Cette macro ouvre le Fichier 2, crée un nouveau Fichier 3 sur la base d’une feuille du Fichier 2 et c’est à ce moment que ça bloque.
Si ma macro allait au bout de son travail, ça devrait encore créer un nouveau Ficher 4.
Bonjour,
Je te retourne le fichier xls, avec les parties relatives aux boutons inhibées !...
A priori, le déroulement est correct et je ne constate pas d'erreurs à l'exécution de la procédure Liste_pour_CdC_NEW().
Cdlt.
Salut Jean-Eric,
Je constate que tu as supprimé des passages qui me semblent essentiels et je n'arrive pas à voir si tu les as remplacés ailleurs.
Toutefois, ton nouveau code bloque chez moi exactement au même endroit que la version que j'ai fournie tout-à-l'heure !! Il m'est donc impossible de voir l'effet de tes suppressions.
As-tu encore une idée ?
Re,
J'ai dû faire la même chose que j'ai effectué le 10 décembre dernier.
Ces éléments n'existent pas dans le classeur ou sont mal nommés.
Le reste à l'air de fonctionner. Les classeurs sont crées et enregistrés et en fin de procédure le classeur actif est le classeur 4.
Que veux-tu que je dise de plus ?
Cdlt.
Salut Jean-Eric,
Merci pour ta réponse.
D'un côté, je comprends que tu ne saches pas trop que me dire de plus si ça fonctionne chez toi, d'un autre, j'espère que tu comprennes que je souhaiterais savoir pourquoi ça bloque chez moi
Mais je trouve aussi surprenant, si ça bloquait chez toi à cause des objets que tu as neutralisés, que ça bloque chez moi à un autre endroit.
Y a-t-il d'autre à une solution ?
EDIT : j'indique ce fil comme résolu et en ouvre un autre afin de voir si je reçois une autre aide. Merci a tous ceux qui ont tenté de m'aider, spécialement à Jean-Eric.
EUREKA !
Il fallait activer l’option ‘’Accès approuvé au modèle d’objet du projet VBA ‘’ sous ‘’Options/Centre de gestion de la confidentialité/Paramètre du Centre de gestion de la confidentialité/Paramètres des macros’’.