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 :

Erreur de compilation Variable ou procédure attendue et non un module [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut Erreur de compilation Variable ou procédure attendue et non un module
    Bonjour,

    J'ai créé une macro dans mon classeur de macro personnelles qui a fonctionné sans problème.
    Aujourdh'ui celle si se plante et m'affiche l'erreur de compilation.

    Erreur de compilation Vriable ou procédure attendue et non un module
    sur la séquence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ma_feuille = InputBox(Msg, Title, ActiveSheet.Name)
    J'ai rechargé cette macro sur un autre utilisateur et j'ai le même souci.

    On obtient cette erreur lorqu'on utilise un nom de module réservé par Excel lui-même. mais dans mon cas, je n'ai rien changé.

    Auriez vous une idée suggestion pour trouver l'erreur.
    Merci pour votre aide

    J'ai supprimé le code initial ici pour ne pas créer de confusion et remis dans un post suivant.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Je pense que vous avez quelques variables non déclarées qui passent en type variant par défaut (ex Msg, Title, ....), et vous devez avoir une option explicit déclarée je pense, qui oblige à définir toutes les variables utilisées....

    Ceci étant, je vous recommande fortement d'utiliser l'option explicit en tête de chaque module

    Bonne journée

  3. #3
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut
    Merci pour la suggestion,
    Je n'étais pas en option explicit et y suis passé.
    J'ai déclaré les deux variables non définies jusque là Title et MSG

    mais j'ai le même problème.

    Pour info, j'ai mis le même code en temps que module d'un autre classeur et là ça marche
    c'est dans le cas où ce module est dans mes macros perso que ça ne passe pas ?

    Ce qui m'énerve c'est que ça fonctionnait jusque là idem pour mes collèques à qui j'ai fourni la macro,
    C'est comme s'il y avait eu une mise à jour quelquepart !

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    et en mode pas à pas, ça plante où dans votre code?

  5. #5
    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,

    Comment se nomme ce module ?
    Ça pourrait être un conflit de noms...

  6. #6
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut
    Ca plante dès le début, puisque c'est une erreur de compilation

    le curseur est sur le nom de la macro = nom du module =Sub envoie_feuille_mail()

    et le mot InputBox est surligné en bleu dans la séquence Ma_feuille = InputBox(msg, title, ActiveSheet.Name)

    je ne voit pas de comnflit de nom à ce niveau

    Denis

  7. #7
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut
    Suite à vos remarques, j'ai relu mon code et corrigé des doublons et ajouté l'option explicit
    Par contre le résultat est le même, ça plante.
    Merci encore pour votre intérêt pour mon problème

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Public Mon_Objet As String                  'L'objet du message
    Public Ma_feuille
    Public Mes_destinataires As String          'Les destinataires
    Public Dest_deb
    Public Ctr As String
    Public msg
    Public title
    Option Explicit
    Sub envoie_feuille_mail()
    ' Envoi la feuille courante comme mail
    ' version 08/10/2014
     
    Ctr = -1
     
    msg = "Indiquer la feuille à expédier"
    title = "Sélection de la feuille"
    Ma_feuille = InputBox(msg, title, ActiveSheet.Name)
    If Ma_feuille = "" Then Exit Sub
     
    msg = "Saisir l'objet du mail"
    title = "Objet"
    Mon_Objet = InputBox(msg, title, ActiveCell.Value)
    If Mon_Objet = "" Then Exit Sub
     
    msg = "Indiquer le début de la liste de destinataires sur votre feuille exemple A1 laisser une ligne blanche en fin de liste ! OU laisser vide pour renseigner dans Lotus directement"
    title = "DESTINATAIRES"
    Dest_deb = InputBox(msg, title)
    If Dest_deb <> "" Then
        ' je charge ma liste de destinataires
        On Error GoTo erreur_feuille
            Sheets(Ma_feuille).Activate
     
            Range(Dest_deb).Select
        Do While Not IsEmpty(ActiveCell)
            Ctr = Ctr + 1
            ReDim Preserve Mes_destinataires(Ctr)
            Mes_destinataires(Ctr) = ActiveCell.Value & "@Macompagnie.com"
            Selection.Offset(1, 0).Select
        Loop
    End If
    ' je copie la feuille dans un nouveau classeur
          ActiveWorkbook.Sheets(Ma_feuille).Copy
     
    ' si on a pas saisi de destinataire il faut malgré tout renseigner ce champ
    If Ctr = -1 Then
            ReDim Preserve Mes_destinataires(0)
    Mes_destinataires(0) = "Saisir destinataires"
    End If
     
    'je l'envoie et je referme sans sauvegarder
        Application.Dialogs(xlDialogSendMail).Show Mes_destinataires, Mon_Objet
        Application.DisplayAlerts = False
        ActiveWorkbook.Close
        Application.DisplayAlerts = True
     
     
    Exit Sub
    ' gestion erreurs
    erreur_feuille:
    Dim monMsg
    monMsg = "Feuille " & Ma_feuille & " inexistante ou mal orthographiée."
    MsgBox Prompt:=monMsg
    Exit Sub
    End Sub

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    et ben ..... je reste sec .... j'ai repris votre code sur un fichier partagé et je n'ai pas d'erreur.
    sauf que .... sur votre version modifiée (ajout), avez-vous vraiment l'option explicit déclarée? Elle doit être mise AVANT la déclaration des variables .... en 1ere ligne du module
    Mes_destinataires As String ..... utilisé en tableau après!

    Rien à voir, mais quelques suggestions:

    1. pour la partie Mes_destinataires(Ctr)

    => vous pourriez utiliser le Set MailRbng = activecell.currentRegion à la place de la boucle Do While Not IsEmpty(ActiveCell), pus besoin de la boucle et du Redim preserve ....

    2. Pensez aussi aux collections ....

    Bonne journée

  9. #9
    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
    Ç'aurait pu être un module ou une procédure qui serait appelée InputBox... mais bon...
    Y a-t-il des références déclarées dans ton projet et qui seraient "Manquantes" ?

  10. #10
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    Citation Envoyé par parmi Voir le message
    Comment se nomme ce module ?
    Même question pour moi.

    Ce module a-t-il le même nom qu'une des macros qu'il contient?

    Une bonne pratique est de préfixer tous les noms de modules de "mod".
    De cette manière, pas (peu) de risque d'avoir un nom existant.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  11. #11
    Membre éclairé
    Inscrit en
    Août 2009
    Messages
    817
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 817
    Par défaut
    Truc de fou !!!

    En fait je me suis aperçu que toutes mes macros personnelles comportant

    avaient le même souci.

    J'ai remplacé par
    et là ça marche.

    Ensuite ça bugait sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim Preserve Mes_destinataires(Ctr)
    Tableau attendu
    J'ai donc renomé ma variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Mes_destinataires  As String
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    en Mes_destinataires(100)
    Mais là au même endroit j'ai eu Tableau déjà défini

    en enlevant le Redim Préserv.

    Bon là ça remarche.

    Ce que je ne comprends pas c'est que le code d'origine marchait dans les macros personnelles de plusieurs personnes puis soudain cela n'a plus marché.
    alors que ce même code identique placé dans un module d'un classeur continue à marcher sur mon PC.

    dur dur la vie en autoapprentissage empirique, On enregistre des macros qu'on adapte jusqu'à ce quelles marchent, mais si le contexte change bin les macros ne suivnet pas toujours.

    Merci à tous et bon WE.

    Et voici le code qui envoie une seule feuille d'un classeur Excel
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    Option Explicit
    Public Mon_Objet As String                  'L'objet du message
    Public Ma_feuille
    Dim Mes_destinataires()  As String          'Les destinataires
    Public Dest_deb
    Public Ctr As String
    Public Msg
    Public Title
    Sub envoie_feuille_mail()
    ' Envoi la feuille courante comme mail
    ' version 08/10/2014
    Mon_Objet = Ma_feuille = Dest_deb = Ctr = Msg = Title = ""
    ReDim Mes_destinataires(100)
     
    'Saisie des donnée d'entrée
    'Feuille à sélectionner
        Msg = "Indiquer la feuille à expédier"
        Title = "Sélection de la feuille"
        Ma_feuille = Application.InputBox(Msg, Title, ActiveSheet.Name)
        If Ma_feuille = "" Then Exit Sub
     
    'Objet à sélectionner
        Msg = "Saisir l'objet du mail"
        Title = "Objet"
        Mon_Objet = Application.InputBox(Msg, Title, ActiveCell.Value)
        If Mon_Objet = "" Then Exit Sub
     
    'Les destinataires peuvent être saisie sur un endroit de la feuille
        Msg = "Indiquer le début de la liste de destinataires sur votre feuille exemple A1 laisser une ligne blanche en fin de liste ! OU laisser vide pour renseigner dans Lotus directement"
        Title = "DESTINATAIRES"
        Dest_deb = Application.InputBox(Msg, Title)
     
        Ctr = -1
        If Dest_deb <> "" Then
            ' je charge ma liste de destinataires
            On Error GoTo erreur_feuille
                Sheets(Ma_feuille).Activate
     
                Range(Dest_deb).Select
            Do While Not IsEmpty(ActiveCell)
                Ctr = Ctr + 1
                Mes_destinataires(Ctr) = ActiveCell.Value & "@amcor.com"
                Selection.Offset(1, 0).Select
            Loop
        End If
     
    ' je copie la feuille dans un nouveau classeur
          ActiveWorkbook.Sheets(Ma_feuille).Copy
     
    ' si on a pas saisi de destinataire il faut malgré tout renseigner ce champ
    If Ctr = -1 Then
    Mes_destinataires(0) = "Saisir destinataires"
    End If
     
    'je l'envoie et je referme sans sauvegarder
        Application.Dialogs(xlDialogSendMail).Show Mes_destinataires, Mon_Objet
        Application.DisplayAlerts = False
        ActiveWorkbook.Close
        Application.DisplayAlerts = True
     
     
    Exit Sub
    ' gestion erreurs
    erreur_feuille:
    Dim monMsg
    monMsg = "Feuille " & Ma_feuille & " inexistante ou mal orthographiée."
    MsgBox Prompt:=monMsg
    Exit Sub
    End Sub

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

Discussions similaires

  1. [AC-2007] Erreur de compilation: Variable non définie
    Par m1koo dans le forum VBA Access
    Réponses: 7
    Dernier message: 11/01/2014, 18h21
  2. [XL-2010] Erreur de compilation : variable non définie sur un textbox
    Par Bricomachin dans le forum Excel
    Réponses: 4
    Dernier message: 12/04/2013, 11h56
  3. Erreur de compilation : Variable non définie
    Par Smallstone dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 12/07/2011, 08h32
  4. erreur de compilation variable non defini
    Par nabelou1 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/01/2009, 16h43
  5. Erreur de compilation 'variably modified' ?
    Par Grulim dans le forum C
    Réponses: 9
    Dernier message: 09/08/2008, 16h05

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