Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever la
protection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit être
fermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscrire
sauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une fois
la procédure "Workbook_Open" du classeur pour
vérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /
définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si le
nom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" a écrit dans le message de news:
eMq$G4$
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever la
protection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit être
fermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscrire
sauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une fois
la procédure "Workbook_Open" du classeur pour
vérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /
définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si le
nom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" <philippe.blancon@free.fr> a écrit dans le message de news:
eMq$G4$wEHA.1404@TK2MSFTNGP11.phx.gbl...
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever la
protection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit être
fermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscrire
sauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une fois
la procédure "Workbook_Open" du classeur pour
vérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /
définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si le
nom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" a écrit dans le message de news:
eMq$G4$
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonsoir Philou;
Sub ClearThisWorkbookCode()
If ThisWorkbook.VBProject.Protection Then Exit Sub
Dim StartLine As Long, LineCount As Long
On Error Resume Next
Application.Visible = 0
With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine("Workbook_Open", 0)
If StartLine Then
LineCount = .ProcCountLines("Workbook_Open", 0)
.DeleteLines StartLine, LineCount
End If
End With
Call VbaLock("zaza")
Application.Visible = 1
End Sub
Private Sub VbaLock(ByVal MDP$)
Set Application.VBE.ActiveVBProject = ThisWorkbook.VBProject
Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute
SendKeys "+{TAB}{RIGHT}{TAB}{+}{TAB}" & MDP & "{TAB}" & MDP & "{TAB}" &
"~"
ThisWorkbook.Save
End Sub
MP
"Philou" a écrit dans le message de
news:eMq$G4$Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
dustyle Workbook_Open()
merci pour vos infos
Bonsoir Philou;
Sub ClearThisWorkbookCode()
If ThisWorkbook.VBProject.Protection Then Exit Sub
Dim StartLine As Long, LineCount As Long
On Error Resume Next
Application.Visible = 0
With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine("Workbook_Open", 0)
If StartLine Then
LineCount = .ProcCountLines("Workbook_Open", 0)
.DeleteLines StartLine, LineCount
End If
End With
Call VbaLock("zaza")
Application.Visible = 1
End Sub
Private Sub VbaLock(ByVal MDP$)
Set Application.VBE.ActiveVBProject = ThisWorkbook.VBProject
Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute
SendKeys "+{TAB}{RIGHT}{TAB}{+}{TAB}" & MDP & "{TAB}" & MDP & "{TAB}" &
"~"
ThisWorkbook.Save
End Sub
MP
"Philou" <philippe.blancon@free.fr> a écrit dans le message de
news:eMq$G4$wEHA.1404@TK2MSFTNGP11.phx.gbl...
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonsoir Philou;
Sub ClearThisWorkbookCode()
If ThisWorkbook.VBProject.Protection Then Exit Sub
Dim StartLine As Long, LineCount As Long
On Error Resume Next
Application.Visible = 0
With ActiveWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine("Workbook_Open", 0)
If StartLine Then
LineCount = .ProcCountLines("Workbook_Open", 0)
.DeleteLines StartLine, LineCount
End If
End With
Call VbaLock("zaza")
Application.Visible = 1
End Sub
Private Sub VbaLock(ByVal MDP$)
Set Application.VBE.ActiveVBProject = ThisWorkbook.VBProject
Application.VBE.CommandBars(1).FindControl(ID:%78,
recursive:=True).Execute
SendKeys "+{TAB}{RIGHT}{TAB}{+}{TAB}" & MDP & "{TAB}" & MDP & "{TAB}" &
"~"
ThisWorkbook.Save
End Sub
MP
"Philou" a écrit dans le message de
news:eMq$G4$Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
dustyle Workbook_Open()
merci pour vos infos
Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever la
protection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit être
fermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscrire
sauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une fois
la procédure "Workbook_Open" du classeur pour
vérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /
définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si le
nom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" a écrit dans le message de news:
eMq$G4$
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever la
protection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit être
fermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscrire
sauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une fois
la procédure "Workbook_Open" du classeur pour
vérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /
définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si le
nom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" <philippe.blancon@free.fr> a écrit dans le message de news:
eMq$G4$wEHA.1404@TK2MSFTNGP11.phx.gbl...
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever la
protection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit être
fermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscrire
sauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une fois
la procédure "Workbook_Open" du classeur pour
vérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /
définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si le
nom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" a écrit dans le message de news:
eMq$G4$
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
le A ne correspondait à rien. J'ai fini par comprendre qu'il me falait le
Bonjour Philou,
Pour détruire 2 procédures dans le ThisWorkbook d'un classeur :
dans cette ligne de code :
ClearThisWorkbookCode Arr(A), LeClasseur.xls
LeClasseur.xls représente le nom du classeur où tu veux supprimer ces
procédures.
'-------------------------------
Sub DétruireProcédureEnTrop()
Dim Arr()
'Tu peux lister toutes les procédures que tu désires. Elles doivent
'être situé dans le ThisWorkbook
Arr = Array("Workbook_Open", "Workbook_BeforeClose")
For A = 0 To UBound(Arr)
ClearThisWorkbookCode Arr(A), LeClasseur.xls
Next
End Sub
'-------------------------------
'-------------------------------
Sub ClearThisWorkbookCode(ByVal NomProcédure As String, _
NomDuClasseur as string)
Dim StartLine As Long, LineCount As Long
On Error Resume Next
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine(NomProcédure, 0)
If StartLine Then
LineCount = .ProcCountLines(NomProcédure, 0)
.DeleteLines StartLine, LineCount
End If
End With
End Sub
'-------------------------------
Salutations!
"Philou" a écrit dans le message de news:
Aie ! Aie ! Aie !..... Je tourne le code dans tous les sens sans arrivé à
le
faire fonctionné :(
Je pense que je n'est pas le niveau pour comprendre toutes les commande
qu'on me propose (je suis en effet autodidacte)
Voici mon problème plus en détail....
J'ai un classeur de base (n°1) avec des macros le tout est protégé par mot
de passe (feuille, classeur, et macro)
A l'ouverture de ce classeur, une macro crée une barre de menu qui permet
entre autre de créer une copie de la feuille principale dans un autre
classeur (n°2). Quand cette feuille est copiée dans ce nouveau classeur,
je
copie par la même ocasion les macro contenus dans le module ThisWorkbook
pour que ce nouveau classeur (n°2) se comporte comme celui de base (n°1).
Jusque là tout fonctionne (grace à ton code) .
Le bazar vient du fait qu'en copiant tout le ThisWorkbook j'ai copié aussi
la macro qui crée la barre de menu et celle qui l'enlève et ça j'aimerais
pouvoir le retirer afin de pouvoir fermer le n°2 sans qu'il me dise que la
Procédure Sub n'est pas reconnue (forcement car elle est sur un autre
module). En fait le ou les classeurs créés avec le menu du n°1 doivent
rester des classeurs dépendant du n°1 (Classeurs filles en quelques
sortes).
Le system de nom que tu m'as donné ne règle pas le problème car VBA
détecte
que la procédure Sub n'existe pas dans mes nouveau classeur et m'ouvre le
débuger.
Je pense que si j'arrive à supprimer dans Workbook_Open et dans
Workbook_BeforeClose la macro de création et suppétion de menu, ça devrait
coller.
Ensuite il me faudra protéger le code VBA de ce (ces) nouveau classeur car
quand je copie les macros du classeur n°1 qui sont protégées, sur le
nouveau
n°2 elles ne le sont pas ou plus.
Désolé de te mettre un roman mais j'essai d'être clair, donc si tu es
arrivé
au bout de tout ce blabla et que tu as une idée .... ben.... je suis
preneur
;)
@mic Phil
"michdenis" a écrit dans le message de news:Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever laprotection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit êtrefermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscriresauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une
fois
la procédure "Workbook_Open" du classeur pourvérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si lenom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" a écrit dans le message de news:
eMq$G4$Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
dustyle Workbook_Open()
merci pour vos infos
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
le A ne correspondait à rien. J'ai fini par comprendre qu'il me falait le
Bonjour Philou,
Pour détruire 2 procédures dans le ThisWorkbook d'un classeur :
dans cette ligne de code :
ClearThisWorkbookCode Arr(A), LeClasseur.xls
LeClasseur.xls représente le nom du classeur où tu veux supprimer ces
procédures.
'-------------------------------
Sub DétruireProcédureEnTrop()
Dim Arr()
'Tu peux lister toutes les procédures que tu désires. Elles doivent
'être situé dans le ThisWorkbook
Arr = Array("Workbook_Open", "Workbook_BeforeClose")
For A = 0 To UBound(Arr)
ClearThisWorkbookCode Arr(A), LeClasseur.xls
Next
End Sub
'-------------------------------
'-------------------------------
Sub ClearThisWorkbookCode(ByVal NomProcédure As String, _
NomDuClasseur as string)
Dim StartLine As Long, LineCount As Long
On Error Resume Next
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine(NomProcédure, 0)
If StartLine Then
LineCount = .ProcCountLines(NomProcédure, 0)
.DeleteLines StartLine, LineCount
End If
End With
End Sub
'-------------------------------
Salutations!
"Philou" <philippe.blancon@free.fr> a écrit dans le message de news:
u7RkJwCxEHA.3276@TK2MSFTNGP15.phx.gbl...
Aie ! Aie ! Aie !..... Je tourne le code dans tous les sens sans arrivé à
le
faire fonctionné :(
Je pense que je n'est pas le niveau pour comprendre toutes les commande
qu'on me propose (je suis en effet autodidacte)
Voici mon problème plus en détail....
J'ai un classeur de base (n°1) avec des macros le tout est protégé par mot
de passe (feuille, classeur, et macro)
A l'ouverture de ce classeur, une macro crée une barre de menu qui permet
entre autre de créer une copie de la feuille principale dans un autre
classeur (n°2). Quand cette feuille est copiée dans ce nouveau classeur,
je
copie par la même ocasion les macro contenus dans le module ThisWorkbook
pour que ce nouveau classeur (n°2) se comporte comme celui de base (n°1).
Jusque là tout fonctionne (grace à ton code) .
Le bazar vient du fait qu'en copiant tout le ThisWorkbook j'ai copié aussi
la macro qui crée la barre de menu et celle qui l'enlève et ça j'aimerais
pouvoir le retirer afin de pouvoir fermer le n°2 sans qu'il me dise que la
Procédure Sub n'est pas reconnue (forcement car elle est sur un autre
module). En fait le ou les classeurs créés avec le menu du n°1 doivent
rester des classeurs dépendant du n°1 (Classeurs filles en quelques
sortes).
Le system de nom que tu m'as donné ne règle pas le problème car VBA
détecte
que la procédure Sub n'existe pas dans mes nouveau classeur et m'ouvre le
débuger.
Je pense que si j'arrive à supprimer dans Workbook_Open et dans
Workbook_BeforeClose la macro de création et suppétion de menu, ça devrait
coller.
Ensuite il me faudra protéger le code VBA de ce (ces) nouveau classeur car
quand je copie les macros du classeur n°1 qui sont protégées, sur le
nouveau
n°2 elles ne le sont pas ou plus.
Désolé de te mettre un roman mais j'essai d'être clair, donc si tu es
arrivé
au bout de tout ce blabla et que tu as une idée .... ben.... je suis
preneur
;)
@mic Phil
"michdenis" <michdenis@hotmail.com> a écrit dans le message de news:
eHNdp0AxEHA.3976@TK2MSFTNGP09.phx.gbl...
Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever la
protection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit être
fermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscrire
sauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une
fois
la procédure "Workbook_Open" du classeur pour
vérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /
définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si le
nom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" <philippe.blancon@free.fr> a écrit dans le message de news:
eMq$G4$wEHA.1404@TK2MSFTNGP11.phx.gbl...
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
le A ne correspondait à rien. J'ai fini par comprendre qu'il me falait le
Bonjour Philou,
Pour détruire 2 procédures dans le ThisWorkbook d'un classeur :
dans cette ligne de code :
ClearThisWorkbookCode Arr(A), LeClasseur.xls
LeClasseur.xls représente le nom du classeur où tu veux supprimer ces
procédures.
'-------------------------------
Sub DétruireProcédureEnTrop()
Dim Arr()
'Tu peux lister toutes les procédures que tu désires. Elles doivent
'être situé dans le ThisWorkbook
Arr = Array("Workbook_Open", "Workbook_BeforeClose")
For A = 0 To UBound(Arr)
ClearThisWorkbookCode Arr(A), LeClasseur.xls
Next
End Sub
'-------------------------------
'-------------------------------
Sub ClearThisWorkbookCode(ByVal NomProcédure As String, _
NomDuClasseur as string)
Dim StartLine As Long, LineCount As Long
On Error Resume Next
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine(NomProcédure, 0)
If StartLine Then
LineCount = .ProcCountLines(NomProcédure, 0)
.DeleteLines StartLine, LineCount
End If
End With
End Sub
'-------------------------------
Salutations!
"Philou" a écrit dans le message de news:
Aie ! Aie ! Aie !..... Je tourne le code dans tous les sens sans arrivé à
le
faire fonctionné :(
Je pense que je n'est pas le niveau pour comprendre toutes les commande
qu'on me propose (je suis en effet autodidacte)
Voici mon problème plus en détail....
J'ai un classeur de base (n°1) avec des macros le tout est protégé par mot
de passe (feuille, classeur, et macro)
A l'ouverture de ce classeur, une macro crée une barre de menu qui permet
entre autre de créer une copie de la feuille principale dans un autre
classeur (n°2). Quand cette feuille est copiée dans ce nouveau classeur,
je
copie par la même ocasion les macro contenus dans le module ThisWorkbook
pour que ce nouveau classeur (n°2) se comporte comme celui de base (n°1).
Jusque là tout fonctionne (grace à ton code) .
Le bazar vient du fait qu'en copiant tout le ThisWorkbook j'ai copié aussi
la macro qui crée la barre de menu et celle qui l'enlève et ça j'aimerais
pouvoir le retirer afin de pouvoir fermer le n°2 sans qu'il me dise que la
Procédure Sub n'est pas reconnue (forcement car elle est sur un autre
module). En fait le ou les classeurs créés avec le menu du n°1 doivent
rester des classeurs dépendant du n°1 (Classeurs filles en quelques
sortes).
Le system de nom que tu m'as donné ne règle pas le problème car VBA
détecte
que la procédure Sub n'existe pas dans mes nouveau classeur et m'ouvre le
débuger.
Je pense que si j'arrive à supprimer dans Workbook_Open et dans
Workbook_BeforeClose la macro de création et suppétion de menu, ça devrait
coller.
Ensuite il me faudra protéger le code VBA de ce (ces) nouveau classeur car
quand je copie les macros du classeur n°1 qui sont protégées, sur le
nouveau
n°2 elles ne le sont pas ou plus.
Désolé de te mettre un roman mais j'essai d'être clair, donc si tu es
arrivé
au bout de tout ce blabla et que tu as une idée .... ben.... je suis
preneur
;)
@mic Phil
"michdenis" a écrit dans le message de news:Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever laprotection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit êtrefermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscriresauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une
fois
la procédure "Workbook_Open" du classeur pourvérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si lenom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" a écrit dans le message de news:
eMq$G4$Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
dustyle Workbook_Open()
merci pour vos infos
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
le A ne correspondait à rien. J'ai fini par comprendre qu'il me falait le
Bonjour Philou,
Pour détruire 2 procédures dans le ThisWorkbook d'un classeur :
dans cette ligne de code :
ClearThisWorkbookCode Arr(A), LeClasseur.xls
LeClasseur.xls représente le nom du classeur où tu veux supprimer ces
procédures.
'-------------------------------
Sub DétruireProcédureEnTrop()
Dim Arr()
'Tu peux lister toutes les procédures que tu désires. Elles doivent
'être situé dans le ThisWorkbook
Arr = Array("Workbook_Open", "Workbook_BeforeClose")
For A = 0 To UBound(Arr)
ClearThisWorkbookCode Arr(A), LeClasseur.xls
Next
End Sub
'-------------------------------
'-------------------------------
Sub ClearThisWorkbookCode(ByVal NomProcédure As String, _
NomDuClasseur as string)
Dim StartLine As Long, LineCount As Long
On Error Resume Next
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine(NomProcédure, 0)
If StartLine Then
LineCount = .ProcCountLines(NomProcédure, 0)
.DeleteLines StartLine, LineCount
End If
End With
End Sub
'-------------------------------
Salutations!
"Philou" a écrit dans le message de news:
Aie ! Aie ! Aie !..... Je tourne le code dans tous les sens sans arrivé à
le
faire fonctionné :(
Je pense que je n'est pas le niveau pour comprendre toutes les commande
qu'on me propose (je suis en effet autodidacte)
Voici mon problème plus en détail....
J'ai un classeur de base (n°1) avec des macros le tout est protégé par mot
de passe (feuille, classeur, et macro)
A l'ouverture de ce classeur, une macro crée une barre de menu qui permet
entre autre de créer une copie de la feuille principale dans un autre
classeur (n°2). Quand cette feuille est copiée dans ce nouveau classeur,
je
copie par la même ocasion les macro contenus dans le module ThisWorkbook
pour que ce nouveau classeur (n°2) se comporte comme celui de base (n°1).
Jusque là tout fonctionne (grace à ton code) .
Le bazar vient du fait qu'en copiant tout le ThisWorkbook j'ai copié aussi
la macro qui crée la barre de menu et celle qui l'enlève et ça j'aimerais
pouvoir le retirer afin de pouvoir fermer le n°2 sans qu'il me dise que la
Procédure Sub n'est pas reconnue (forcement car elle est sur un autre
module). En fait le ou les classeurs créés avec le menu du n°1 doivent
rester des classeurs dépendant du n°1 (Classeurs filles en quelques
sortes).
Le system de nom que tu m'as donné ne règle pas le problème car VBA
détecte
que la procédure Sub n'existe pas dans mes nouveau classeur et m'ouvre le
débuger.
Je pense que si j'arrive à supprimer dans Workbook_Open et dans
Workbook_BeforeClose la macro de création et suppétion de menu, ça devrait
coller.
Ensuite il me faudra protéger le code VBA de ce (ces) nouveau classeur car
quand je copie les macros du classeur n°1 qui sont protégées, sur le
nouveau
n°2 elles ne le sont pas ou plus.
Désolé de te mettre un roman mais j'essai d'être clair, donc si tu es
arrivé
au bout de tout ce blabla et que tu as une idée .... ben.... je suis
preneur
;)
@mic Phil
"michdenis" a écrit dans le message de news:Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever laprotection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit êtrefermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscriresauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une
fois
la procédure "Workbook_Open" du classeur pourvérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si lenom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" a écrit dans le message de news:
eMq$G4$Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
dustyle Workbook_Open()
merci pour vos infos
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
le A ne correspondait à rien. J'ai fini par comprendre qu'il me falait le
Bonjour Philou,
Pour détruire 2 procédures dans le ThisWorkbook d'un classeur :
dans cette ligne de code :
ClearThisWorkbookCode Arr(A), LeClasseur.xls
LeClasseur.xls représente le nom du classeur où tu veux supprimer ces
procédures.
'-------------------------------
Sub DétruireProcédureEnTrop()
Dim Arr()
'Tu peux lister toutes les procédures que tu désires. Elles doivent
'être situé dans le ThisWorkbook
Arr = Array("Workbook_Open", "Workbook_BeforeClose")
For A = 0 To UBound(Arr)
ClearThisWorkbookCode Arr(A), LeClasseur.xls
Next
End Sub
'-------------------------------
'-------------------------------
Sub ClearThisWorkbookCode(ByVal NomProcédure As String, _
NomDuClasseur as string)
Dim StartLine As Long, LineCount As Long
On Error Resume Next
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine(NomProcédure, 0)
If StartLine Then
LineCount = .ProcCountLines(NomProcédure, 0)
.DeleteLines StartLine, LineCount
End If
End With
End Sub
'-------------------------------
Salutations!
"Philou" <philippe.blancon@free.fr> a écrit dans le message de news:
u7RkJwCxEHA.3276@TK2MSFTNGP15.phx.gbl...
Aie ! Aie ! Aie !..... Je tourne le code dans tous les sens sans arrivé à
le
faire fonctionné :(
Je pense que je n'est pas le niveau pour comprendre toutes les commande
qu'on me propose (je suis en effet autodidacte)
Voici mon problème plus en détail....
J'ai un classeur de base (n°1) avec des macros le tout est protégé par mot
de passe (feuille, classeur, et macro)
A l'ouverture de ce classeur, une macro crée une barre de menu qui permet
entre autre de créer une copie de la feuille principale dans un autre
classeur (n°2). Quand cette feuille est copiée dans ce nouveau classeur,
je
copie par la même ocasion les macro contenus dans le module ThisWorkbook
pour que ce nouveau classeur (n°2) se comporte comme celui de base (n°1).
Jusque là tout fonctionne (grace à ton code) .
Le bazar vient du fait qu'en copiant tout le ThisWorkbook j'ai copié aussi
la macro qui crée la barre de menu et celle qui l'enlève et ça j'aimerais
pouvoir le retirer afin de pouvoir fermer le n°2 sans qu'il me dise que la
Procédure Sub n'est pas reconnue (forcement car elle est sur un autre
module). En fait le ou les classeurs créés avec le menu du n°1 doivent
rester des classeurs dépendant du n°1 (Classeurs filles en quelques
sortes).
Le system de nom que tu m'as donné ne règle pas le problème car VBA
détecte
que la procédure Sub n'existe pas dans mes nouveau classeur et m'ouvre le
débuger.
Je pense que si j'arrive à supprimer dans Workbook_Open et dans
Workbook_BeforeClose la macro de création et suppétion de menu, ça devrait
coller.
Ensuite il me faudra protéger le code VBA de ce (ces) nouveau classeur car
quand je copie les macros du classeur n°1 qui sont protégées, sur le
nouveau
n°2 elles ne le sont pas ou plus.
Désolé de te mettre un roman mais j'essai d'être clair, donc si tu es
arrivé
au bout de tout ce blabla et que tu as une idée .... ben.... je suis
preneur
;)
@mic Phil
"michdenis" <michdenis@hotmail.com> a écrit dans le message de news:
eHNdp0AxEHA.3976@TK2MSFTNGP09.phx.gbl...
Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever la
protection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit être
fermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscrire
sauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une
fois
la procédure "Workbook_Open" du classeur pour
vérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /
définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si le
nom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" <philippe.blancon@free.fr> a écrit dans le message de news:
eMq$G4$wEHA.1404@TK2MSFTNGP11.phx.gbl...
Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant
"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
du
style Workbook_Open()
merci pour vos infos
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
le A ne correspondait à rien. J'ai fini par comprendre qu'il me falait le
Bonjour Philou,
Pour détruire 2 procédures dans le ThisWorkbook d'un classeur :
dans cette ligne de code :
ClearThisWorkbookCode Arr(A), LeClasseur.xls
LeClasseur.xls représente le nom du classeur où tu veux supprimer ces
procédures.
'-------------------------------
Sub DétruireProcédureEnTrop()
Dim Arr()
'Tu peux lister toutes les procédures que tu désires. Elles doivent
'être situé dans le ThisWorkbook
Arr = Array("Workbook_Open", "Workbook_BeforeClose")
For A = 0 To UBound(Arr)
ClearThisWorkbookCode Arr(A), LeClasseur.xls
Next
End Sub
'-------------------------------
'-------------------------------
Sub ClearThisWorkbookCode(ByVal NomProcédure As String, _
NomDuClasseur as string)
Dim StartLine As Long, LineCount As Long
On Error Resume Next
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
StartLine = .ProcStartLine(NomProcédure, 0)
If StartLine Then
LineCount = .ProcCountLines(NomProcédure, 0)
.DeleteLines StartLine, LineCount
End If
End With
End Sub
'-------------------------------
Salutations!
"Philou" a écrit dans le message de news:
Aie ! Aie ! Aie !..... Je tourne le code dans tous les sens sans arrivé à
le
faire fonctionné :(
Je pense que je n'est pas le niveau pour comprendre toutes les commande
qu'on me propose (je suis en effet autodidacte)
Voici mon problème plus en détail....
J'ai un classeur de base (n°1) avec des macros le tout est protégé par mot
de passe (feuille, classeur, et macro)
A l'ouverture de ce classeur, une macro crée une barre de menu qui permet
entre autre de créer une copie de la feuille principale dans un autre
classeur (n°2). Quand cette feuille est copiée dans ce nouveau classeur,
je
copie par la même ocasion les macro contenus dans le module ThisWorkbook
pour que ce nouveau classeur (n°2) se comporte comme celui de base (n°1).
Jusque là tout fonctionne (grace à ton code) .
Le bazar vient du fait qu'en copiant tout le ThisWorkbook j'ai copié aussi
la macro qui crée la barre de menu et celle qui l'enlève et ça j'aimerais
pouvoir le retirer afin de pouvoir fermer le n°2 sans qu'il me dise que la
Procédure Sub n'est pas reconnue (forcement car elle est sur un autre
module). En fait le ou les classeurs créés avec le menu du n°1 doivent
rester des classeurs dépendant du n°1 (Classeurs filles en quelques
sortes).
Le system de nom que tu m'as donné ne règle pas le problème car VBA
détecte
que la procédure Sub n'existe pas dans mes nouveau classeur et m'ouvre le
débuger.
Je pense que si j'arrive à supprimer dans Workbook_Open et dans
Workbook_BeforeClose la macro de création et suppétion de menu, ça devrait
coller.
Ensuite il me faudra protéger le code VBA de ce (ces) nouveau classeur car
quand je copie les macros du classeur n°1 qui sont protégées, sur le
nouveau
n°2 elles ne le sont pas ou plus.
Désolé de te mettre un roman mais j'essai d'être clair, donc si tu es
arrivé
au bout de tout ce blabla et que tu as une idée .... ben.... je suis
preneur
;)
@mic Phil
"michdenis" a écrit dans le message de news:Bonjour Philou,
Réponse à la question I
Attention, il est impossible de modifier le code d'un classeur si le
projetVBA est protégé. Si on peut enlever laprotection par procédure, tu dois savoir que pour que la protection soit
de nouveau en vigueur , le classeur doit êtrefermé et ce n'est qu'à sa réouverture que la protection s'appliquera.
Personnellement, ce type de truc est à proscriresauf si toutes les autres alternatives sont sans issues.
Voici un exemple : Supposons que tu veuilles exécuter seulement une
fois
la procédure "Workbook_Open" du classeur pourvérifier si certains éléments sont en place
La procédure suivante fait le travail, en créant lors de la première
exécution un "NOM" du menu insertion / nom /définir qui n'est pas visible à l'usager, donc ce dernier ne peut pas le
supprimer. La procédure vérifie au départ si lenom existe et s'exécute seulement si ce dernier n'est pas défini.
'-------------------------------
Private Sub Workbook_Open()
Dim N As Name
Set N = Application.Names("CléOuverture")
If Err <> 0 Then
Err = 0
MsgBox "Toto"
ThisWorkbook.Names.Add "CléOuverture", 1, 0
End If
End Sub
'-------------------------------
Réponse à la question II
Voici comment faire pour effacer la procédure demandée.
Ces 2 Procédures sont à copiées dans un module Standard.
'----------------------------------
Sub EffacerProcédure()
Dim DeleteSubName As String
Dim ModuleName As String
DeleteSubName = "Sub Workbook_Open"
ModuleName = "ThisWorkbook"
SupprimerProcédure DeleteSubName, ModuleName
End Sub
'----------------------------------
Sub SupprimerProcédure(SonNom As String, SonModule As String)
Dim Début As Integer, Fin As Integer
Dim A As Integer, B As Integer, Nb As Integer
Dim Comp As Object
With ThisWorkbook.VBProject.VBComponents _
(SonModule).CodeModule
Nb = .CountOfLines
For A = 1 To Nb
If InStr(1, .Lines(A, 1), SonNom, _
vbTextCompare) <> 0 Then
Début = A
For B = A + 1 To Nb
If InStr(1, .Lines(B, 1), "End Sub", _
vbTextCompare) <> 0 Then
Fin = B - Début + 1
Exit For
End If
Next
If Fin <> 0 Then
.DeleteLines Début, Fin
Exit Sub
End If
End If
Next
End With
End Sub
'----------------------------------
Salutations!
"Philou" a écrit dans le message de news:
eMq$G4$Bonjour,
Je souhaiterais, après avoir créé (à l'aide d'une macro VBA) une macro
VBA
sur un classeur, pouvoir :
1- Protéger cette dernière comme on peux le faire manuellement en
faisant"Propriété de VbaProject..." puis 'Protection" "Vérouiller le projet
pour
l'affichage" avec mot de passe pour l'affichage.
2- Effacer une procédure (macro) inscrite dans le module ThisWorkbook
dustyle Workbook_Open()
merci pour vos infos
Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure mais
j'ai oublié de modifier le nom de la variable
dans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!
Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure mais
j'ai oublié de modifier le nom de la variable
dans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!
Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure mais
j'ai oublié de modifier le nom de la variable
dans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!
Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure mais
j'ai oublié de modifier le nom de la variable
dans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!
Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure mais
j'ai oublié de modifier le nom de la variable
dans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!
Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure mais
j'ai oublié de modifier le nom de la variable
dans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!
Bonjour Philou,
Tout ce qui suit est à copier dans un module standard :
Ces procédures afficheront la liste des fichiers excel d'un répertoire que
tu auras déterminé dans une barre d'outils
possédant un contrôle "Combobox" . Afin de contrôler la présence de cette
barre d'outils seulement lorsque ton fichier
est actif, tu peux utiliser les procédures événementielles suivantes
situées dans le ThisWorkbook pour activer ou
désactiver cette barre d'outils.
Dans le ThisWorkbook
'--------------------------------
Private Sub Workbook_Activate()
CréerUnMenuDeTypeCombobox
End Sub
'--------------------------------
Private Sub Workbook_Deactivate()
Application.CommandBars("Liste des fichiers").Delete
End Sub
'--------------------------------
Dans un module Standard
'------------------------------
Sub CréerUnMenuDeTypeCombobox()
Dim MBar As CommandBar
Dim MCtl As CommandBarControl
Dim Fichier As Variant
On Error Resume Next
Application.CommandBars("Liste des fichiers").Delete
With Application.CommandBars
Set MBar = .Add("Liste des fichiers")
End With
With MBar
.Top = 75
.Left = 20
.Visible = True
End With
With MBar.Controls
Set MCtl = .Add(msoControlComboBox)
With MCtl
.AddItem ""
Fichier = Dir("C:excel*.xls") 'à définir
Do While Fichier <> ""
.AddItem Fichier
Fichier = Dir()
Loop
.Caption = "Fichiers"
.Width = 150
.OnAction = "OuvrirFichier"
End With
End With
End Sub
'------------------------------
Sub OuvrirFichier()
Dim Chemin As String , Fichier As String
Chemin = "c:Excel" 'à définir
With Application.CommandBars("Liste des fichiers") _
.Controls("Fichiers")
Ficher = .List(.ListIndex)
End With
If IsEmpty(Fichier) Then Exit Sub
If Dir(Chemin & Fichier) <> "" Then
Workbooks.Open Chemin & Fichier
Else
MsgBox "Impossible de localiser ce fichier."
End If
End Sub
'------------------------------
Salutations!
"Philou" a écrit dans le message de news:
%
Avant d'aller à la pèche avec mon fils, j'aimerai te poser une autre
question.
J'aimerais pouvoir par le biais d'un menu, ouvrir les classeur que j'ai
créé. actuellement je les recherche avec une liste mais c'est pas jolie ni
très pratique. Est il possible d'avoir une commande qui fasse comme la
commande fichier ouvrir standard d'Excel (voir même utiliser celle-ci)
préparamêtré pour afficher que des classeurs commançant par "toto*.*" par
exemple ?
ou alors un menu ouvrant une liste déroulante qui affiche ces fichiers et
bien sur que l'on peux sélectionner pour ouvrir le dit fichier.
Peut-on lancer une commande d'un menu qui n'est pas affiché (car j'enlève
la
barre de menu standard d'excel)
Ex : outils options ou fichier ouvrir ou encore macro nouvelle macro
@+
Les classeurs
"michdenis" a écrit dans le message de news:Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure
mais
j'ai oublié de modifier le nom de la variabledans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!
Bonjour Philou,
Tout ce qui suit est à copier dans un module standard :
Ces procédures afficheront la liste des fichiers excel d'un répertoire que
tu auras déterminé dans une barre d'outils
possédant un contrôle "Combobox" . Afin de contrôler la présence de cette
barre d'outils seulement lorsque ton fichier
est actif, tu peux utiliser les procédures événementielles suivantes
situées dans le ThisWorkbook pour activer ou
désactiver cette barre d'outils.
Dans le ThisWorkbook
'--------------------------------
Private Sub Workbook_Activate()
CréerUnMenuDeTypeCombobox
End Sub
'--------------------------------
Private Sub Workbook_Deactivate()
Application.CommandBars("Liste des fichiers").Delete
End Sub
'--------------------------------
Dans un module Standard
'------------------------------
Sub CréerUnMenuDeTypeCombobox()
Dim MBar As CommandBar
Dim MCtl As CommandBarControl
Dim Fichier As Variant
On Error Resume Next
Application.CommandBars("Liste des fichiers").Delete
With Application.CommandBars
Set MBar = .Add("Liste des fichiers")
End With
With MBar
.Top = 75
.Left = 20
.Visible = True
End With
With MBar.Controls
Set MCtl = .Add(msoControlComboBox)
With MCtl
.AddItem ""
Fichier = Dir("C:excel*.xls") 'à définir
Do While Fichier <> ""
.AddItem Fichier
Fichier = Dir()
Loop
.Caption = "Fichiers"
.Width = 150
.OnAction = "OuvrirFichier"
End With
End With
End Sub
'------------------------------
Sub OuvrirFichier()
Dim Chemin As String , Fichier As String
Chemin = "c:Excel" 'à définir
With Application.CommandBars("Liste des fichiers") _
.Controls("Fichiers")
Ficher = .List(.ListIndex)
End With
If IsEmpty(Fichier) Then Exit Sub
If Dir(Chemin & Fichier) <> "" Then
Workbooks.Open Chemin & Fichier
Else
MsgBox "Impossible de localiser ce fichier."
End If
End Sub
'------------------------------
Salutations!
"Philou" <philippe.blancon@free.fr> a écrit dans le message de news:
%23YPyE1MxEHA.1396@tk2msftngp13.phx.gbl...
Avant d'aller à la pèche avec mon fils, j'aimerai te poser une autre
question.
J'aimerais pouvoir par le biais d'un menu, ouvrir les classeur que j'ai
créé. actuellement je les recherche avec une liste mais c'est pas jolie ni
très pratique. Est il possible d'avoir une commande qui fasse comme la
commande fichier ouvrir standard d'Excel (voir même utiliser celle-ci)
préparamêtré pour afficher que des classeurs commançant par "toto*.*" par
exemple ?
ou alors un menu ouvrant une liste déroulante qui affiche ces fichiers et
bien sur que l'on peux sélectionner pour ouvrir le dit fichier.
Peut-on lancer une commande d'un menu qui n'est pas affiché (car j'enlève
la
barre de menu standard d'excel)
Ex : outils options ou fichier ouvrir ou encore macro nouvelle macro
@+
Les classeurs
"michdenis" <michdenis@hotmail.com> a écrit dans le message de news:
Ox9JHoMxEHA.3844@TK2MSFTNGP09.phx.gbl...
Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure
mais
j'ai oublié de modifier le nom de la variable
dans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!
Bonjour Philou,
Tout ce qui suit est à copier dans un module standard :
Ces procédures afficheront la liste des fichiers excel d'un répertoire que
tu auras déterminé dans une barre d'outils
possédant un contrôle "Combobox" . Afin de contrôler la présence de cette
barre d'outils seulement lorsque ton fichier
est actif, tu peux utiliser les procédures événementielles suivantes
situées dans le ThisWorkbook pour activer ou
désactiver cette barre d'outils.
Dans le ThisWorkbook
'--------------------------------
Private Sub Workbook_Activate()
CréerUnMenuDeTypeCombobox
End Sub
'--------------------------------
Private Sub Workbook_Deactivate()
Application.CommandBars("Liste des fichiers").Delete
End Sub
'--------------------------------
Dans un module Standard
'------------------------------
Sub CréerUnMenuDeTypeCombobox()
Dim MBar As CommandBar
Dim MCtl As CommandBarControl
Dim Fichier As Variant
On Error Resume Next
Application.CommandBars("Liste des fichiers").Delete
With Application.CommandBars
Set MBar = .Add("Liste des fichiers")
End With
With MBar
.Top = 75
.Left = 20
.Visible = True
End With
With MBar.Controls
Set MCtl = .Add(msoControlComboBox)
With MCtl
.AddItem ""
Fichier = Dir("C:excel*.xls") 'à définir
Do While Fichier <> ""
.AddItem Fichier
Fichier = Dir()
Loop
.Caption = "Fichiers"
.Width = 150
.OnAction = "OuvrirFichier"
End With
End With
End Sub
'------------------------------
Sub OuvrirFichier()
Dim Chemin As String , Fichier As String
Chemin = "c:Excel" 'à définir
With Application.CommandBars("Liste des fichiers") _
.Controls("Fichiers")
Ficher = .List(.ListIndex)
End With
If IsEmpty(Fichier) Then Exit Sub
If Dir(Chemin & Fichier) <> "" Then
Workbooks.Open Chemin & Fichier
Else
MsgBox "Impossible de localiser ce fichier."
End If
End Sub
'------------------------------
Salutations!
"Philou" a écrit dans le message de news:
%
Avant d'aller à la pèche avec mon fils, j'aimerai te poser une autre
question.
J'aimerais pouvoir par le biais d'un menu, ouvrir les classeur que j'ai
créé. actuellement je les recherche avec une liste mais c'est pas jolie ni
très pratique. Est il possible d'avoir une commande qui fasse comme la
commande fichier ouvrir standard d'Excel (voir même utiliser celle-ci)
préparamêtré pour afficher que des classeurs commançant par "toto*.*" par
exemple ?
ou alors un menu ouvrant une liste déroulante qui affiche ces fichiers et
bien sur que l'on peux sélectionner pour ouvrir le dit fichier.
Peut-on lancer une commande d'un menu qui n'est pas affiché (car j'enlève
la
barre de menu standard d'excel)
Ex : outils options ou fichier ouvrir ou encore macro nouvelle macro
@+
Les classeurs
"michdenis" a écrit dans le message de news:Bonjour Philou,
"le A ne correspondait à rien"
Tu as raison ... j'ai fait une modification au niveau de la procédure
mais
j'ai oublié de modifier le nom de la variabledans la ligne de déclaration de la procédure ! J'en suis plus à une
distraction près !!!
;-))
Salutations!