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 :

enchainement de macro


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut enchainement de macro
    Bonjour,

    Voici mon problème.
    J'ai dans un premier temps créer un userform avec un bouton d'enregistrement.
    Un clique sur ce bouton entraine la création d'un nouveau fichier excel, de sa mise en page et de la saisie des infos trouvées dans le userform.

    Mon problème vient de la segmentation de la macro. En effet, lorsque les macro sont "bout à bout" (1 sub au début et 1 à la fin) il n'y a pas de problème lorsque qu'elle sont dans différentes sub elles ne s'enchainent pas.

    Voici un exemple :

    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
    Public Sub Cmd_save_Click()
     
    'On appelle le fichier
    'Variable représentant le classeur "destination"
    Dim sNomFichier2 As String
    Dim Wb As Workbook
     
    'Ouverture du classeur de destination
         sNomFichier2 = "monchemin.xlsx"
         If Dir(sNomFichier2) <> "" Then
     
    Set Wb = Application.Workbooks.Open(sNomFichier2)
     
    Call Wb.Activate
     
    ActiveWindow.WindowState = xlMinimized
         Else
    Workbooks.Add
    ActiveWorkbook.SaveAs sNomFichier2
     
    Set Wb = Application.Workbooks.Open(sNomFichier2)
    Call Wb.Activate
    ActiveWindow.WindowState = xlMinimized
         End If
     
    Call MEP_fichier_ind
    Call insertion_userform
     
    Call Wb.Close(True)
    Set Wb = Nothing
     
    End Sub
    La macro MEP_fichier_ind commence par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Wb.Sheets.Add
    ActiveSheet.Name = "PAGE DE GARDE"
    mais s'arrête à la première ligne.

    Cette dernière macro est stockée dans un module alors que la première est sur le userform.

    Si je copie colle la macro MEP_fichier_ind à la place de
    elle s'execute normalement.

    Merci de vos réponses

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    Ta variable objet est de portée limitée à la procédure "Cmd_save_Click". Elle n'existe pas pour la procédure "MEP_fichier_ind ". Deux solutions :
    • Passer wb en argument de la procédure "MEP_fichier_ind "
    • Déclarer Wb comme variable objet publique dans un module standard.


    Cela n'a rien à voir mais il me semble que l'instruction sur la ligne 21 va tenter d'ouvrir un classeur déjà ouvert.

    Cordialement,

    PGZ

  3. #3
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Le passage en argument est de loin préférable à la variable publique..


    cordialement,

    Didier

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut
    impeccable merci beaucoup

    Re bonjour,
    J'édite mon message car un nouveau problème apparait et je pense qu'il est de même nature.
    J'ai bien déclaré wb en tant que parametre comme conseillé dans les messages précédents.

    Plus loins dans la macro il s'agit d'intégrer les textbox depuis un userform.
    J'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        wb.Worksheets("PAGE DE GARDE").Range("B21").Value = txt2.Text
    Faut il déclarer les text box, bouton d'option et autres check box en paramètre ou bien faut il déclarer le userform dans sa totalité et si oui comment ?

    PS : lorsque j'entre le code suivant la macro fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        wb.Worksheets("PAGE DE GARDE").Range("B21").Value = "coucou"

    Merci de vos réponses

    Cordialement

  5. #5
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Citation Envoyé par braquin Voir le message
    i
    Re bonjour,
    J'édite mon message car un nouveau problème apparait et je pense qu'il est de même nature.
    Bonjour,

    le plus pratique pour répondre est de donner la nature du problème, le contenu du message d'erreur, à quelle ligne etc...

    si tu mets un point d'arrêt sur ta première ligne de code citée, le survol de la souris donne quoi pour la valeur de ton textbox ?

    cordialement,

    Didier

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut
    Bonjour,

    Le message d'erreur est :

    erreur '424':
    Objet requis

    Concernant la valeur du textbox rien n'apparait.

    Le code utilisé est le suivant :
    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
    Public Sub Cmd_save_Click()
     
    'On appelle le fichier
    'Variable représentant le classeur "destination"
    Dim sNomFichier2 As String
    Dim wb As Workbook
     
    'Ouverture du classeur de destination
         sNomFichier2 = "D:\travail\chantiers\EAE\EAE " & Year(Date) & txt1.Text & "_" & txt2.Text & ".xlsx"
         If Dir(sNomFichier2) <> "" Then
     
    Set wb = Application.Workbooks.Open(sNomFichier2)
     
    Call wb.Activate
     
    ActiveWindow.WindowState = xlMinimized
         Else
    Workbooks.Add
    ActiveWorkbook.SaveAs sNomFichier2
     
    Set wb = Application.Workbooks.Open(sNomFichier2)
    Call wb.Activate
    ActiveWindow.WindowState = xlMinimized
         End If
    Application.Run "test", wb
    'Application.Run "MEP_fichier_ind", wb
    'Application.Run "MEP_userform", wb
    'Application.Run "recap"
     
     
    End Sub
    Cette première macro est dans le userform (rattachée au bouton d'enregistrement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test(wb As Workbook)
    wb.Sheets.Add
    wb.Worksheets("Feuil1").Name = "PAGE DE GARDE"
    wb.Worksheets("PAGE DE GARDE").Range("A14").Value = "ENTRETIEN ANNUEL D'EVALUATION"
    wb.Worksheets("PAGE DE GARDE").Range("B20").Value = txt1.Text
     
    End Sub
    Cette seconde marco est dans un module.
    Le problème survient sur la dernière ligne de cette seconde macro

    J'éspère avoir été assez précis.
    Merci de vos réponses

    Cordialement

  7. #7
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    je ne comprends pas trop ton code et n'ai pas le temps décrypter.

    ton erreur est normale, sinon. Peux-tu dire le schéma de ton enchaînement :

    tu as un classeur, tu lui met un USF1 à partir duquel tu ouvres un classeur avec une nouvelle feuille...

    la textbox ciblée est dans ton USF1 ?

    tu veux l'inscrire dans une cellule de quel classeur ?

    Le code qui demande cette écriture est situé où ?

    cordialement,

    Didier

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut
    Bonjour,

    Voici les différentes étapes du projet.

    1) J'ouvre Excel, le userform1 se lance automatiquement, je saisis différentes informations (textbox, checkbox, option button)
    2) je clik sur enregistrer
    3) un nouveau fichier excel (2) est créer
    4) des nouvelles feuilles sont ajoutées à ce fichier excel (2)
    5) j'insère ensuite les réponses des textbox, checkbox et option button dans différentes cellules du fichier excel (2)
    6) l'ensemble du code est rédigé dans le premier classeur. Il n'y a aucune macro dans les autres classeurs puisque ces derniers n'existe pas avant de cliker sur le bouton de sauvegarde

    J'ajoute que le problème n'apparait que lorsque je tente de "partitionner" ma macro d'origine. Initialement lorsque tout est regroupé dans le bouton save, tout fonctionne
    La partie ne fonctionant pas est située dans un module.
    Le début du code (bouton save) est inscrit ci dessous. C'est lui qui créer le nouveau ficher excel (2) et appelle les autres macros
    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
     
    Public Sub Cmd_save_Click()
     
    'On appelle le fichier
    'Variable représentant le classeur "destination"
    Dim sNomFichier2 As String
    Dim wb As Workbook
     
    'Ouverture du classeur de destination
         sNomFichier2 = "D:\travail\chantiers\EAE\EAE " & Year(Date) & txt1.Text & "_" & txt2.Text & ".xlsx"
         If Dir(sNomFichier2) <> "" Then
     
    Set wb = Application.Workbooks.Open(sNomFichier2)
     
    Call wb.Activate
     
    ActiveWindow.WindowState = xlMinimized
         Else
    Workbooks.Add
    ActiveWorkbook.SaveAs sNomFichier2
     
    Set wb = Application.Workbooks.Open(sNomFichier2)
    Call wb.Activate
    ActiveWindow.WindowState = xlMinimized
         End If
    Application.Run "test", wb
    'Application.Run "MEP_fichier_ind", wb
    'Application.Run "MEP_userform", wb
    'Application.Run "recap"
     
     
    End Sub

    la seconde partie du code est l'étape de mise en page et d'insertion des éléments de ce userform dans le fichier excel (2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub test(wb As Workbook)
    wb.Sheets.Add
    wb.Worksheets("Feuil1").Name = "PAGE DE GARDE"
    wb.Worksheets("PAGE DE GARDE").Range("A14").Value = "ENTRETIEN ANNUEL D'EVALUATION"
    wb.Worksheets("PAGE DE GARDE").Range("B20").Value = txt1.Text
     
    End Sub
    Merci de vos réponses

    cordialement

  9. #9
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Des bons points, c'est bien de commenter ton code, la bonne pratique qui va avec est de l’indenter (hiérarchie en escalier ou pyramide). C'est bien aussi de faire des procédures séparées pour des traitements spécifiques ou répétitifs dans le projet si c'est justifié.

    Par contre ta procédure qui crée ton classeur ou ajoute une feuille à un classeur donné ne doit faire que ça, une fois appelée, elle s'exécute et c'est au moment où la main revient à la procédure appelante (celle de ton USF) que tu mets les lignes d'écriture des textbox et autres dans le classeur voulu.

    C'est nettement plus lisible, maintenable et sûr.

    Il s'agit d'écriture Explicite ou implicite, ce qui non maîtrisé provoque au mieux des erreurs du genre 424 et au pire n'écrit pas à l'endroit voulu

    code explicatif - les versions 2 sont à privilégier, même si les 1 sont OK ici.
    repris sur le fond de ton code, sans présumer de la façon de faire. vois vraiment la section tutoriel et au moins ceci :
    Programmer efficacement avec Excel en VBA http://bidou.developpez.com/tutoriels/ExcelVBA/

    Dans Userform1
    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
    Private Sub CommandButton1_Click()
    Dim strNomFic2
    Dim wb As Workbook
     
    strNomFic2 = "C:\PassDVP\toto.xlsm" 'on simplifie ici, il existe
    Set wb = Application.Workbooks.Open(strNomFic2)
    ThisWorkbook.Activate
    'la ligne qui suit est inutile dans la mesure ou un classeur ouvert devient celui actif...
    'wb.Activate 'pas de Call à ce niveau...
    Call test(wb)
     
    End Sub
     
    Private Sub CommandButton2_Click()
    Dim strNomFic2
    Dim wb As Workbook
     
    strNomFic2 = "C:\PassDVP\toto.xlsm" 'on simplifie ici, il existe
    Set wb = Application.Workbooks.Open(strNomFic2)
    ThisWorkbook.Activate
    'la ligne qui suit est inutile dan la mesure ou un classeur ouvert devient celui actif...
    wb.Activate 'pas de Call à ce niveau...
    Call test2(wb)
    wb.Worksheets("PAGE DE GARDE").Range("B20").Value = Me.txt1.Text
    End Sub
    dans Module1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub test(wb As Workbook)
    wb.Sheets.Add
    wb.Worksheets("Feuil1").Name = "PAGE DE GARDE" 'faut-il que le classeur n'ait pas une page du nom Feuil1 déjà...
    wb.Worksheets("PAGE DE GARDE").Range("A14").Value = "ENTRETIEN ANNUEL D'EVALUATION"
    wb.Worksheets("PAGE DE GARDE").Range("B20").Value = UserForm1.txt1 'OK, mais pas conseillé
     
    End Sub
     
    Sub test2(wb As Workbook)
    wb.Sheets.Add
    wb.Worksheets("Feuil1").Name = "PAGE DE GARDE" 'faut-il que le classeur n'ait pas une page du nom Feuil1 déjà...
    wb.Worksheets("PAGE DE GARDE").Range("A14").Value = "ENTRETIEN ANNUEL D'EVALUATION"
    End Sub
    cordialement,

    Didier

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut
    Merci beaucoup pour la réponse et toutes ces explications.

    Cordialement

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

Discussions similaires

  1. [XL-2010] 2 macros qui s'enchainent
    Par vponcet0774 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 10/09/2013, 20h31
  2. [XL-2003] Enchainer les macros les unes à la suite des autres
    Par Vincent32 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/09/2011, 14h55
  3. [AC-2007] enchainer plusieures macros
    Par nabou dans le forum Access
    Réponses: 7
    Dernier message: 28/01/2011, 16h46
  4. PBs enchainement Macros do while
    Par Adrien0634 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/06/2010, 16h23
  5. Peut-on enchainer plusieurs Macros ?
    Par malabarbe dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 12/08/2007, 22h18

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