Rechercher-remplacer dans le code VBA de plusieurs classeurs

modus57

XLDnaute Occasionnel
Bonsoir à tous

J'ai dans le code de plusieurs dizaines de classeurs une constante dont la valeur est fausse.

Le code ci-dessous, que j'ai trouvé sur le net permet de rechercher et remplacer cette valeur ?

Mais comment faire pour déprotéger et protéger le projet VBA de chaque classeur avec:
UnprotectVBProject Workbooks, "MotDePasse"
ProtectVBProject Workbooks, "MotDePasse"

Sub Remplacer()
Dim Classeur As Workbook
Dim Module As Object
Dim Rechercher As String
Dim Remplacer As String
Dim Trouver As Integer
Dim I As Integer

Rechercher = "MonMotQueJeN'aimePlus"
Remplacer = "MonMotQueJ'aime"
For Each Classeur In Workbooks
For Each Module In Classeur.VBProject.VBComponents
With Module.CodeModule
If Module.Name <> "ModuleDeMiseAJour" Then
For I = 1 To .CountOfLines
Trouver = InStr(.Lines(I, 1), Rechercher)
If Trouver > 0 Then
'Si une occurrence est trouvée, fait la modif et boucle
'Sur la ligne afin de remplacer tous les mots
Do
.ReplaceLine I, Left(.Lines(I, 1) _
, Trouver - 1) & Remplacer & _
Mid(.Lines(I, 1), _
Trouver + Len(Rechercher) _
, Len(.Lines(I, 1)))
Trouver = InStr(Trouver + 1, _
.Lines(I, 1), Rechercher)
Loop While Trouver <> 0
End If
Next I
End If
End With
Next Module
Next Classeur
Set Classeur = Nothing
Set Module = Nothing
End Sub

Merci d'avance pour votre réponse
 
C

Compte Supprimé 979

Guest
Re : Rechercher-remplacer dans le code VBA de plusieurs classeurs

Salut Modus57,

Je pense qu'en faisant
Code:
Sub Remplacer()
Dim Classeur As Workbook
Dim Module As Object
Dim Rechercher As String
Dim Remplacer As String
Dim Trouver As Integer
Dim I As Integer
Rechercher = "MonMotQueJeN'aimePlus"
Remplacer = "MonMotQueJ'aime"
For Each Classeur In Workbooks
  ' Déprotéger le classeur ICI
  [COLOR=blue][B]UnprotectVBProject Workbooks, "MotDePasse"
[/B][/COLOR]  ' Pour chaque module du classeur
  For Each Module In Classeur.VBProject.VBComponents
    With Module.CodeModule
    If Module.Name <> "ModuleDeMiseAJour" Then
      For I = 1 To .CountOfLines
        Trouver = InStr(.Lines(I, 1), Rechercher)
        If Trouver > 0 Then
          'Si une occurrence est trouvée, fait la modif et boucle
          'Sur la ligne afin de remplacer tous les mots
          Do
            .ReplaceLine I, Left(.Lines(I, 1), _
            Trouver - 1) & Remplacer & Mid(.Lines(I, 1), _
            Trouver + Len(Rechercher), Len(.Lines(I, 1)))
            Trouver = InStr(Trouver + 1, .Lines(I, 1), Rechercher)
          Loop While Trouver <> 0
        End If
      Next I
    End If
    End With
  Next Module
  ' Réprotéger le classeur ICI
 [COLOR=blue][B] ProtectVBProject Classeur, "MotDePasse"
[/B][/COLOR]Next Classeur
Set Classeur = Nothing
Set Module = Nothing
End Sub

Voilà ;)
 
Dernière modification par un modérateur:

modus57

XLDnaute Occasionnel
Re : Rechercher-remplacer dans le code VBA de plusieurs classeurs

Bonjour BrunoM45,

Merci pour ta réponse.

Finalement la reprotection n'est pas nécessaire, lorsque le fichiers et à nouveau enregister.

J'ai ajouté la sub ci-dessous:

Sub TestUnprotect ()
UnprotectVBProject Workbooks(classeur), "MotDePasse"
End Sub

Sub UnprotectVBProject(WB As Workbook, ByVal Password As String)
Dim vbProj As Object

Set vbProj = WB.VBProject

'ne peut pas le faire si déjà débloqué !
If vbProj.Protection <> 1 Then Exit Sub

Set Application.VBE.ActiveVBProject = vbProj

'employez maintenant SendKeys pour citer le mot de passe de projet
SendKeys Password & "~~"
Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
End Sub

J'ai testé plusieurs fois, mais ça ne marche pas, la procédure n'arrive pas à déverrouiller les projets et modifier le code?

As-tu une explication ?

@ + .
 

modus57

XLDnaute Occasionnel
Re : Rechercher-remplacer dans le code VBA de plusieurs classeurs

Boujour à tous.

Remplacer :

UnprotectVBProject Workbooks(Classeur), "MotDePasse"

Par :

UnprotectVBProject Workbooks(“Classeur2.xls”), "MotDePasse"

Ça marche si le nom du classeur est écrit en dur par exemple “Classeur2.xls” .

Si plusieurs classeurs sont concernés c’est fastidieux de ressaisir chaque fois un nouveau nom dans le code.

Comment modifier la procédure pour déverrouiller les projets de plusieurs classeurs en récupérant le nom du classeur entre guillemets “ClasseurX.xls”, “ClasseurY.xls” etc…?

