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 :
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,...)
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;
Puis :
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.
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);
Puis les ennuis :
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...)
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");
Qu'est-ce que j'ai pu louper ?
Pour info, je suis sur une appli console, sans multithread.
D'avance merci.
Partager