Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

(vba) macro pour la macro ...

11 réponses
Avatar
j-pascal
Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours à une
variable publique, etc... mais je maintiens quand même ma question ;-)

Merci d'avance pour vos lumières ...

JP

10 réponses

1 2
Avatar
Pierre Fauconnier
Bonsoir

Oui, c'est possible en travaillant sur l'objet VBProject de
ThisWorkbook.

Le principe est d'itérer sur chaque ""VBComponent" (chaque module,
qu'il soit de classe ou standard), et pour chaque objet "VBComponent",
d'itérer sur les lignes du module et de remplacer une chaine de
caractères par une autre. Dans l'exemple ci-dessous, je remplace
systématiquement chaque ligne du module en utilisant la fonction
Replace sur le texte de la ligne.

Il est très important de choisir sa chaine avec soin. Dans l'exemple
ci-dessous, j'ai choisi de remplacer la chaine "mdp = ""pierre"""
plutôt que de remplacer la chaine "pierre" pour ne remplacer que les
occurences qui concernent bien le mot de passe. Ce code est évidemment
à tester sur des classeurs martyrs avant de le mettre en production.

Je conseille d'isoler la macro dans un module spécifique (module2 dans
mon exemple) et d'exclure ce module de la boucle de remplacement, pour
ne pas modifier le code de remplacement...

Sub RemplacerDansVba()
Dim i As Integer
Dim j As Integer
Dim TexteCherche As String
Dim TexteRemplacement As String

TexteCherche = "mdp = ""pierre"""
TexteRemplacement = "mdp = ""martine"""

For i = 1 To ThisWorkbook.VBProject.VBComponents.Count
If ThisWorkbook.VBProject.VBComponents(i).Name <> "Module2"
Then
For j = 1 To _
ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.CountOfLines
ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.ReplaceLine (j), _
Replace(ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.Lines(j, 1), _
TexteCherche, TexteRemplacement)
Next j
End If
Next i
End Sub

Cela te convient?

Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours à une
variable publique, etc... mais je maintiens quand même ma question ;-)

Merci d'avance pour vos lumières ...

JP


--
Pierre Fauconnier
Il n'y a jamais eu un moment dans votre vie qui ne se passait pas
"maintenant" et il n'y en aura jamais (Eckart Toll in "Le pouvoir du
moment présent")

Avatar
Pierre Fauconnier
J'ai oublié de précise qu'il faut cocher
Outils/Macros/Sécurité/Editeurs approuvés/Faire confiance au projet
Visual Basic
sur CHAQUE machine sur lequel le code sera exécuté.
Peut-être y-a-t'il moyen (j'espère que non...!! pour des raisons
évidentes de sécurité) de modifier cela par code dans la base des
registres, mais j'en doute.

Il faut donc le préciser aux utilisateurs qui lanceront la mise à jour


Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours à une
variable publique, etc... mais je maintiens quand même ma question ;-)

Merci d'avance pour vos lumières ...

JP


--
Pierre Fauconnier
Il n'y a jamais eu un moment dans votre vie qui ne se passait pas
"maintenant" et il n'y en aura jamais (Eckart Toll in "Le pouvoir du
moment présent")

Avatar
Patrick BASTARD
Bonjour, *Pierre *

Est-ce que cette macro fonctionne aussi pour remplacer la chaine "mdp =
""pierre""" par "mdp = ""Sam""" ?
:-)
--
Bien amicalement,
P. Bastard

Avant d'imprimer ce mail, ayez une pensée pour les arbres.


Bonsoir

Oui, c'est possible en travaillant sur l'objet VBProject de
ThisWorkbook.

Le principe est d'itérer sur chaque ""VBComponent" (chaque module,
qu'il soit de classe ou standard), et pour chaque objet "VBComponent",
d'itérer sur les lignes du module et de remplacer une chaine de
caractères par une autre. Dans l'exemple ci-dessous, je remplace
systématiquement chaque ligne du module en utilisant la fonction
Replace sur le texte de la ligne.

