Macro pour accéder à VBE ?

B

Blandine

Guest
Salut à tous

Quel code de macro permet de lancer Visual Basic d'Excel
et de pointer sur le module1 ?

MERCI...
Blandine
 
T

Ti

Guest
Avec cette procédure tu peux accéder directement au module indiqué en activant sa fenêtre, sans passer par les SendKeys

Sub AccesModule()
Dim VBComps As VBComponents
Set VBComps = ThisWorkbook.VBProject.VBComponents
VBComps("Module2").Activate
End Sub

Pour lister tous les modules de code du fichier :

Dim VBComps As VBComponents
Dim Comp As VBComponent
Set VBComps = ThisWorkbook.VBProject.VBComponents
For Each Comp In VBComps
'on ne liste que les modules de code standard
If Comp.Type = vbext_ct_StdModule Then
'initialise par exemple un listbox pour lister les modules présents
ListBox1.AddItem Comp.Name
End If
Next Comp
 
B

Blandine

Guest
MERCI à vous 3 et surtout Ti, ces 2 procédures sont superbes !

2 questions se posent maintenant :

1 - Avec ce dernier exemple, j'ai essayé d'ouvrir le code d'un UserForm existe-t-il un moyen pour voir directement le code sans passer par l'affichage de l'objet ?

2 - Je fais un prog. qui me permet de mettre à jour un autre prog. par l'intermédaire de remplacement de Userform :
Les actions pour remplacer un UserForm existant sont :

Set MiseAjour = "UserForm1"

.REMOVE.....VBComponents("MiseAjour ")
.IMPORT......Chemin & "\" & MiseAjour & ".frm"

2a - Si j'ouvre en premier le fichier de mise à jour puis j'ouvre le fichier à mettre à jour et je lance la procédure, tout ce passe bien

2b -Tandis que je souhaite ouvrir le fichier à mettre à jour, j'ai programmé que si il existait un fichier de mise à jour, l'ouvrir et exécuter la procédure...
Et bien dans ce dernier cas il sort une erreur :

Erreur au cours du chargement, reportez-vous à UserForm1.log
pour plus de détail.
...et dans ce fichier .log il est dit :
Le nom UserForm de la feuille est déjà utilisé ; impossible de charger cette feuille.

et en effet dans le cas 2b, l'action .REMOVE du UserForm1 ne s'est pas effectué!

MERCI à ceux qui connaissent...
BLandine
 
T

Ti

Guest
Pour répondre à ta question 1, voici ma procédure modifiée :

Sub AccesModule2(Module As String)
Dim VBComps As VBComponents
Set VBComps = ThisWorkbook.VBProject.VBComponents
VBComps(Module).CodeModule.CodePane.Show
End Sub

Sub AppelModule3()
AccesModule2 "Module3"
End Sub

Sub AppelForm()
AccesModule2 "UserForm1"
End Sub

Pour ta question 2, difficile de répondre comme ça, il faudrait voir avec un exemple réel, donc si tu peux joindre un fichier...
 
T

Ti

Guest
Bon, ben voilà, en fait il s'agit probablement d'un bug gênant d'Excel, qui garde en mémoire le module qui vient d'être supprimé (j'ai déjà eu à batailler ferme contre le même problème en utilisant EnvelopeVisible). Pour contourner le problème, je renomme le module avant de le supprimer et de l'importer depuis le fichier mis à jour, comme ça tout se passe bien.
Ci joint le fichier corrigé
 

Pièces jointes

  • MAJ.zip
    31.8 KB · Affichages: 36
  • MAJ.zip
    31.8 KB · Affichages: 33
  • MAJ.zip
    31.8 KB · Affichages: 35
B

Blandine

Guest
Superbe Ti,

MERCI pour t'être penché sur ce programme et c'est très sympa d'avoir modifié du code ailleurs et les différents commentaires.

J'ai testé avec succès les 2 fichier OLD et MAJ

Mais appliqué sur un autre fichier, lors du Remplacement d'un module le fait de le renomer...temp je me trouve avec 2 modules portant des noms différents VarGlobal et le fameux VarGlobaltemp
et bien naturellement excel plante puisqu'il trouve des noms ambigus puisque leurs contenus sont quasiemment les mêmes...

Vois-tu quelle modif apportées afin d'éliminer à coup sûr le module ainsi renommer ?

MERCI encore merci...
Blandine
 
B

Blandine

Guest
De plus de mon soucis actuel, j'en ai un autre :

Quel modification du code pour remplacer un
module dans un VBAProject protéger par MOT DE PASSE ?

J'ai essayé en vain le code :

Workbooks(Fichier_OLD).VBProject.Unprotect Password:="TEST"


MERCI...
BLandine
 
S

STéphane

Guest
bonjour

il y a moyen tordu de le faire, vous pourrez trouver un exemple je pense chez fréd sigonneau

je pense avoir mis une des premières versions de cette bidouille également sur mon site il y a fort longtemps



bye
stephane
 
G

Gérard

Guest
Il doit certainement s'agir de ce code
'=================================================
'Laurent Longre, mpfe
Private Declare Function FindWindowA Lib "User32" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long

Private Declare Function GetForegroundWindow Lib "User32" () As Long

Private Declare Function SetForegroundWindow Lib "User32" _
(ByVal hWnd As Long) As Long

Function Déprotège(Classeur As String, MdP As String) As Boolean

Dim XLhWnd As Long, VBEhWnd As Long, CurhWnd As Long
Dim Wbk As Workbook

On Error Resume Next
Set Wbk = Workbooks(Dir$(Classeur))
On Error GoTo Fin
If Not Wbk Is Nothing Then
If Wbk.FullName <> Classeur Then Exit Function
If Not Wbk.Saved Then Wbk.Save
Else: Application.ScreenUpdating = False
End If

CurhWnd = GetForegroundWindow
XLhWnd = FindWindowA(vbNullString, Application.Caption)

With Application.VBE
VBEhWnd = FindWindowA(vbNullString, .MainWindow.Caption)
If CurhWnd = XLhWnd Then SetForegroundWindow VBEhWnd
.CommandBars.FindControl(ID:=2557).Execute
' NE PAS EFFACER, même si le classeur est déjà ouvert !!!!!!
Workbooks.Open Classeur
If ActiveWorkbook.VBProject.Protection = vbext_pp_locked Then
SendKeys "~" & MdP & "~", True
.ActiveCodePane.Window.Close
End If
End With

SetForegroundWindow CurhWnd
Déprotège = True
Exit Function

Fin:
End Function

Sub test()

' Déprotection du projet VBA C:\Temp\Test.xls (mot de passe "Zaza"),
' Ajout d'un module standard dans ce projet, puis rétablissement
' de la protection

Const Classeur = "C:\Temp\Test.xls"
If Not Déprotège(Classeur, "zaza") Then
MsgBox "Erreur"
Else
MsgBox "Projet VBA déprotégé."
With Workbooks(Dir$(Classeur))
.VBProject.VBComponents.Add vbext_ct_StdModule
.Close True
End With
Workbooks.Open Classeur
MsgBox "Projet reprotégé, ajout d'un module standard."
End If

End Sub

'=================================================

'Sub essai()
'Fichier = Workbooks("Classeur3.xls").FullName
'MsgBox Fichier
'End Sub
 

Discussions similaires

Réponses
3
Affichages
282
Réponses
2
Affichages
572

Statistiques des forums

Discussions
313 105
Messages
2 095 348
Membres
106 246
dernier inscrit
Christelle CUPIT