OVH Cloud OVH Cloud

pb macro

5 réponses
Avatar
reno
Bonjour tout le monde,


a l ouverture de mon fichier excel, une msg box demande a
l utilisateur s il veut la version standard ou la version
elaboree de la feuille excel.
s il veut lka version elaboree, une macro ajoute des
instructions a une autre macro.

lorsque l on ferme le fichier, excel demande si lon veut
sauver les modifications. si je reponds oui, la version
elaboree est enregistree. si je reeouvre excel et que je
redemande la version elaboree j obtient les instructions
supplementaires de la macro en double, puis en triple....

est il possible d inserer une macro a la fermeture d excel
qui effacerait le code qui a ete rajoute?

j espere que c est assez clair

merci

5 réponses

Avatar
Vincent.
C'est possible... tu trouveras ce que tu cherches dans
l'aide VBA en cherchant le mot clé VBComponents.

-----Message d'origine-----
Bonjour tout le monde,


a l ouverture de mon fichier excel, une msg box demande
a

l utilisateur s il veut la version standard ou la version
elaboree de la feuille excel.
s il veut lka version elaboree, une macro ajoute des
instructions a une autre macro.

lorsque l on ferme le fichier, excel demande si lon veut
sauver les modifications. si je reponds oui, la version
elaboree est enregistree. si je reeouvre excel et que je
redemande la version elaboree j obtient les instructions
supplementaires de la macro en double, puis en triple....

est il possible d inserer une macro a la fermeture d
excel

qui effacerait le code qui a ete rajoute?

j espere que c est assez clair

merci
.



Avatar
Vincent.
Je n'ai pas testé mais il faudrait adapter le code
suivant :

Application.VBE.CodePanes("Nom du module"). _
CodeModule.DeleteLines(LigneDépart, LigneFin)

Si ta macro crée un module, LigneDépart = 1,
et : LigneFin = Application.VBE. _
CodePanes("Nom du module"). _
CodeModule.CountOfLines

Si ta macro crée une procédure, il faudra que tu utilises
la méthode 'ProcBodyLine'...
Cela dit, je n'ai jamais utilisé ces méthodes, donc je ne
peux pas te fournir d'aide bcp plus précise !

Bon courage...
Avatar
reno
Ok, merci. je pnse que la premier version suffira
amplement (pas de creation de modules)
cependant que dois je faire (ou placer ce code ou quelle
macro creer) pour que vbe.codepanes s executes quand je
ferme la feuille excel?




-----Message d'origine-----
Je n'ai pas testé mais il faudrait adapter le code
suivant :

Application.VBE.CodePanes("Nom du module"). _
CodeModule.DeleteLines(LigneDépart, LigneFin)

Si ta macro crée un module, LigneDépart = 1,
et : LigneFin = Application.VBE. _
CodePanes("Nom du module"). _
CodeModule.CountOfLines

Si ta macro crée une procédure, il faudra que tu utilises
la méthode 'ProcBodyLine'...
Cela dit, je n'ai jamais utilisé ces méthodes, donc je ne
peux pas te fournir d'aide bcp plus précise !

Bon courage...
.



Avatar
Vincent.
Dans le code de l'objet 'Thisworkbook' (au-dessus des
modules), en sélectionnant dans la liste déroulante qui
affiche par défaut '(Général)', tu sélectionnes 'Workbook'
puis dans le menu déroulant juste à droite de 'Workbook',
tu choisis BeforeClose comme événement.
Ca te crée un début de code dans lequel il te reste à
insérer le reste du code (ça m'intéresse de savoir si ça
marche bien ton histoire de suppresion de code !)

-----Message d'origine-----
Ok, merci. je pnse que la premier version suffira
amplement (pas de creation de modules)
cependant que dois je faire (ou placer ce code ou quelle
macro creer) pour que vbe.codepanes s executes quand je
ferme la feuille excel?




-----Message d'origine-----
Je n'ai pas testé mais il faudrait adapter le code
suivant :

Application.VBE.CodePanes("Nom du module"). _
CodeModule.DeleteLines(LigneDépart, LigneFin)