Quelqu'un a-t-il une réponse.

Merci d'avance @ +.
 

Teppic

XLDnaute Nouveau
Re : Rechercher-remplacer dans le code VBA de plusieurs classeurs

Bonjour,

Je poste ici car c'est en rapport avec les messages précédents :

Je me bats (comme certains d'entre vous visiblement) pour qu'un bloc de code VBA modifie une autre macro, dans un autre fichier.

J'ai intégré la fonction d'UnprotectVBProject, mais quand je lance ma macro, j'ai une alerte comme quoi le mot de passe est incorrect, et Excel ouvre une boite de dialogue m'invitant à taper le bon mot de passe.
Je mets le même que celui contenu dans l'appel de la fonction UnprotectVBProject, et ça marche.

Le but est que les utilisateurs de la macro ne tapent pas le mot de passe, alors quelqu'un a une idée du pourquoi mon mot de passe est refusé ? :confused:

Merci !
 

jeanpierre

Nous a quitté
Repose en paix
Re : Rechercher-remplacer dans le code VBA de plusieurs classeurs

Bonjour Teppic et Bienvenue sur XLD,

Le but d'un mot de passe, c'est soit pour éviter des manipulations hasardeuses (une seule personne autorisée à modifier, les autres peuvent lire ou remplir les zones autorisées), soit pour éviter d'utiliser si elles n'ont pas les droits....

Dans ton cas, il ne s'agit ni de l'une ni de l'autre (puisque les personnes peuvent utiliser, donc pourquoi un mot de passe qu'il faut entrer mais pas entrer ?)

Donc, soit il ne sert à rien, soit il est mal utilisé et mal placé...

A te lire dans de plus amples explications.

Jean-Pierre
 

Teppic

XLDnaute Nouveau
Re : Rechercher-remplacer dans le code VBA de plusieurs classeurs

En fait, je veux modifier une macro dans un fichier déjà existant. La modif sera faite par une autre macro, lancée par des gens en possession du fichier en question, et ce fichier contient une protection du code avec mot de passe.

La question du pourquoi du mot de passe ne se pose donc pas, il y en a un, et je n'ai pas le choix, malheureusement.
Je dois donc déprotéger le code, faire une modif dedans, puis enregistrer le fichier. Tout ça sera transparent pour l'utilisateur : il se contentera de lancer la macro en cliquant sur un bouton.

Ce que je ne comprends pas, c'est que la fonction UnprotectVBProject, qu'on retrouve un peu partout sur le net, ne reconnaît pas mon mot de passe, qui est pourtant le bon (il fonctionne quand je le tape dans la boite de dialogue appropriée).

Une idée ?
Merci !
 

jeanpierre

Nous a quitté
Repose en paix
Re : Rechercher-remplacer dans le code VBA de plusieurs classeurs

Re,

Ben Unprotect ("ton mot de passe") et pour finir à la fin
protect ("ton mot de passe")...

On peut d'ailleurs abréger...

Et ce, sans boîte de dialogue...

Sinon, tu nous mets ton fichier expurgés des noms réels (remplacés par des nom bidons, pas les mêmes) et ton code....

A te lire.

Jean-Pierre
 

Teppic

XLDnaute Nouveau
Re : Rechercher-remplacer dans le code VBA de plusieurs classeurs

Alors, je ne veux pas déprotéger le document, mais le code VBA du projet ! C'est là tout mon souci justement, il semble que la seule "astuce" soit de simuler une frappe du code au clavier, et c'est là que j'ai mon souci :

Code:
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 & "~~", True
  Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
End Sub

Cette fonction se retrouve partout sur le net, et tout le monde dit qu'elle fonctionne, mais chez moi, elle dit "mot de passe incorrect", alors que je lui donne le bon. Voici l'appel :

Code:
Sub CorrectionPack1()
    
    'On Error GoTo ERROR_NO_FILE
    
    WRK_FN = Range("H12").Text
    
    [B]UnprotectVBProject Workbooks(WRK_FN), "97654321"[/B]
    
    With Workbooks(Range("H12").Text).VBProject.VBComponents("Sheet2").CodeModule
        .ReplaceLine 16, "Worksheets(""BCS Information"").Range(""A1:CC6000"").Select"
    End With
 
    WRK_SN = "Cover"
    
    Workbooks(WRK_FN).Sheets(WRK_SN).Unprotect Password:="14728369"
   
    Workbooks(WRK_FN).Sheets(WRK_SN).Range("A44").Value = "FC1.MTS.29022008"
    
    Workbooks(WRK_FN).Sheets(WRK_SN).Protect Password:="14728369", DrawingObjects:=True, Contents:=True, Scenarios:=True

    ProtectVBProject Workbooks(WRK_FN), "97654321"
    
    Workbooks(WRK_FN).Save
    
    GoTo NO_ERROR
    
ERROR_NO_FILE:
    
    MsgBox ("No file found! - Please open the file before continue.")
    Exit Sub
    
NO_ERROR:
    MsgBox ("MTS File has been updated & saved !!!")
End Sub

Cette fonction, CorrectionPack1(), est lancée par un click sur un bouton. Il n'y a rien de plus, mais ça déconne...

Help :mad::(
 

Discussions similaires

Statistiques des forums

Discussions
311 733
Messages
2 082 015
Membres
101 870
dernier inscrit
Dethomas