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

Modifier du code VBA par macro

9 réponses
Avatar
rmillerlcxl
Bonjour,

Dans un fichier j'ai plusieurs modules. Dans ceux-ci il y a du texte que je=
dois modifier lorsque je change de version de fichiers.

Par exemple =E2=80=A6=20

dans module1 ...

Var_Model =3D "XLDossier_ModeleMAJ3.31.xls" devient Var_Model =3D "XLDossie=
r_ModeleMAJ3.32.xls"=20

dans module2 ...

Var_Model =3D Workbooks(Var_CaseMaj).Sheets("Validations").Range("CN_MenuVe=
rsion").Value =3D 3.31 devient Workbooks(Var_CaseMaj).Sheets("Validations")=
.Range("CN_MenuVersion").Value =3D 3.32

Et =E2=80=A6 c'est assez long. Actuellement je vais d'un module =C3=A0 l'au=
tre et je fais des Rechercher / Remplacer.

Serait-ce possible de me b=C3=A2tir une macro avec laquelle je pourrais mod=
ifier tout ce dont j'ai besoin? Si oui comment? Est-ce que le code peut =C3=
=AAtre =C3=A0 l'int=C3=A9rieur du m=C3=AAme fichier et dans un autre module=
ou dans un autre fichier?

Merci =C3=A0 l'avance.

9 réponses

Avatar
MichD
Bonjour,
Cette procédure remplace l'expression recherchée par une autre, et ce
dans tout le projetVBA d'un classeur.
Insère un module dans lequel tu vas utiliser seulement cette procédure.
Définis les 3 variables mentionnées.
Teste la procédure sur une copie de ton fichier d'abord.
'-------------------------------------------------------
Sub Modifier_Expression_ProjetVBA()
Dim ChaineRecherchée As String
Dim ChaineRemplace As String
Dim Trouver As Integer
Dim I As Integer
Dim Module As Object
Dim ModuleCherché As String
'***********VARIABLES À DÉFINIR**************
ChaineRecherchée =
Workbooks(Var_CaseMaj).Sheets("Validations").Range("CN_MenuVersion").Value
= 3.31
ChaineRemplace =
Workbooks(Var_CaseMaj).Sheets("Validations").Range("CN_MenuVersion").Value
= 3.32
'Nom Du module où tu inscris cette procédure
ModuleCherché = "Module1" 'Attention orthographe + Casse
'********************************************
For Each Module In ActiveWorkbook.VBProject.VBComponents
With Module.CodeModule
'Si le module ou est mis cette proc se nomme "Module1"
If Module.Name <> ModuleCherché Then
For I = .CountOfLines To 1 Step -1
Trouver = InStr(.Lines(I, 1), ChaineRecherchée)
If Trouver <> 0 Then
.ReplaceLine I, Left(.Lines(I, 1) _
, Trouver - 1) & ChaineRemplace & _
Mid(.Lines(I, 1), Trouver + Len(ChaineRecherchée) _
, Len(.Lines(I, 1)))
End If
Next I
End If
End With
Next
Set Module = Nothing
End Sub
'-------------------------------------------------------
MichD
Avatar
Roland Miller
Bonjour,
Ça fonctionne très bien. Mais j'ai d'abord besoin d'ôter la protection du projet VBA. J'ai cherché et tenté certaines lignes de code … mais sans succès.
Auriez-vous une idée de comment faire? Merci à l'avance.
Workbooks(wbk2).VBProject.Unprotect Password:="MoDePasse"
Avatar
MichD
Le 24/01/20 à 23:47, Roland Miller a écrit :
Bonjour,
Ça fonctionne très bien. Mais j'ai d'abord besoin d'ôter la protection du projet VBA. J'ai cherché et tenté certaines lignes de code … mais sans succès.
Auriez-vous une idée de comment faire? Merci à l'avance.
Workbooks(wbk2).VBProject.Unprotect Password:="MoDePasse"

Bonjour,
'------------------------------------------------------------
Sub TestUnprotect()
'Un objet Workbook
'"a" représente le mot de passe
Call UnprotectVBProject(ThisWorkbook, "a")
End Sub
'------------------------------------------------------------
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object
Set vbProj = WB.VBProject
If vbProj.Protection <> 1 Then Exit Sub
Set Application.VBE.ActiveVBProject = vbProj
SendKeys Password & "~~"
Application.VBE.CommandBars(1).FindControl(ID:%78, _
recursive:=True).Execute
End Sub
'------------------------------------------------------------
MichD
Avatar
Roland Miller
Bonjour et merci.
J'ai fait exactement comme votre code proposé. Mais ça n'ôte pas le mot de passe du projet. Mais je dois préciser que c'est dans u n autre Wk (wbk2) que je souhaite enlever le mot de passe.
Curieusement lorsque j'exécute le code ça ajoute un retour à la ligne … dans le code en cours en dessous de NextSearch:. Ci-des sous on voit le résultat après avoir exécuté le code à 3 ou 4 reprises. Car au début il n'y avait pas de retour à la ligne entre NextSearch: et ChaineRecherchée = "Pro_SYNCXLCASE".
Peut-être y aurait-il un petit ajustement à faire? Merci à l 'avance.
'************************************************************************** ***
Call UnprotectVBProject(wbk2, "CVCProjectPassword")
'***********VARIABLES À DÉFINIR**************
NextSearch:
ChaineRecherchée = "Pro_SYNCXLCASE"
Avatar
MichD
Le 25/01/20 à 12:27, Roland Miller a écrit :
Bonjour et merci.
J'ai fait exactement comme votre code proposé. Mais ça n'ôte pas le mot de passe du projet. Mais je dois préciser que c'est dans un autre Wk (wbk2) que je souhaite enlever le mot de passe.
Curieusement lorsque j'exécute le code ça ajoute un retour à la ligne … dans le code en cours en dessous de NextSearch:. Ci-dessous on voit le résultat après avoir exécuté le code à 3 ou 4 reprises. Car au début il n'y avait pas de retour à la ligne entre NextSearch: et ChaineRecherchée = "Pro_SYNCXLCASE".
Peut-être y aurait-il un petit ajustement à faire? Merci à l'avance.
'*****************************************************************************
Call UnprotectVBProject(wbk2, "CVCProjectPassword")
'***********VARIABLES À DÉFINIR**************
NextSearch:
ChaineRecherchée = "Pro_SYNCXLCASE"

Comme ceci :
'------------------------------------------------------------
Sub TestUnprotect()
Dim WK As Workbook
Dim MotDePasse As String
'Le classeur dont tu veux déprotéger le projetVBA
'Si ce fichier n'est pas ouvert, il faut l'ouvrir
'Bien sûr, tu dois adapter le chemin et le nom du fichier
Set WK = Workbooks.Open("E:TéléchargementsProtection VPAProject.xlsm")
'Si le fichier est déjà ouvert
'Set WK = Workbooks("Protection VPAProject.xlsm")
'Définir le mot de passe
MotDePasse = "a"
Call UnprotectVBProject(WK, MotDePasse)
End Sub
'------------------------------------------------------------
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object
Set vbProj = WB.VBProject
If vbProj.Protection <> 1 Then Exit Sub
Set Application.VBE.ActiveVBProject = vbProj
SendKeys Password & "~~"
Application.VBE.CommandBars(1).FindControl(ID:%78, _
recursive:=True).Execute
End Sub
'------------------------------------------------------------
MichD
Avatar
Roland Miller
Merci encore.
Sincèrement désolé … un détail m'échappe a ssurément
Call UnprotectVBProject(WK, MotDePasse) … vs Sub TestUnprotect() ? ??
Peut-être me remettre le code au complet?
J'ai aussi lu qu'il ne semble pas être possible d'y arriver sans un Se ndKey? Quand pensez-vous? Merci à l'avance.
Avatar
MichD
Ce code est complet et je l'ai testé à plusieurs reprises et il
fonctionne correctement.
Dans la procédure "TestUnprotect", je te donne le choix à savoir si le
fichier Excel dont tu dois déprotéger le projetVBA est ouvert ou fermé.
Il faut simplement conserver l'une des deux lignes de code `
'Si le fichier est fermé en adaptant le chemin et le nom du classeur.
Set WK = Workbooks.Open("E:TéléchargementsProtection VPAProject.xlsm")
Si le fichier est ouvert :
Set WK = Workbooks("Protection VPAProject.xlsm")
MotDePasse = "a" 'évidemment, tu dois inscrire le mot de passe du fichier.
Tu places tout ce code dans un module standard dans un fichier Excel à
partir duquel tu lanceras et déprotégeras le classeur dont le code est
protégé.
Lorsque tu exécutes ce code, qu'est-ce qui se passe? Un message
d'erreur? Il s'arrête sur quelle ligne de code?
Oui il y a une procédure avec SendKey mais celle-ci est plus "sûre"
selon moi.
'------------------------------------------------------------
Sub TestUnprotect()
Dim WK As Workbook
Dim MotDePasse As String
'Le classeur dont tu veux déprotéger le projetVBA
'Si ce fichier n'est pas ouvert, il faut l'ouvrir
'Bien sûr, tu dois adapter le chemin et le nom du fichier
Set WK = Workbooks.Open("E:TéléchargementsProtection VPAProject.xlsm")
'Si le fichier est déjà ouvert
'Set WK = Workbooks("Protection VPAProject.xlsm")
'Définir le mot de passe
MotDePasse = "a"
Call UnprotectVBProject(WK, MotDePasse)
End Sub
'------------------------------------------------------------
Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object
Set vbProj = WB.VBProject
If vbProj.Protection < 1 Then Exit Sub
Set Application.VBE.ActiveVBProject = vbProj
SendKeys Password & "~~"
Application.VBE.CommandBars(1).FindControl(ID:%78, _
recursive:=True).Execute
End Sub
'------------------------------------------------------------
MichD
Avatar
Roland Miller
Bonjour,
Désolé …
Concernant …
Si le fichier est ouvert :
Set WK = Workbooks("Protection VPAProject.xlsm")
("Protection VPAProject.xlsm") est le nom du classeur ou?
Car lorsqu"on est dans VBA le nom est par exemple … VBAProject(Nom du classeur)
Pour éliminer une confusion possible … disons que le nom de mo n classeur est ABC.xlsm est-ce qu'alors la ligne doit être Set WK = Workbooks("ABC.xlsm") ou y a-t'il quelque chose qui m'échappe?
Avatar
MichD
Le 27/01/20 à 11:03, Roland Miller a écrit :
Protection VPAProject.xlsm

| Protection VPAProject.xlsm
Dans mon exemple, c'est le nom du classeur dont le projetVBA est protégé
et dont la procédure est supposée d'ouvrir le projetVBA.
Tu remplaces "Protection VPAProject.xlsm" par le nom du classeur dont
tu veux ouvrir le projetVBA protégé.
MichD