Si ta macro crée un module, LigneDépart = 1,
et : LigneFin = Application.VBE. _
CodePanes("Nom du module"). _
CodeModule.CountOfLines

Si ta macro crée une procédure, il faudra que tu
utilises


la méthode 'ProcBodyLine'...
Cela dit, je n'ai jamais utilisé ces méthodes, donc je
ne


peux pas te fournir d'aide bcp plus précise !

Bon courage...
.

.





Avatar
Hervé
Salut Reno,
Si j'ai bien compris, tu voudrais supprimer certaines lignes qui ont été
ajouter par "InsertLines". Une idée, Dans la proc qui insère tes lignes,
ajoute un mot qui va te servir de repère. Il ne te suffiras plus qu'à le
rechercher et supprimer le nombres de lignes que tu insère (tu doit le
connaître !). Un exemple pour tester, exécute la proc "InsertMacro" puis
"SupprimeCode".
Si tu veux que ta macro s'exécute à la fermeture, à mettre dans le module
du ThisWorkbook :
Private Sub Workbook_BeforeClose(Cancel As Boolean)
SupprimeCode
End Sub

A mettre dans un module standard :
Sub SupprimeCode()


Dim Module As Object
Dim I As Integer
Dim Pos As Integer
Dim Proc As String
Dim Repere As String
Dim NomMod As String

'Nom de la proc
Proc = "MaMacro"
'nom du module
NomMod = "MonModule"

'repère inséré juste avant les lignes de code
'ajouter à la macro par "InsertLines" et qui
'va servir de point de départ pour la
'suppression des lignes
Repere = "'Repere" 'repère mis en commantaire

Set Module = ThisWorkbook.VBProject _
.VBComponents(NomMod)

With Module.CodeModule
For I = .ProcStartLine(Proc, 0) To .CountOfLines
Pos = InStr(.Lines(I, 1), Repere)
If Pos <> 0 Then
'5 lignes supprimées
.DeleteLines I, 5
Exit For
End If
Next I
End With

Set Module = Nothing
End Sub

Private Sub InsertMacro()
Dim Module As Object
Dim I As Integer
Dim Lgn As String

Lgn = "Private Sub MaMacro()" & vbCrLf
Lgn = Lgn & "'Ligne 1" & vbCrLf
Lgn = Lgn & "'Ligne 2" & vbCrLf
Lgn = Lgn & "'Ligne 3" & vbCrLf
Lgn = Lgn & "'à partir de la ligne ci-dessous" & vbCrLf
Lgn = Lgn & "'5 lignes vont être supprimées" & vbCrLf
Lgn = Lgn & "'car le mot pour indiquer le début" & vbCrLf
Lgn = Lgn & "'de la plage s'y trouve" & vbCrLf
Lgn = Lgn & "'Repere" & vbCrLf
Lgn = Lgn & "'2ème ligne supprimée !" & vbCrLf
Lgn = Lgn & "'3ème ligne supprimée !" & vbCrLf
Lgn = Lgn & "'4ème ligne supprimée !" & vbCrLf
Lgn = Lgn & "'5ème ligne supprimée !" & vbCrLf
Lgn = Lgn & "'Ligne 4" & vbCrLf
Lgn = Lgn & "End Sub"

Set Module = ThisWorkbook.VBProject _
.VBComponents("MonModule")
With Module.CodeModule
.InsertLines .CountOfLines + 1, Lgn
End With
Set Module = Nothing
End Sub

Hervé.

"reno" a écrit dans le message news:
077801c35d96$be70b1c0$
Bonjour tout le monde,


a l ouverture de mon fichier excel, une msg box demande a
l utilisateur s il veut la version standard ou la version
elaboree de la feuille excel.
s il veut lka version elaboree, une macro ajoute des
instructions a une autre macro.

lorsque l on ferme le fichier, excel demande si lon veut
sauver les modifications. si je reponds oui, la version
elaboree est enregistree. si je reeouvre excel et que je
redemande la version elaboree j obtient les instructions
supplementaires de la macro en double, puis en triple....

est il possible d inserer une macro a la fermeture d excel
qui effacerait le code qui a ete rajoute?

j espere que c est assez clair

merci