OVH Cloud OVH Cloud

Eviter l'ouverture de VBE lors de la copie d'un module

5 réponses
Avatar
Eric RENAUD
Bonjour,

Je colle du code VBA (depuis perso.xls) vers le module de la feuille active
du classeur actif.
Cela fonctionne très bien mais lorsque le programme a fini de copier le
code, il m'ouvre systématiquement l'éditeur VBE ce qui n'est pas mon
souhait.
Existe t'il une astuce pour éviter ce phénomène d'ouverture ?
D'avance merci

5 réponses

Avatar
michdenis
Bonjour Éric,

Tu as essayé quelque chose dans le genre :

Copie le module d'un classeur à l'autre

'----------------------------------
Sub CopieCodeModule()

With Workbooks("Perso.xls").VBProject.VBComponents("Module1")
.Export ("c:test.bas")
End With
With Workbooks(ThisWorkbook.Name).VBProject.VBComponents
.Import "c:test.bas"
End With

'Détruit le fichier intermédiaire
Kill "C:test.bas"
End Sub
'----------------------------------


Salutations!



"Eric RENAUD" a écrit dans le message de news:
Bonjour,

Je colle du code VBA (depuis perso.xls) vers le module de la feuille active
du classeur actif.
Cela fonctionne très bien mais lorsque le programme a fini de copier le
code, il m'ouvre systématiquement l'éditeur VBE ce qui n'est pas mon
souhait.
Existe t'il une astuce pour éviter ce phénomène d'ouverture ?
D'avance merci
Avatar
Eric RENAUD
Ton exemple crée un module standard mais dans mon cas, je veux ajouter le
code au niveau Worksheet de la feuille active pour avoir un évenement sur
SelectionChang
Je copie donc le code ci-dessous dans la feuille active pour avoir
l'évenement Private Sub WorkSheet_SelectionChange(ByVal Target As Range)
Le code à insérer est stocké dans la variable S (pas de problème)
Mon code :
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
' nom de l'événement, type de module concerné ("Worksheet")
'n° ligne du début de la proc
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")
'insérer le texte du code
.InsertLines DebutCode + 1, S
End With
Tout marche parfaitement sauf que l'éditeur VBE s'ouvre à la fin de la copie
(mais pas dan ton exemple car c'est un module standard)


"michdenis" a écrit dans le message de news:
#
Bonjour Éric,

Tu as essayé quelque chose dans le genre :

Copie le module d'un classeur à l'autre

'----------------------------------
Sub CopieCodeModule()

With Workbooks("Perso.xls").VBProject.VBComponents("Module1")
.Export ("c:test.bas")
End With
With Workbooks(ThisWorkbook.Name).VBProject.VBComponents
.Import "c:test.bas"
End With

'Détruit le fichier intermédiaire
Kill "C:test.bas"
End Sub
'----------------------------------


Salutations!



"Eric RENAUD" a écrit dans le message de
news:

Bonjour,

Je colle du code VBA (depuis perso.xls) vers le module de la feuille
active

du classeur actif.
Cela fonctionne très bien mais lorsque le programme a fini de copier le
code, il m'ouvre systématiquement l'éditeur VBE ce qui n'est pas mon
souhait.
Existe t'il une astuce pour éviter ce phénomène d'ouverture ?
D'avance merci





Avatar
Alain CROS
Bonjour

Private Declare Function LockWindowUpdate& Lib "user32" (ByVal hwndLock&)
Private Declare Function GetDesktopWindow& Lib "user32" ()

Sub test()
Dim S$, DebutCode&
S = "MsgBox ""Bonjour"""
LockWindowUpdate GetDesktopWindow
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
' nom de l'événement, type de module concerné ("Worksheet")
'n° ligne du début de la proc
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")
'insérer le texte du code
.InsertLines DebutCode + 1, S
End With
Application.VBE.MainWindow.Visible = False
LockWindowUpdate 0&
End Sub

Alain CROS
Avatar
michdenis
Bonjour Alain,

J'ai testé les API avec ceci : Une procédure qui ne fait qu'ajouter un " module standard " au projet. Le résultat est
que ce module devient la fenêtre active à la fin de la procédure ... Est-ce que j'ai raté quelque chose ?

'----------------------------
Private Declare Function LockWindowUpdate& Lib "user32" (ByVal hwndLock&)
Private Declare Function GetDesktopWindow& Lib "user32" ()

'----------------------------
Sub InsérerUnmodule()

LockWindowUpdate GetDesktopWindow
ThisWorkbook.VBProject.VBComponents.Add (1)
LockWindowUpdate 0&

End Sub
'----------------------------


Merci pour ta collaboration.


Salutations!







"Alain CROS" a écrit dans le message de news:
Bonjour

Private Declare Function LockWindowUpdate& Lib "user32" (ByVal hwndLock&)
Private Declare Function GetDesktopWindow& Lib "user32" ()

Sub test()
Dim S$, DebutCode&
S = "MsgBox ""Bonjour"""
LockWindowUpdate GetDesktopWindow
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
' nom de l'événement, type de module concerné ("Worksheet")
'n° ligne du début de la proc
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")
'insérer le texte du code
.InsertLines DebutCode + 1, S
End With
Application.VBE.MainWindow.Visible = False
LockWindowUpdate 0&
End Sub

Alain CROS
Avatar
michdenis
Une solution trouvée sur le site de http://www.cpearson.com. Existe-t-il une autre façon de procéder ?

'-------------------------
Sub AjouterUnModule()

Dim VBComp As Object
Set VBComp = ThisWorkbook.VBProject.VBComponents.Add(1)
VBComp.Name = "Denis"
Application.Visible = True

End Sub
'-------------------------

Avec cette note explicative :

When you run this code from Excel while the VBE is open, you will be taken to the new module's code module, and the
macro will terminate. When you run this code while the VBE is not open, your Excel application will be visible, but
will not have focus. The statement returns focus back to the Excel application


Salutations!





"michdenis" a écrit dans le message de news:%
Bonjour Alain,

J'ai testé les API avec ceci : Une procédure qui ne fait qu'ajouter un " module standard " au projet. Le résultat est
que ce module devient la fenêtre active à la fin de la procédure ... Est-ce que j'ai raté quelque chose ?

'----------------------------
Private Declare Function LockWindowUpdate& Lib "user32" (ByVal hwndLock&)
Private Declare Function GetDesktopWindow& Lib "user32" ()

'----------------------------
Sub InsérerUnmodule()

LockWindowUpdate GetDesktopWindow
ThisWorkbook.VBProject.VBComponents.Add (1)
LockWindowUpdate 0&

End Sub
'----------------------------


Merci pour ta collaboration.


Salutations!







"Alain CROS" a écrit dans le message de news:
Bonjour

Private Declare Function LockWindowUpdate& Lib "user32" (ByVal hwndLock&)
Private Declare Function GetDesktopWindow& Lib "user32" ()

Sub test()
Dim S$, DebutCode&
S = "MsgBox ""Bonjour"""
LockWindowUpdate GetDesktopWindow
With ActiveWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
' nom de l'événement, type de module concerné ("Worksheet")
'n° ligne du début de la proc
DebutCode = .CreateEventProc("SelectionChange", "WorkSheet")
'insérer le texte du code
.InsertLines DebutCode + 1, S
End With
Application.VBE.MainWindow.Visible = False
LockWindowUpdate 0&
End Sub

Alain CROS