Bonjour,

Pour mon travail, je dois modifier un grand nombre (un millier) de fichiers Excel, contenant des macros. Ces projets VBA sont protégés par mot de passe.

J'ai trouvé un moyen de "virer" le mot de passe via des Sendkeys, mais les instructions qui suivent plantent systématiquement "erreur, impossible d'exécuter tant que le projet est protégé".

Curieusement, si je relance à partir de ce point, sans AUCUNE modification, tout se passe bien. De même, si j'exécute pas à pas, ça fonctionne sans erreur.

Bref, je comprends plus rien...

Ci-dessous un extrait du code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
 static Excel.Application XLapp=new Excel.Application();
 static Excel.Workbook XLClasseur;
 static Excel.Worksheet XLFSecu;
 static int SL,SC,EL,EC;
XLapp, XLClasseur et XLFSecu sont ensuite renseignées correctement. Pour preuve, des modifications sur la structure des feuilles Excel sont effectuées sans problème (ajout de colonnes, mises en forme,...)

Puis :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
XLapp.SendKeys("%{F11}",true);  // VBA
XLapp.SendKeys("%OE",true);     // option de projet
XLapp.SendKeys("MotDePasse~",true);  // mot de passe
XLapp.SendKeys("+{TAB}{RIGHT}{TAB} "); //déprotège
XLapp.SendKeys("{TAB}{BS}{TAB}{BS}"); // vire les mots de passe
XLapp.SendKeys("~",true);          // entrée
XLapp.SendKeys("{F7} ", true);// voir le code
XLapp.SendKeys("%{F11}", true);
Déprotège le doc. L'avant dernière ligne permet notamment d'afficher le code VBA et donc de vérifier que la page est déprotégée correctement.

Puis les ennuis :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
SL = 1; SC = 1; EL = 999; EC = 999;
XLClasseur.VBProject.VBComponents.Item(1).CodeModule.Find("A1:J35",ref SL,ref SC,ref EL,ref EC);
XLClasseur.VBProject.VBComponents.Item(1).CodeModule.ReplaceLine(SL, "      Feuil9.PageSetup.PrintArea = \"A1:L35\" \' on imprimera 2 pages");
Donc, ça plante. Je relance ça fonctionne. J'exécute en pas par pas ça fonctionne. (mais une boucle sur 1000 feuilles en pas par pas, pas trop chaud...)

Qu'est-ce que j'ai pu louper ?

Pour info, je suis sur une appli console, sans multithread.

D'avance merci.