Super tout de même code exemple de code.
Je vais essayer avec ça.
Merci pour cette trouvaille
Pour mon compte, effectivement on ne peut rien faire je sais. Surement devrais je changer d'identité afin d'échapper a mes créanciers.
Super tout de même code exemple de code.
Je vais essayer avec ça.
Merci pour cette trouvaille
Pour mon compte, effectivement on ne peut rien faire je sais. Surement devrais je changer d'identité afin d'échapper a mes créanciers.
Bon, je vais essayer d'être calme et tres objectif .... :
ya rien qui marche et tout m'emmerde !
Sinon ... a part ça, tout va bien.
Je ne dois surement pas m'y prendre de la bonne manière.
J'essaie de récuperer ' l'objet ' qui représente le VBAProject sous-jacent a mon fichier excel, afin de l'ouvrir et donc de tenter le coup du 'SendKeys' de l'exemple proposé par blondelle.
Je merdoie.
Any Idea ?
Merci d'avance
Salut Sunchaser:
Alors pour commencer ca fait des heures que cherche et je viens de comprendre comment ca marche.
Les codes que je t'ai passe ne deverouillent que les classeurs sauvegardes par mot de passe et non pas le code VBE.
Par contre je me suis rendu compte que tu pouvait executer une macro d'un projet VBE verouille.
Salut Sunchaser:
Je vais te remonter le moral.
J'ai repris ton post sur VBA car j'ai trouve un code pour proteger/deproteger VBE le seul probleme c'est qu'il faut le faire d'une feuille et on ne peut pas l'executer en pas a pas j'attend donc des renseignements complementaires je te tiend au courant
A+
Bonsoir,
J'ai essayé d'interpreter le code trouvé par Blondelle, ce qui donnerait qqchose comme :
A mon avis, j'ai pas tout bon.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Variant vCB, vVBE; vVBE = vMSExcel.OlePropertyGet("VBE"); vMSExcel.OleFunction("SendKeys","azazel", & "~~"); //vMSExcel est initialisée en amont vCB = vVBE.OlePropertyGet("CommandBars").OlePropertyGet("Item", 1); //attention ... ça va planter ... : vCB.OleFunction("FindControl", 2578, true).OleFunction("Execute"); //et voila ! ça a planté ! lol
M'enfin, c'est toujours mieux que rien ...
@ +
Je n'ai pas encore reussi a deverrouiller VBE par code pure BCB mais je suis arrive a le faire avec une partie en VBE.
Je le fait d'une maniere car il y en a plusieur si tu prefaire autrement dit le.
1 - On charge le Document verrouille
2 - On charge mon Document avec le code VBE de deverrouillage
3 - On execute la macro VBE de deverrouillage
4 - On procede aux modifs
5 - On reverrouille
6 - On ferme le document avec le code de deverrouillage
Le code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Variant vMSExcel, vXLWorkbooks, vXLWorkbook; Variant vFileName, vNotUsed; vNotUsed = Unassigned; vMSExcel = Variant::CreateObject("Excel.Application"); vMSExcel.OlePropertySet("Visible", true); // on ouvre le classeur verrouille vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\Classeur1.xls"; vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks"); vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed, vNotUsed, vNotUsed); // on ouvre le classeur avec le code VBE de deverrouillage vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\Classeur2.xls"; vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed, vNotUsed, vNotUsed); vMSExcel.OleProcedure("Run", "TestUnprotect"); // ici on execute les modifs vMSExcel.OleProcedure("Run", "TestProtect"); // ici on ferme Classeur2.xls
Salut blondelle,
C'est vrai que je n'ai pas remis les pattes dans ce problème ces derniers temps.
Nez en moins, j'aimerais moi aussi trouver une solution a ce truc a première vue anodin ...
Je me demande si on aurait pas plus vite fait de tout code en VBA !
Heu non .... ...
(Vade retro satanas/VBA, il m'énerve tellement celui la que j'en j'y pense, je fait une crise d'urticaire)
Merci de ta persévérance en tout cas
C'est un melange des deux que je te propose regarde mon post precedent il suffit juste dans le code VBE de supprimer a la fin "WB.Save".
et sa marche super bien.
Bon je repost tout.
Le code BCB
Le Code VBE.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 Variant vMSExcel, vXLWorkbooks, vXLWorkbook; Variant vFileName, vNotUsed; Variant vbProj, ID, recursive, WB; vNotUsed = Unassigned; vMSExcel = Variant::CreateObject("Excel.Application"); vMSExcel.OlePropertySet("Visible", true); vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\Classeur1.xls"; vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks"); vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed, vNotUsed, vNotUsed); vFileName = "C:\\Documents and Settings\\blondelle\\Mes documents\\Classeur2.xls"; vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed, vNotUsed, vNotUsed); vMSExcel.OleProcedure("Run", "TestUnprotect"); // on selectionne le Classeur1 pour y faire les modifs vXLWorkbook = vMSExcel.OlePropertyGet("Workbooks", "Classeur1"); vXLWorkbook.OleProcedure("Activate"); // // ici on fait les modifs dans classeur1 // // on selectionne le Classeur2 pour reproteger Classeur1 vXLWorkbook = vMSExcel.OlePropertyGet("Workbooks", "Classeur2"); vXLWorkbook.OleProcedure("Activate"); vMSExcel.OleProcedure("Run", "TestProtect"); // on ferme Classeur2 vMSExcel.OlePropertyGet("ActiveWorkbook").OleFunction("Close");
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 Sub TestProtect() ProtectVBProject Workbooks("Classeur1.xls"), "jp" End Sub Sub TestUnprotect() UnprotectVBProject Workbooks("Classeur1.xls"), "jp" 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:=2578, recursive:=True).Execute End Sub Sub ProtectVBProject(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 "+{TAB}{RIGHT}%V{+}{TAB}" & Password & "{TAB}" & _ Password & "~" Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute ' WB.Save End Sub
On peut par code BCB deverrouiller un code Visual Basic pour Excel.
le code:
Le code n'est pas optimise, il a ete teste sous Window XP Pro Pack1 et Excel 2003
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 Variant vbProj = vXLWorkbook.OlePropertyGet("VBProject"); vMSExcel.OlePropertyGet("VBE").OlePropertyGet("ActiveVBProject") = vbProj; vMSExcel.OlePropertyGet("VBE").OlePropertyGet("MainWindow").OlePropertySet("Visible", true); //vMSExcel.OlePropertyGet("VBE").OlePropertyGet("MainWindow").OlePropertySet("Name", "essais.prn"); vXLWorkbook.OlePropertyGet("VBProject"); //vMSExcel.OlePropertyGet("VBE").OlePropertyGet("CommandBars", 1).OlePropertyGet("FindControl", 2578, true).OleFunction("Execute"); HWND h = FindWindow("wndclass_desked_gsk", NULL); HWND h1 = FindWindowEx(h, NULL, "MsoCommandBarDock", "MsoDockLeft"); HWND h2 = FindWindowEx(h, h1, "MsoCommandBarDock", "MsoDockRight"); HWND h3 = FindWindowEx(h, h2, "MsoCommandBarDock", "MsoDockTop"); // les deux Handles suivant dependent de h3 HWND h4 = FindWindowEx(h3, NULL, "MsoCommandBar", "Standard"); HWND h5 = FindWindowEx(h3, h4, "MsoCommandBar", "Barre de menus"); // on selectionne la Barre de menus SetForegroundWindow(h5); // on active le premier element de la Barre de menus pour cela on simule "Alt" PostMessage(h5, WM_KEYDOWN, VK_MENU, 0); PostMessage(h5, WM_KEYUP, VK_MENU, 0); // on simule la fleche vers la droite pour se deplacer dans le menu PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); // touche enfoncee PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); // touche relachee PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); // on simule la fleche vers le bas pour derouler le menu selectionne PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0); // touche enfoncee PostMessage(h5, WM_KEYUP, VK_DOWN, 0); // touche relachee PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0); PostMessage(h5, WM_KEYUP, VK_DOWN, 0); PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0); PostMessage(h5, WM_KEYUP, VK_DOWN, 0); PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0); PostMessage(h5, WM_KEYUP, VK_DOWN, 0); PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0); PostMessage(h5, WM_KEYUP, VK_DOWN, 0); // on simule la touche entree pour afficher la boite de dialogue // touche enfoncee PostMessage(h5, WM_KEYDOWN, VK_RETURN, 0); PostMessage(h5, WM_KEYUP, VK_RETURN, 0); // touche relachee // ici la boite de dialogue est ouverte // on recupere le Handle de la premiere page de la boite de dialogue Sleep(500); // voir ci dessus SendMessage ? HWND h66 = FindWindow("#32770", "VBAProject Mot de passe"); HWND h77 = FindWindowEx(h66, NULL, "Edit", NULL); HWND h88 = FindWindowEx(h66, NULL, "Button", "OK"); // mot de passe String MPassWord = "jp"; // on selectionne le TEdit Mot de passe SendMessage(h77, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str()); //Sleep(500); // ici on valide par OK // le programme est verrouille // on donne le Focus au Boutton "OK" SetForegroundWindow(h88); // on simule la touche entree keybd_event(VK_RETURN,0,0,0); keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); Sleep(1000); HWND h6 = FindWindow("#32770", "VBAProject - Propriétés du projet"); HWND h7 = FindWindowEx(h6, NULL, "#32770", NULL); // on selectionne la Boite de dialogue SetForegroundWindow(h7); // on simule la combinaison Shift+Tab keybd_event(VK_SHIFT,0,0,0); keybd_event(VK_TAB,0,0,0); keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0); keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0); // on envoye le code clavier pour changer de page // fleche vers la droite keybd_event(VK_RIGHT,0,0,0); // temporisation de stabilisation du changement de page Sleep(500); // voir ci dessus SendMessage ? // ici on recupere le Handle de la deuxieme page de la boite de dialogue // on recupere le Handle des TEdit pour y inscrire le Password HWND h8 = FindWindowEx(h6, NULL, "#32770", NULL); HWND h9 = FindWindowEx(h8, NULL, "Button", "&Verrouiller le projet pour l'affichage"); HWND h10 = FindWindowEx(h8,h9, "Edit", NULL); HWND h11 = FindWindowEx(h8, h10, "Edit", NULL); HWND h12 = FindWindowEx(h6, NULL, "Button", "OK"); // on donne le Focus au CheckBox SetForegroundWindow(h9); // on simule l'appui de la barre d'espace pour cocher le CheckBox keybd_event(VK_SPACE,0,0,0); keybd_event(VK_SPACE,0,KEYEVENTF_KEYUP,0); // mot de passe //String MPassWord = "Mot_Pass"; // on selectionne le TEdit Mot de passe SendMessage(h10, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str()); // on selectionne le TEdit Confirmer le mot de passe SendMessage(h11, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str()); // ici on valide par OK // le programme est verrouille // on donne le Focus au Boutton "OK" SetForegroundWindow(h12); // on simule la touche entree keybd_event(VK_RETURN,0,0,0); keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
Trop fort ...
Je vais tester cela pour mon 'problème'.
Merci !
Salut Sunchaser:
Quelle version d'Excel utilise tu ?
Excel 2003 ...
Donc ça devrais le faire, non ?
Oui bien sur J'aurais aime que quelqu'un le teste avec une autre version d'Excel c'est pour cela que je l'ai laisse tel qu'il a ete ecrit sans chercher a l'optimiser.
Si tu le souhaite je pourrais tenter d'expliquer comment j'ai fait.
au passage je remercie Furlaz, lanonime, cgi et Djob pour leurs differents post dans le Forum ce qui fortement aide je tiens a rester modeste.
Impec !
C'est ce qu'il me fallait ...
Merci,
Bravo blondelle
@ +
Je suis content pour toi.
Je vais essayer de faire un topo sur la methode, mais aussi sur l'utilisation de SPY++, quand on sait l'utiliser c'est genial.
Si tu fait des modifs pour optimiser tiens mois au courant je pense le mettre soit pour la FAQ soit en source les modos decideront.
Partager