IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Intégration d'une private sub "Worksheet_Change" via une macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut Intégration d'une private sub "Worksheet_Change" via une macro
    Bonjour
    J'ai une sub "Worksheet_Change" qui est fonctionnelle.
    Je voudrais intégrer cette dernière dans un nouveau fichier de manière automatique.
    Je ne sais pas comment faire pour que cette dernière s'applique.

    Pour être plus clair j'ai un fichier ("fichier source") dans lequel se trouve un bouton qui execute une macro.
    Dans cette macro un nouveau fichier s'ouvre ("fichier cible"). Dans un des onglets de ce fichier deux, je souhaite associé la private sub ci dessous.

    Merci de m'aider

    ci dessus ma private sub
    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
        Dim laLigne As Integer, laColonne As Integer
        Dim d
     
        laLigne = Target.Row
        laColonne = Target.Column
     
    Range("a1") = laLigne
    Range("a2") = laColonne
     
        d = 1
        While Cells(74, d + 1) <> ""
        d = d + 1
        Wend
            If laLigne < 12 And laLigne > 1 And laColonne < 14 And laColonne > 6 Then
                ActiveSheet.ChartObjects("Graphique 1").Activate
                ActiveChart.SeriesCollection(1).Values = Range(Cells(laLigne + 72, 1), Cells(laLigne + 72, d))
                ActiveChart.ChartTitle.Text = "Génératrice " & laColonne - 6 & " ligne " & laLigne
            Else
            End If
    Cells(laLigne, laColonne).Select
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    Tu ne pourrais pas créer un fichier "Template" avec la macro déjà intégrée et que tu ouvres et remplis au besoin avec ta macro plutôt que d'en créer un nouveau ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    je ne connais pas les fichiers "template". Peux tu m'expliquer qu'est ce que tu entends par ce terme ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    En fait c'est une feuille modèle qui a les mêmes configurations mais sans les données modifiables.
    Celle-ci peut être masquée.
    Il suffit d'en faire une copie dans le même classeur ou dans un nouveau et d'y copier les données que tu souhaites.

    Attention aussi: les Sub Worksheet_Change et Worksheet_SelectionChange sont bien différentes
    Dans ton message tu parles de Change et ton code montre SelectionChange

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    je ne vois pas trop comment l'appliquer dans mon cas.
    Y'aurait il une autre solution ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Parallèlement aux macros qu'on retrouve dans chaque feuille (Change, SelectionChange), on a aussi les mêmes au niveau du classeur dans ThisWorkbook
    Une différence est le paramètre Sh as Worksheet qui définit sur quelle feuille le code va s'appliquer
    C'est peut-être une solution à ton problème(?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
     
    End Sub
     
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
     
    End Sub

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    Ce qui me manque dans la macro est de dire que la "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" s'applique à la feuille nommée "Tableau".
    Je n'arrive pas à appeler pour appliquer la Private Sub Worksheet_SelectionChange(ByVal Target As Range) dans ma macro. Il me demande des arguments mais je ne sais pas quoi mettre dedans....
    peux tu me donner un exemple ou on appelle cette private sub en mettant en exemple les arguments à mettre à l'intérieur.
    Merci par avance

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
       If Sh.Name <> "Tableau" Then Exit sub
       'ton code...
    End Sub

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    Merci pour le retour mais cela ne va pas marcher car cette sub est placé dans mon fichier source et que je souhaite que celle ci s'applique dans mon fichier cible.
    Pour être plus clair j'ai :
    Fichier source à l'intérieur duquel j'ai un bouton qui execute la macro 1.
    la macro 1 ouvre un fichier cible et effectue un certain nombre d'opérations sur ce fichier cible.
    Je souhaiterais donc appliquer de manière automatique la sub "Worksheet_SelectionChange(ByVal Target As Range) uniquement sur ce fichier cible .
    Pour moi, je devrais intégrer cette sub dans ma macro1 mais je ne sais pas comment l'appeler.
    J'ai mis dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheet_SelectionChange
    et le débogueur m'indique que je dois mettre des arguments que je ne connais pas. Je ne sais pas à quoi correspond (ByVal Target As Range).
    Est ce plus clair ? avez vous une solution ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    dans ton poste tu parle d'un nouveau fichier?

    si c'est un nouveau registre ton fichier en tant que modèle!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set NewWb=application.workbooks.add("C:Monrep\MoFichier.xltm")
    et la c'est ton modèle qui détient tes macros!

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Worksheet_SelectionChange s'active lorsque tu sélectionnes une cellule, pas quand tu changes la valeur d'une cellule.
    Est-ce bien ce que tu veux ?

    Target est la cellule qui est activée (sélectionnée) dans cas-ci.
    Dans Worksheet_Change, c'est la cellule qui a été modifiée.

    Question: Est-ce que le fichier-cible est toujours le même ?
    Si oui, tu pourrais y mettre la macro dans celui-ci et tu changes la valeur d'une cellule (ou sélectionne) dans ce fichier à partir de ton programme source.
    Ça aura pour effet de déclencher cette macro.

    Peut-être y aurait-il lieu de repenser le tout (?)

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    oui c'est bien ce que je veux.

    le problème est que le fichier cible n'a jamais le même nom. Il faut donc que je trouve un moyen pour intégrer cet événement pour chaque nouveau fichier cible.

    A titre d'info, quand je fais un copier coller dans le fichier cible de cet événement ca fonctionne sans problème. Seulement cette méthode n'est pas envisageable pour mon cas et je dois trouver un moyen pour le faire automatiquement.

  13. #13
    Invité
    Invité(e)
    Par défaut
    et en utilisant un modèle comme dit plus haut?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    je ne sais pas utiliser les fichiers modeles...
    Ceci étant, meme si les macros sont contenus dedans, etant donnés qu'il s'agit d'un événement qui est applicable que sur le fichier cible qui a toujours de snoms différents, ca parait peu problable que cela fonctionne.
    Le plus simple serait de trouver une méthode pour appliquer cet événement (qui est présent dans le fichier source) dans le fichier cible...

  15. #15
    Invité
    Invité(e)
    Par défaut
    quand tu ouvre un excel tu à classeur1 et tu l'enregistre sous la cible!
    si tu ne sais pas fair un modèle comme Classeur1 alor enregistre un fichier en xlsm et utilise le dan la méthode add quand tu l'enregistreras vers ta cible il contiendra forcément les macro!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set NewWb=application.workbooks.add("C:Monrep\MoFichier.xlsm")

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    sauf erreur de ma part, ton code proposé permet d'ouvrir le fichier source ou se trouve les macros.
    OK.
    Encore une fois, cet événement se trouve dans le fichier source.
    Ce fichier source est tjs ouvert. On a donc toujours acces à ces macros de base.
    Seulement (je n'ai jamais eu le cas) je n'arrive pas à appliquer cet événement sur mon fichier cible en alllant le chercher sur le fichier source.
    Pour moi, un événement doit se trouver dans le fichier en question (dans la feuille ou thisworkbook) pour qu'il soit appliquer. Je ne sais pas appliquer ou appeler un événement se trouvant dans un fichier autre que le fichier sur lequel je souhaite qu'il soit appliquer.

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Si tu tiens absolument à copier du code de ton fichier source à ton fichier cible, voici un exemple qui va copier le code de Feuil1

    Ça prend une référence à Microsoft Visual Basic for Application Extensibility 5.3

    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
    Sub CopieModule()
        Dim VBProjFrom As VBIDE.VBProject
        Dim VBProjTo As VBIDE.VBProject
        Dim CodeModFrom As VBIDE.CodeModule
        Dim CodeModTo As VBIDE.CodeModule
        Dim Texte As String
        Dim EL As Long ' dernière ligne de code
        Dim Fichier
     
        Fichier = Application.GetOpenFilename() ' ouvre le fichier cible
        If Fichier = "Faux" Then Exit Sub
        Workbooks.Open Fichier
     
        Set VBProjTo = ActiveWorkbook.VBProject
        Set CodeModTo = VBProjTo.VBComponents("Feuil1").CodeModule
        CodeModTo.DeleteLines 1, CodeModTo.CountOfLines  'Efface le code déjà présent
     
        Set VBProjFrom = ThisWorkbook.VBProject
        Set CodeModFrom = VBProjFrom.VBComponents("Feuil1").CodeModule
     
        With CodeModFrom
            EL = .CountOfLines
            Texte = .Lines(1, EL)
     
            CodeModTo.AddFromString Texte
        End With
     
        Set CodeModFrom = Nothing
        Set CodeModTo = Nothing
        Set VBProjFrom = Nothing
        Set VBProjTo = Nothing
     
    End Sub

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    le fichier cible se nomme : Macro.xlsm et que l'événement se trouve sur la "Feuil3"

    Je souhaite appliquer cet événement sur le fichier actif sur la feuille nommée "Tableau"

    Merci de modifier le code stp et de me l'adapter stp

  19. #19
    Invité
    Invité(e)
    Par défaut
    J'avoue que je suis complètement dépassé! Je ne comprends rien! Que vient faire thisworkbook?

    Pour certains programmeurs utilisent des macros complémentaires? Si tu utilises un fichier modifier modèle xltm ou xlsm,'tes macro sont dedans, tu fais ton traitement avec et tu enregistre sous!

    Enfin tu as surement raison mais comme je ne comprends pas...

    Surtout que plus haut tu parles de niveau classeur!

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 268
    Par défaut
    le thisworkbook permet d'appliquer ces événements sur l'ensemble des feuilles du fichier excel.
    si on attribue un événement dans une feuille, cet événement n'est pas valable que sur cette feuille.

    pour le moment j'ai toujours pas ma solution, je galère..........

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2003] Paramètres d'une Private Sub à une autre
    Par Arola78 dans le forum VBA Access
    Réponses: 4
    Dernier message: 12/05/2009, 23h50
  2. [AC-2007] Appeler une Private Sub "AfterUpdate"
    Par jpg75014 dans le forum VBA Access
    Réponses: 9
    Dernier message: 04/04/2009, 08h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo