Définir événements dans classeur vierge par prog depuis un autre classeur

Résolu
Signaler
Messages postés
8
Date d'inscription
dimanche 3 juin 2007
Statut
Membre
Dernière intervention
5 juin 2007
-
Messages postés
8
Date d'inscription
dimanche 3 juin 2007
Statut
Membre
Dernière intervention
5 juin 2007
-
Bonjour,

est-il possible d'écrire du code ( par exemple définir des événements) depuis un classeur dans les modules ou objets Excel d'un nouveau classeur crée par code ( Genre "Workbooks.add" ) .

Plus précisément mon but serais que mon application crée un nouveau classeur vierge (ca je sais faire) puis définisse des événements par code dans ce nouveau classeur, notamment dans l' objet Excel "ThisWorkbook".

Cela est-il envisageable ?

Merci d'avance

5 réponses

Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
Salut,
Bien sur c'est possible ne sachant pas trop ce que tu veux faire voici un bout de code pris sur la toile. Avec lui tu saura créer un bouton et son code ......
Tu peux le modifier ou t'en inspirer pour créer ton propre code.
Tu peux aussi si tu le désire écrire dans un classeur fermé en utilisant ADO

'Cet exemple consiste à ajouter une nouvelle feuille, un bouton
'de commande sur cette feuille et le code de l'événement Click
'du bouton.
'Denis Michon, mpfe

Sub Ajouter_Feuille_Bouton()
Dim NouvelleFeuille As Worksheet, NouveauBouton As OLEObject
Dim Code$, NextLine&

'   Ajoute une Nouvelle feuille
    Set NouvelleFeuille = Sheets.Add

'   Ajoute un bouton de Commande
    Set NouveauBouton = NouvelleFeuille.OLEObjects.Add _
      ("Forms.CommandButton.1")
    With NouveauBouton
        .Left = 4
        .Top = 4
        .Width = 100
        .Height = 30
        .Object.Caption = "Retour feuille 1..."
    End With

'   Comment ajouter le code se rapportant au bouton...
    Code = "Sub CommandButton1_Click()" & vbCrLf
    Code = Code & "  On Error Resume Next" & vbCrLf
    Code = Code & "  Sheets(""Feuil1"").Activate" & vbCrLf
    Code = Code & "  If Err <> 0 Then" & vbCrLf
    Code = Code & "   MsgBox ""Impossible d'activer la feuille1.""" & vbCrLf
    Code = Code & "  End If" & vbCrLf
    Code = Code & "End Sub"

'   Ecriture du code dans le module de la feuille (fs)
    With ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule
      NextLine = .CountOfLines + 1
      .InsertLines NextLine, Code
    End With

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
Messages postés
18
Date d'inscription
samedi 2 juin 2007
Statut
Membre
Dernière intervention
22 août 2008

Bonjour,
pour un classeur tout neuf tu peu utiliser AddFromSring...par exemple :

'
' Pour pouvoir exécuter ce code
' rajouter la référence à "Microsof visual Basic 6.0 Extensibility"
'
Sub CreationClasseur()
  Dim wk As Workbook
  Dim st As String
  Set wk = Workbooks.Add
  st = "Private Sub Workbook_BeforeClose(Cancel As Boolean)" & vbCrLf
  st = st & "MsgBox ""On ferme""" & vbCrLf
  st = st & "End Sub"
  wk.VBProject.VBComponents.Add(vbext_ct_ClassModule).CodeModule.AddFromString st
End Sub

Satanas09 ..... Sapristi, saprista, souris grise et face de rat
Messages postés
8
Date d'inscription
dimanche 3 juin 2007
Statut
Membre
Dernière intervention
5 juin 2007

Merci de cette réponse Valtrase , d'autant plus précieuse que je trouve que l'on ne trouve pas beaucoup de réponses sur ces sujets dans l'aide en ligne d'office.
Je vais m'entrainer a partir de cet exemple.

Une petite précision, si possible:

pour définir précisément l'événement "BeforeSave" du classeur cible , comment faudrait-il reécrire la ligne de code suivante (extraite de ton exemple) :

ThisWorkbook.VBProject.VBComponents(ActiveSheet.Name).CodeModule

Merci d'avance..
Messages postés
936
Date d'inscription
lundi 19 janvier 2004
Statut
Membre
Dernière intervention
17 mars 2017
4
Re,
Comme tu peux le constater dans l'exemple cette ligne qui est incomplète dans ta reprise sert à insérer le code que tu as écris
Donc :

'Le With te permet de déterniner dans quel module tu travaille ici le module de la feuille active mais tu peux la nomer (ActiveSheet.Name deviens "Tafeuille"
With ThisWorkbook.VBProject.VBComponents ActiveSheet.Name).CodeModule
'Avec le nextLine on se positionne à la fin du code (s'il existe du code)
      NextLine = .CountOfLines + 1
'Ici tu demande l'insertion du code que tu as créé      
      .InsertLines NextLine, Code
End With

Donc en gros tu ne peux pas utiliser ses lignes sans avoir auparavant créer ton code et l'avoir mis dans la variable Code

Cordialement, Jean-Paul  
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
Messages postés
8
Date d'inscription
dimanche 3 juin 2007
Statut
Membre
Dernière intervention
5 juin 2007

Merci de vos réponses ,

je me met au travail tout de suite pour mettre tout ca en application.

Cordialement, Daniel