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 :

PJ et tableaux structurés


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Septembre 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2020
    Messages : 32
    Par défaut PJ et tableaux structurés
    Bonjour à tous,

    Depuis quelques temps, j'essaye de mettre au point une macro qui puisse me préparer mes emails de facturation.
    Toute la partie création d'email, ajout automatique des destinataires, des CC, du titre et du corps de l'email fonctionne très bien ; il ne manque maintenant plus que la partie pièces jointes.

    Pour donner du contexte, un destinataire peut avoir une ou plusieurs pièces jointes.
    J'ai donc suivi les conseils donnés sur ce forum, et j'ai gardé toutes les informations dans un tableau structuré.
    Il y a donc des colonnes Facture1, Facture2, Facture3... où est gardée l'adresse de la facture sur le PC

    j'ai ajouté une condition au cas où la cellule est vide, mais malgré ça, j'ai un message d'erreur lorsque je fais tourner la macro (Erreur d'exécution 2147024894 80070002, Fichier introuvable).
    Le débogage s'arrête sur : If Range("t_ANG[Facture1]")(i).Value <> "" Then

    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
     
    Sub BoutonAng_Cliquer()
    Dim OL As Object
    Dim Texte As String
    Dim Ligne As Long
    Dim MiseEnCopie As String
     
    Ligne = 5
    MiseEnCopie = Range("L2")
    Set OL = CreateObject("Outlook.Application")
        While Range("C" & Ligne) <> ""
            With OL.CreateItem(0)
                Dest = Range("E" & Ligne) & " ; " & Range("F" & Ligne) & " ; " & Range("G" & Ligne)
                Sujet = Range("I" & Ligne)
                Texte = Range("H" & Ligne) & vbCrLf & vbCrLf
                Texte = Texte & Range("J" & Ligne) & vbCrLf & vbCrLf
                Texte = Texte & "Should you require any additional information, please do not hesitate to contact me." & vbCrLf & vbCrLf
                Texte = Texte & "Best regards," & vbCrLf & vbCrLf
                Texte = Texte & "Camille Robert" & vbCrLf
     
     
     
                .To = Dest
                .CC = MiseEnCopie
                .Subject = Sujet
                .Body = Texte
                .OriginatorDeliveryReportRequested = True 'confirmation de réception
                .Importance = 2
     
                For i = 5 To Range("t_ANG").Rows.Count
                    If Range("t_ANG[Facture1]")(i).Value <> "" Then
                    .Attachments.Add Range("t_ANG[Facture1]")(i).Value
                    End If
                    If Range("t_ANG[Facture2]")(i).Value <> "" Then
                    .Attachments.Add Range("t_ANG[Facture2]")(i).Value
                    End If
                Next i
     
                .Display
                '.Send envoi automatique
                Ligne = Ligne + 1
            End With
        Wend
     
    End Sub
    Je suis sûre que l'adresse de la pièce jointe est correcte (lorsque je copie l'adresse dans mes documents, ça me l'ouvre directement), donc je ne suis pas certaine de l'origine du problème...

    Merci d'avance pour toute aide,

    Camille

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("t_ANG[Facture1]")(i).Value
    Ne me semble pas une syntaxe correcte pour définir une cellule d'un tableau

    Tu peux peut-être essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    '...
                .Importance = 2
     
    Dim Arr1, Arr2
    Arr1 = Range("t_ANG[Facture1]").Value
    Arr2 = Range("t_ANG[Facture2]").Value
     
                For i = 5 To UBound(Arr1)
                    If Arr1(i, 1) <> "" Then .Attachments.Add Arr1(i, 1)
                    If Arr2(i, 1) <> "" Then .Attachments.Add Arr2(i, 1)
                Next i
     '...
    A+

    EDIT : correction de l'erreur signalée ultérieurement.

  3. #3
    Membre averti
    Femme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Septembre 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2020
    Messages : 32
    Par défaut
    Bonjour,

    Merci beaucoup pour ton retour.

    J'ai remplacé la partie concernée par ton code, mais j'ai maintenant une erreur d'exécution 13, Incompatibilité de type.
    Le débogage s'arrête sur : For i = 5 To UBound(Arr)

    Je vais regarder ce qui pourrait causer ça.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 205
    Par défaut
    Corrige :
    For i = 5 To UBound(Arr1)

  5. #5
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous, Bonjour au forum,

    (mes excuses pour cette absence. Surbooké)

    En termes d'écriture, je préfère
    - détacher les objets
    - n'utiliser l'objet Range qu'en toute fin de ligne

    Pour ce qui me concerne, ce processus permet une plus grande souplesse d'écriture de code, en utilisant un bloc With par exemple.

    Exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub essai_occurs()
     
    Dim i As Long
     
    With Worksheets("liste_mails").ListObjects("T_Mails")
            For i = 1 To .ListRows.Count
                    Debug.Print .ListColumns("destinataires").DataBodyRange.Cells(i, 1).Value
            Next i
    End With
     
    End Sub
    Comme on peut le voir ici, je ne suis pas fan de l'écriture (i)

    Mais c'est juste un avis.

  6. #6
    Membre averti
    Femme Profil pro
    Contrôleur de Gestion
    Inscrit en
    Septembre 2020
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de Gestion
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2020
    Messages : 32
    Par défaut
    Nom : Capture.png