Il est très important de choisir sa chaine avec soin. Dans l'exemple
ci-dessous, j'ai choisi de remplacer la chaine "mdp = ""pierre"""
plutôt que de remplacer la chaine "pierre" pour ne remplacer que les
occurences qui concernent bien le mot de passe. Ce code est évidemment
à tester sur des classeurs martyrs avant de le mettre en production.

Je conseille d'isoler la macro dans un module spécifique (module2 dans
mon exemple) et d'exclure ce module de la boucle de remplacement, pour
ne pas modifier le code de remplacement...

Sub RemplacerDansVba()
Dim i As Integer
Dim j As Integer
Dim TexteCherche As String
Dim TexteRemplacement As String

TexteCherche = "mdp = ""pierre"""
TexteRemplacement = "mdp = ""martine"""

For i = 1 To ThisWorkbook.VBProject.VBComponents.Count
If ThisWorkbook.VBProject.VBComponents(i).Name <> "Module2"
Then
For j = 1 To _
ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.CountOfLines
ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.ReplaceLine (j), _
Replace(ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.Lines(j, 1), _
TexteCherche, TexteRemplacement)
Next j
End If
Next i
End Sub

Cela te convient?

Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec
des Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir
recours à une variable publique, etc... mais je maintiens quand même
ma question ;-) Merci d'avance pour vos lumières ...

JP




Avatar
MichDenis
Ben si ton projet VBA n'est pas verrouillé, tu peux facilement utiliser
la commande "Remplacer" du menu Édition de la barre de menu dans
la fenêtre de l'éditeur de code VBA Pourquoi créer une nouvelle
procédure à cet effet ? De plus, on peut se poser la question sur
l'utilité du mot de passe.

Si ton projet est verrouillé, il n'existe aucun moyen de faire ce que tu
demandes à moins de déverrouiller le code au préalable !



"j-pascal" a écrit dans le message de news:

Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours à une
variable publique, etc... mais je maintiens quand même ma question ;-)

Merci d'avance pour vos lumières ...

JP
Avatar
Pierre Fauconnier
A la lecture de son texte, il semble qu'il prend le mot de passe comme
exemple (ie)... (c'était peut-être un mauvais exemple...)
L'utilité de le faire par VBA, c'est de pouvoir modifier un code
déployé sur plusieurs machines, sur lesquelles il n'a probablement pas
la main... Même s'il y a d'autres techniques à utiliser dans ce cas,
notamment les xla...

Mais si le projet est protégé, je suis d'accord avec toi... il faut le
déprotéger à la main, car il n'existe pas d'autre solution, à mon
avis...


Ben si ton projet VBA n'est pas verrouillé, tu peux facilement utiliser
la commande "Remplacer" du menu Édition de la barre de menu dans
la fenêtre de l'éditeur de code VBA Pourquoi créer une nouvelle
procédure à cet effet ? De plus, on peut se poser la question sur
l'utilité du mot de passe.

Si ton projet est verrouillé, il n'existe aucun moyen de faire ce que tu
demandes à moins de déverrouiller le code au préalable !



"j-pascal" a écrit dans le message de news:

Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours à une
variable publique, etc... mais je maintiens quand même ma question ;-)

Merci d'avance pour vos lumières ...

JP


--
Pierre Fauconnier
Il n'y a jamais eu un moment dans votre vie qui ne se passait pas
"maintenant" et il n'y en aura jamais (Eckart Toll in "Le pouvoir du
moment présent")

Avatar
MichDenis
| il faut le déprotéger à la main, car il n'existe pas d'autre solution, à mon
| avis...

C'est possible de déprotéger le code VBA (bien sûr en sachant le mot de passe)
par une procédure, appliquer sur le code une procédure X et reprotéger le classeur.
Comme tu sais, il faudra fermer le classeur et le rouvrir pour que la protection
du code soit effective.
Avatar
anonymousA
Bonjour,

pour protéger ou déproteger un vbproject, il te faudra utiliser SendKeys
seul moyen à ma connaissance de réaliser cette opération pour envoyer un
mot de passe ou l'enlever dans la boite de dialogue de propriétés du projet.

A+


A la lecture de son texte, il semble qu'il prend le mot de passe comme
exemple (ie)... (c'était peut-être un mauvais exemple...)
L'utilité de le faire par VBA, c'est de pouvoir modifier un code déployé
sur plusieurs machines, sur lesquelles il n'a probablement pas la
main... Même s'il y a d'autres techniques à utiliser dans ce cas,
notamment les xla...

Mais si le projet est protégé, je suis d'accord avec toi... il faut le
déprotéger à la main, car il n'existe pas d'autre solution, à mon avis...


Ben si ton projet VBA n'est pas verrouillé, tu peux facilement utiliser
la commande "Remplacer" du menu Édition de la barre de menu dans
la fenêtre de l'éditeur de code VBA Pourquoi créer une nouvelle
procédure à cet effet ? De plus, on peut se poser la question sur
l'utilité du mot de passe.

Si ton projet est verrouillé, il n'existe aucun moyen de faire ce que tu
demandes à moins de déverrouiller le code au préalable !



"j-pascal" a écrit dans le message de news:

Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours
à une
variable publique, etc... mais je maintiens quand même ma question ;-)

Merci d'avance pour vos lumières ...

JP





Avatar
j-pascal
Bonjour Pierre,

J'ai fait (je crois !) ce que tu as dit ...

Avant de lire ton second message, ça boguait sur :
"For i = 1 To ThisWorkbook.VBProject.VBComponents.Count"
Msg = "Erreur d'exécution 1004" "L'accès par programme au projet Visual
Basic n'est pas fiable" ...
Corrigé ;-)

Ca fonctionne à merveille(s) ! Merci ++

En fait, dans le cas présent (mais c'est un peu hors-sujet) ça me pose un
autre problème ...

A la fermeture du classeur, le nouveau MdP n'est pas reconnu !!

'--------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As
Boolean)

Dim réponse As Variant
Dim Sh As Worksheet

ThisWorkbook.Unprotect "toto" 'le BOGUE !!
Application.EnableEvents = False

If SaveAsUI Then
MsgBox "Désolé, l'option Enregistrer sous... est impossible !", _
vbExclamation, "choix possibles : Enregistrer ou Fermer"
Cancel = True
Else
réponse = MsgBox("Voulez-vous enregistrer une copie sous la forme :
" _
& "Date Heure Fichier.xls" & " ?", vbYesNo)

With ThisWorkbook
ChDrive "C"
ChDir .Path
If réponse = vbYes Then '6
.SaveCopyAs Format(Now, "yyyymmmdd-hh""h""nn") & " " &
.Name
Else
Cancel = True
End If
End With
End If

Application.EnableCancelKey = xlDisabled
Application.ScreenUpdating = False

Feuil15.Visible = True 'Feuil15.Visible = xlSheetVisible

For Each Sh In ThisWorkbook.Sheets
If Sh.CodeName <> "Feuil15" Then
Sh.Visible = xlSheetVeryHidden
End If
Next

End Sub
'----------------------------------------

Pour tout dire, j'avais fait du zèle en utilisant un MdP "dynamique" genre
"la date du jour + un signe" ... Tout fonctionnait bien le "jour J" jusqu'à
ce que je réalise que c'était la cata totale le "jour J + 1" !!! Le seul
truc que j'ai trouvé à l'époque a été de changer la date système !!!

Je pense que le pb n'est pas insoluble, mais pour l'instant, je sèche ...
En attendant, pouvoir changer tous les MdP d'un coup, c'est génial :o)
Mes MdP servent aussi bien à la protection des Feuilles que du Classeur ...
Je sais que Stéphane va me rappeler l'usage "salvateur" de UserInterfaceOnly
= True ... que je n'ai jamais su vraiment mettre en pratique ;-( J'ose à
peine reposter sur le sujet ...

Encore merci,

JP
"Pierre Fauconnier" a écrit dans le
message de news:
Bonsoir

Oui, c'est possible en travaillant sur l'objet VBProject de ThisWorkbook.

