Comment activer la protection des macros avec VBA ?

Le
Philou
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
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
michdenis
Le #1900356
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" 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
Michel Pierron
Le #1900326
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" 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




Philou
Le #1900304
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"
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" 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





Philou
Le #1900301
Merci pour ton code, je vais essayer de l'adapter mais c'est pas gagné car
je suis novice dans la programmation d' Excel (Autodidacte), je reprend tout
les codes que tu utilises avec l'aide F1 pour essayer de comprendre comment
ça marche tout ça.
Ce qui vous semble simple à vous programmeurs,.... n'est pas intuitif pour
moi.
Je constate que toutes vos procédures sont consises...alors que les miennnes
s'étirent sur toutes la page :)))

@+ Phil

"Michel Pierron"
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" 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








michdenis
Le #1900297
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" 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"
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" 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





Philou
Le #1900229
Bonne nouvelle, ça FONCTIONNE à merveille
j'ai galéré un peu car au début ton code repris tel quel ne marchait pas car
dans la ligne
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
le A ne correspondait à rien. J'ai fini par comprendre qu'il me falait le

remplacer par NomDuClasseur
et là tout baigne. :)

Merci pour ton code et pour le temps que tu m'as accordé.

@mic Phil

"michdenis"
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"

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"
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" 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










michdenis
Le #1900153
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!



"Philou" Bonne nouvelle, ça FONCTIONNE à merveille
j'ai galéré un peu car au début ton code repris tel quel ne marchait pas car
dans la ligne
With Workbooks(A).VBProject.VBComponents("ThisWorkbook").CodeModule
le A ne correspondait à rien. J'ai fini par comprendre qu'il me falait le

remplacer par NomDuClasseur
et là tout baigne. :)

Merci pour ton code et pour le temps que tu m'as accordé.

@mic Phil

"michdenis"
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"

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"
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" 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










Philou
Le #1900149
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"
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!


michdenis
Le #1900123
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" 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"
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!


Philou
Le #1900001
Merci et pour la rapidité et pour la qualité du code
Ca marche après avoir corigé la variable Ficher en Fichier :)
@mic Phil

"michdenis"
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" %

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"
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!








Publicité
Poster une réponse
Anonyme