Affichages : 220
Taille : 65,6 Ko

    Voici une capture du tableau en question. Les pièces jointes que je souhaite ajouter au mail si situent dans Facture1, Facture2...
    La première colonne du tableau est la C, et Facture4 si situe en colonne T.

    j'ai essayé avec "For i = 5 To UBound(Arr1)", mais je retombe sur la première erreur (Erreur d'exécution 2147024894 80070002, Fichier introuvable)

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut

    Citation Envoyé par galopin01 Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("t_ANG[Facture1]")(i).Value
    Ne me semble pas une syntaxe correcte pour définir une cellule d'un tableau[...]
    dommage que je tombe sur ce truc seulement maintenant.

    La syntaxe et parfaite pour désigner une cellule particulière d'un tableau. C'est même ce que je conseille d'employer depuis pas mal de temps sur le forum
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Mars 2021
    Messages
    334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2021
    Messages : 334
    Par défaut
    Salut,

    "i" est le numéro de ligne du tableau ?

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut Christian,

    On peut le supposer, oui (voir le code posté dans le tout premier message). Ceci dit, ma réaction est une remarque générale, puisque je prône justement cette approche et cette syntaxe, avec i en entier long qui pointe vers la ligne du tableau.


    Je trouve cette syntaxe moins verbeuse que celle de Marcel
    Citation Envoyé par MarcelG Voir le message
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Debug.Print .ListColumns("destinataires").DataBodyRange.Cells(i, 1).Value
    [...]
    Et si on souhaite vraiment passer par le ListObject (je n'en vois pas l'intérêt dans le cadre du code proposé mais bon), alors, on pourrait faire plus court puisque:
    • le Cells(...) est redondant dans DataBodyRange.Cells(i, 1);
    • dans le (i, 1) le 1 est de trop puisque la colonne du listobject ne contient, par définition, qu'une colonne.



    => Debug.Print .ListColumns("destinataires").DataBodyRange(i).Value est largement suffisant, mais peut être remplacé par Debug.Print Range("T_Mails[destinataires]")(i).Value. Ca permet, en plus, de supprimer le bloc With... End With... Après, chacun sa façon de coder, bien sûr.

    Au passage, je rappelle qu'avec les tableaux structurés, on n'est pas obligé de les préfixer du nom de la feuille qui les contient, ce qui découple le code de l'emplacement du tableau dans le classeur. Perso, si je dois manipuler le ListObject "Tableau1", je préfère Range("Tableau1").ListObject à Worksheets("...").ListObjects("Tableau1"). C'est un des plus grands avantages des tableaux structurés en VBA, alors autant en profiter.

    Bien entendu, si le tableau structuré est situé dans un autre classeur, on devra passer par un listobject, mais dans ce cas j'utilise une fonction qui me renvoie le listobject, et je travaille avec les listColumns, mais toujours sans préfixer le tableau de la feuille qui le contient. Plus on découple le code de la structure du classeur, plus on peut tendre vers du générique (et même écrire du générique) que l'on paramètre d'application en application, et bien sûr dans une même appli en fonction des besoins.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

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

Discussions similaires

  1. déclaration des tableaux structurés
    Par sarafou7 dans le forum C
    Réponses: 1
    Dernier message: 29/01/2011, 09h43
  2. explication sur tableaux structuré
    Par frost80500 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 18/01/2008, 19h02
  3. [Tableaux] Structure PHP pour variable complexe
    Par winnie82 dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2006, 13h53
  4. [Tableaux] structure des liens de mon site
    Par difficiledetrouver1pseudo dans le forum Langage
    Réponses: 3
    Dernier message: 10/04/2006, 16h28
  5. [Tableaux] structure C/C++
    Par pittacos dans le forum Langage
    Réponses: 4
    Dernier message: 21/12/2005, 17h55

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