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égrer une macro dans une autre [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Par défaut Intégrer une macro dans une autre
    Bonjour,

    Grâce à ce forum, j'ai pu créer mon formulaire.

    Mon problème actuel est que j'aimerais figer la date pour que l'utilisateur retrouve une tracabilité de ses demandes.

    On m'a conseillé la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Macro1()
    Range("I6").Select
    SendKeys "^;~"
    End Sub
    qui fonctionne très bien si je l'affecte à un bouton seul.

    Seulement voilà, je souhaite avoir un seul bouton à cliquer pour exécuter une suite d'action.

    Actuellement j'ai un bouton qui exécute la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Bouton_demande()
     
        If Worksheets("aaa").[A1] <> "" Then
            ActiveWorkbook.SaveAs Filename:="U:\d" & Format(DateAdd("D", 0, Date), "YYYYMMDD") & Format(Now, "hhmm") & ".xls"
            ActiveWorkbook.SendMail Recipients:=Array("name@dddd.com"), Subject:="x"
            ActiveWorkbook.Close
        Else
            MsgBox "Des cases obligatoires ne sont pas remplies !"
            Range("C7").Select
        End If
     
    End Sub
    Est-ce possible de "bidouiller" pour que le bouton "envoi de la demande" exécute toutes les actions :
    figer la date
    enregistrer le fichier
    envoyer la demande
    ...

    Merci !

  2. #2
    Membre éclairé Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Par défaut
    bonjour,

    Est-ce possible de "bidouiller" pour que le bouton "envoi de la demande" exécute toutes les actions :
    figer la date
    enregistrer le fichier
    envoyer la demande
    une macro peut en appeler autant qu'elle le souhaite, la seul contrainte, avoir accès à l'autre.

    Pour cela:

    Si tes macros sont dans le meme module:

    Tes macros peuvent être déclarer Private et s'appeler
    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
    Private Sub Macro1()
    Range("I6").Select
    SendKeys "^;~"
    End Sub
     
    Private Sub Bouton_demande()
     
        If Worksheets("aaa").[A1] <> "" Then
            ActiveWorkbook.SaveAs Filename:="U:\d" & Format(DateAdd("D", 0, Date), "YYYYMMDD") & Format(Now, "hhmm") & ".xls"
            ActiveWorkbook.SendMail Recipients:=Array("name@dddd.com"), Subject:="x"
            ActiveWorkbook.Close
        Else
            MsgBox "Des cases obligatoires ne sont pas remplies !"
            Range("C7").Select
        End If
     
    Macro1 'appelle la Macro1
     
    End Sub
    Cependant si ta Macro1 n'est pas dans le meme module, déclare la Public pour y avoir acces:

    Module1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub Macro1()
    Range("I6").Select
    SendKeys "^;~"
    End Sub
    Module2:
    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
     
    Private Sub Bouton_demande()
     
        If Worksheets("aaa").[A1] <> "" Then
            ActiveWorkbook.SaveAs Filename:="U:\d" & Format(DateAdd("D", 0, Date), "YYYYMMDD") & Format(Now, "hhmm") & ".xls"
            ActiveWorkbook.SendMail Recipients:=Array("name@dddd.com"), Subject:="x"
            ActiveWorkbook.Close
        Else
            MsgBox "Des cases obligatoires ne sont pas remplies !"
            Range("C7").Select
        End If
     
    Macro1 'appelle la Macro1
     
    End Sub
    voila

    bastien

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Par défaut
    Bonjour et merci pour la réponse !

    Ca ne marche pas, du moins pas systématiquement...

    J'ai commencé par "nettoyer" tous mes modules car j'en avais beaucoup trop et surtout à double, voir à triple... Il m'en reste 3 :

    module 1
    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
    Private Sub Bouton_demande()
     
        If Worksheets("marchandise").[A1] <> "" Then
     
     
            ActiveWorkbook.SaveAs Filename:="U:\f" & Format(DateAdd("D", 0, Date), "YYYYMMDD") & Format(Now, "hhmm") & ".xls"
            ActiveWorkbook.SendMail Recipients:=Array("nom@aaa"), Subject:="x"
            ActiveWorkbook.Close  
        Else
     
            MsgBox "Des cases obligatoires ne sont pas remplies !"
            Range("C7").Select      
        End If
     
     Macro1
    End Sub
    Module 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Workbook_Beforeclose(Cancel As Boolean)
    If Range("A1") = "" Then
    Cancel = True
    MsgBox "Vous devez remplir A1 !"
    End If
    End Sub
    Module 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub Macro1()
    Range("I6").Select
    SendKeys "^;~"
    End Sub
    Le lien entre le module 1 et le module 2 se fait très bien, si A1 est vide, le classeur ne s'envoie pas...

    Par contre, lorsque j'ouvre le classeur enregistré, la date indique auourdhui()...

    J'ai sûrement fait faux mais je ne sais plus où chercher...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 141
    Par défaut Cells(6, 9) = Date
    Citation Envoyé par EmmanuelleFFH Voir le message
    "envoi de la demande" exécute toutes les actions :
    figer la date
    enregistrer le fichier
    envoyer la demande
    Vu l'ordre des actions, il est demandé de d'abord figer la date.
    Donc il faut d'abord appeler Macro1 immédiatement après être entré dans Bouton_demande()
    plutôt qu'attendre la fin parce qu'à ce moment là, la feuille de calcul active a déjà été sauvegardée sans la date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Bouton_demande()
        Macro1
        If Worksheets("aaa").[A1] <> "" Then
    On a mis l'appel de Macro1 avant le If.
    Il faut voir s'il faut le mettre à l'intérieur du If dans la partie Then juste avant la sauvegarde
    ou comme c'est le cas actuellement, si on peut figer la date même si des cases obligatoires ne sont pas remplies.

    Citation Envoyé par EmmanuelleFFH Voir le message
    Ca ne marche pas, du moins pas systématiquement...
    Concernant l'aspect non systématique, le SendKeys peut dans certain cas être trop lent.

    On risque d'enchaîner les instructions qui suivent sans être sûr que le Sendkeys a bien terminé ce qu'on lui demande d'envoyer, d'où le dernier paramètre optionnel Wait à True pour forcer l'attente de la fin d'exécution du SendKeys.
    Parfois on est même obligé de faire suivre le SendKeys par DoEvents pour s'assurer de la prise en compte de la gestion des événements clavier.
    Pour toutes ces raisons de synchronisation, si cela est possible, il vaut mieux éviter le SendKeys.

    Dans Macro1, le Sendkeys de Ctrl+";" suivi de ENTER pour générer la date pourraît être réécrit plus simplement par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub FigerDate()
        Cells(6, 9) = Date
    End Sub
    s'il s'agit d'écrire la date dans la cellule I6 autrement-dit rangée 6, colonne 9.
    On n'a pas besoin de sélectionner la case I6 et surtout on n'utilise pas SendKeys.

    Veillez à ce que la cellule I6 soit au format Date souhaité
    - soit dans la feuille de calcul,
    - soit au niveau du code avec l'instruction Format() exactement comme dans le nom de la sauvegarde.

    Si la feuille courante de calcul ActiveWorkbook n'est pas celle que l'on souhaite pour figer la date,
    précisez éventuellement le nom complet de la feuille de calcul tel que Worksheets("aaa").
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub FigerDate()
        Worksheets("marchandise").Cells(6, 9) = Date
    End Sub

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Par défaut
    Bonjour Mattchess,

    Ca marche nickel comme je voulais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub FigerDate()
        Cells(6, 9) = Date
    End Sub
    , merci beaucoup !

    merci à Bastou93 également pour m'avoir indiqué une piste !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  2. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  3. Réponses: 2
    Dernier message: 24/02/2009, 17h40
  4. écrire le résultat d'une macro dans une cellule d'une feuille à choisir
    Par ririrourou dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/06/2008, 11h56
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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