Le principe est d'itérer sur chaque ""VBComponent" (chaque module, qu'il
soit de classe ou standard), et pour chaque objet "VBComponent", d'itérer
sur les lignes du module et de remplacer une chaine de caractères par une
autre. Dans l'exemple ci-dessous, je remplace systématiquement chaque
ligne du module en utilisant la fonction Replace sur le texte de la ligne.

Il est très important de choisir sa chaine avec soin. Dans l'exemple
ci-dessous, j'ai choisi de remplacer la chaine "mdp = ""pierre""" plutôt
que de remplacer la chaine "pierre" pour ne remplacer que les occurences
qui concernent bien le mot de passe. Ce code est évidemment à tester sur
des classeurs martyrs avant de le mettre en production.

Je conseille d'isoler la macro dans un module spécifique (module2 dans mon
exemple) et d'exclure ce module de la boucle de remplacement, pour ne pas
modifier le code de remplacement...

Sub RemplacerDansVba()
Dim i As Integer
Dim j As Integer
Dim TexteCherche As String
Dim TexteRemplacement As String

TexteCherche = "mdp = ""pierre"""
TexteRemplacement = "mdp = ""martine"""

For i = 1 To ThisWorkbook.VBProject.VBComponents.Count
If ThisWorkbook.VBProject.VBComponents(i).Name <> "Module2" Then
For j = 1 To _
ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.CountOfLines
ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.ReplaceLine (j), _
Replace(ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.Lines(j, 1), _
TexteCherche, TexteRemplacement)
Next j
End If
Next i
End Sub

Cela te convient?

Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours à
une variable publique, etc... mais je maintiens quand même ma question
;-)

Merci d'avance pour vos lumières ...

JP


--
Pierre Fauconnier
Il n'y a jamais eu un moment dans votre vie qui ne se passait pas
"maintenant" et il n'y en aura jamais (Eckart Toll in "Le pouvoir du
moment présent")





Avatar
Pierre Fauconnier
Salut...

Poste un nouveau fil avec une explication détaillée du problème
rencontré... Sur quoi mets-tu le(s) mot(s) de passe? Sur des
protections de feuille, la protection du classeur?

Dis-nous en plus dans un nouveau fil de discussion...

A bientôt. Bon week-end.


Bonjour Pierre,

J'ai fait (je crois !) ce que tu as dit ...

Avant de lire ton second message, ça boguait sur :
"For i = 1 To ThisWorkbook.VBProject.VBComponents.Count"
Msg = "Erreur d'exécution 1004" "L'accès par programme au projet Visual Basic
n'est pas fiable" ...
Corrigé ;-)

Ca fonctionne à merveille(s) ! Merci ++

En fait, dans le cas présent (mais c'est un peu hors-sujet) ça me pose un
autre problème ...

A la fermeture du classeur, le nouveau MdP n'est pas reconnu !!

'--------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

Dim réponse As Variant
Dim Sh As Worksheet

ThisWorkbook.Unprotect "toto" 'le BOGUE !!
Application.EnableEvents = False

If SaveAsUI Then
MsgBox "Désolé, l'option Enregistrer sous... est impossible !", _
vbExclamation, "choix possibles : Enregistrer ou Fermer"
Cancel = True
Else
réponse = MsgBox("Voulez-vous enregistrer une copie sous la forme : "
_
& "Date Heure Fichier.xls" & " ?", vbYesNo)

With ThisWorkbook
ChDrive "C"
ChDir .Path
If réponse = vbYes Then '6
.SaveCopyAs Format(Now, "yyyymmmdd-hh""h""nn") & " " &
.Name
Else
Cancel = True
End If
End With
End If

Application.EnableCancelKey = xlDisabled
Application.ScreenUpdating = False

Feuil15.Visible = True 'Feuil15.Visible = xlSheetVisible

For Each Sh In ThisWorkbook.Sheets
If Sh.CodeName <> "Feuil15" Then
Sh.Visible = xlSheetVeryHidden
End If
Next

End Sub
'----------------------------------------

Pour tout dire, j'avais fait du zèle en utilisant un MdP "dynamique" genre
"la date du jour + un signe" ... Tout fonctionnait bien le "jour J" jusqu'à
ce que je réalise que c'était la cata totale le "jour J + 1" !!! Le seul truc
que j'ai trouvé à l'époque a été de changer la date système !!!

Je pense que le pb n'est pas insoluble, mais pour l'instant, je sèche ...
En attendant, pouvoir changer tous les MdP d'un coup, c'est génial :o)
Mes MdP servent aussi bien à la protection des Feuilles que du Classeur ...
Je sais que Stéphane va me rappeler l'usage "salvateur" de UserInterfaceOnly
= True ... que je n'ai jamais su vraiment mettre en pratique ;-( J'ose à
peine reposter sur le sujet ...

Encore merci,

JP
"Pierre Fauconnier" a écrit dans le
message de news:
Bonsoir

Oui, c'est possible en travaillant sur l'objet VBProject de ThisWorkbook.

Le principe est d'itérer sur chaque ""VBComponent" (chaque module, qu'il
soit de classe ou standard), et pour chaque objet "VBComponent", d'itérer
sur les lignes du module et de remplacer une chaine de caractères par une
autre. Dans l'exemple ci-dessous, je remplace systématiquement chaque ligne
du module en utilisant la fonction Replace sur le texte de la ligne.

Il est très important de choisir sa chaine avec soin. Dans l'exemple
ci-dessous, j'ai choisi de remplacer la chaine "mdp = ""pierre""" plutôt
que de remplacer la chaine "pierre" pour ne remplacer que les occurences
qui concernent bien le mot de passe. Ce code est évidemment à tester sur
des classeurs martyrs avant de le mettre en production.

Je conseille d'isoler la macro dans un module spécifique (module2 dans mon
exemple) et d'exclure ce module de la boucle de remplacement, pour ne pas
modifier le code de remplacement...

Sub RemplacerDansVba()
Dim i As Integer
Dim j As Integer
Dim TexteCherche As String
Dim TexteRemplacement As String

TexteCherche = "mdp = ""pierre"""
TexteRemplacement = "mdp = ""martine"""

For i = 1 To ThisWorkbook.VBProject.VBComponents.Count
If ThisWorkbook.VBProject.VBComponents(i).Name <> "Module2" Then
For j = 1 To _
ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.CountOfLines
ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.ReplaceLine (j), _
Replace(ThisWorkbook.VBProject.VBComponents(i). _
CodeModule.Lines(j, 1), _
TexteCherche, TexteRemplacement)
Next j
End If
Next i
End Sub

Cela te convient?

Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours à
une variable publique, etc... mais je maintiens quand même ma question ;-)

Merci d'avance pour vos lumières ...

JP


-- Pierre Fauconnier
Il n'y a jamais eu un moment dans votre vie qui ne se passait pas
"maintenant" et il n'y en aura jamais (Eckart Toll in "Le pouvoir du moment
présent")





--
Pierre Fauconnier
Il n'y a jamais eu un moment dans votre vie qui ne se passait pas
"maintenant" et il n'y en aura jamais (Eckart Toll in "Le pouvoir du
moment présent")



Avatar
j-pascal
Bonsoir,

Je note, merci.

JP

"MichDenis" a écrit dans le message de news:

Ben si ton projet VBA n'est pas verrouillé, tu peux facilement utiliser
la commande "Remplacer" du menu Édition de la barre de menu dans
la fenêtre de l'éditeur de code VBA Pourquoi créer une nouvelle
procédure à cet effet ? De plus, on peut se poser la question sur
l'utilité du mot de passe.

Si ton projet est verrouillé, il n'existe aucun moyen de faire ce que tu
demandes à moins de déverrouiller le code au préalable !



"j-pascal" a écrit dans le message de news:

Bonjour,

Est-il possible d'affecter une macro au code du projet ?

J'explique :
Peut-on créer une macro qui balayerait l'ensemble du code (Feuilles -
ThisWorkbook - UF - etc.) pour remplacer un mot de passe (ie) (avec des
Private Sub) ?
Dans le cas présent, vous allez peut-être me proposer d'avoir recours à
une
variable publique, etc... mais je maintiens quand même ma question ;-)

Merci d'avance pour vos lumières ...

JP




1 2