Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucles dans plusieurs feuilles Excel en VBA

Boucle

    28 mars 2023 à 9:55:59

    Bonjour, voilà pour gérer mes devis j'ai créé une feuille descriptive par devis sur un classeur Excel.

    Je souhaiterais balayer l'ensemble des feuilles afin d'envoyer un mail récapitulatif des devis. Ci-dessous la boucle de façon simplifiée afin de comprendre le codage.

    Merci par avance pour votre aide.

    Sub projet()
    
    Dim mail As Variant
        Set mail = CreateObject("outlook.Application")
    Dim derniereLigne As Long
    Dim premiereLigne As Long
        premiereLigne = 26
    Dim ContenuFichier As String
    Dim MonFichier As String
    MonFichier = "C:\Utilisateurs\XXXX\Documents\projet.txt"
    Dim f As Integer
        f = freeFile
    
    'Outerture du fichier texte
    Open MonFichier For Output As #f
    
    'ETAPE 1 => CREATION DE LA BOUCLE POUR PARCOURIR LES FEUILLES DU CLASSEUR
    Dim i
    For i = 1 To Worksheets.Count
    derniereLigne = Worksheets(i).Cells(Rows.Count, 1).End(xlUp).Row
              
    Print #f, Range("D1") & "  TOTAL = " & Range("B7") & " Euros"
            'ETAPE 2 => CREATION D'UNE BOUCLE POUR PARCOURIR UN TABLEAU DANS CHAQUE FEUILLE
            For Ligne = premiereLigne To derniereLigne
                Print #f, Tab, Range("B" & Ligne), Range("C" & Ligne), Range("G" & Ligne)
                Next Ligne
                Print #f, "********"
                Print #f,
            
                MsgBox "Le texte a été sauvegardé"
            Next
    Next i
          
    'fermeture du fichier texte
    Close #f
    
    'ETAPE 2 => ENVOYER LE MAIL
    
        ContenuFichier = LireFichierTexte(MonFichier)
            With mail.CreateItem(olMailItem)
            .Subject = "Devis"
            .To = ""
            .Body = ContenuFichier
            .Display
            End With
    
    End Sub
    
    



    • Partager sur Facebook
    • Partager sur Twitter
      28 mars 2023 à 19:33:23

      dans ton code, il y a des problème de boucles

      le next ligne de la ligne 26 va avec le for de la ligne 24

      le next de la ligne 31 avec le for de la ligne 19 et donc le next i est en surplus (ou il manque une boucle dans ta simplification ou autre).

      quel est le souci que tu rencontres ? 

      • Partager sur Facebook
      • Partager sur Twitter
        29 mars 2023 à 17:24:28

        Salut umfred, tout d'abord merci pour ta réponse. J'ai modifié le code et il se déroule sans bug.

        Constats:

        Le message MsgBox apparaît 8 fois car j'ai feuilles MAIS le fichier projet.txt ne garde que les données de la feuille active et pas les autres !!

        A+

        Sub projet()
        
        Dim mail As Variant
            Set mail = CreateObject("outlook.Application")
        Dim derniereLigne As Long
        Dim premiereLigne As Long
            premiereLigne = 26
        Dim ContenuFichier As String
        Dim MonFichier As String
        MonFichier = "C:\Users\xxxx\Documents\projet.txt"
        Dim f As Integer
            f = freeFile
        
        'Outerture du fichier texte
        Open MonFichier For Output As #f
        
        'ETAPE 1 => CREATION DE LA BOUCLE POUR PARCOURIR LES FEUILLES DU CLASSEUR
        Dim i
        For i = 1 To Worksheets.Count
        derniereLigne = Worksheets(i).Cells(Rows.Count, 1).End(xlUp).Row
                  
        Print #f, Range("D1") & "  TOTAL = " & Range("B7") & " Euros"
                'ETAPE 2 => CREATION D'UNE BOUCLE POUR PARCOURIR UN TABLEAU DANS CHAQUE FEUILLE
                For Ligne = premiereLigne To derniereLigne
                    Print #f, Tab, Range("B" & Ligne), Range("C" & Ligne), Range("G" & Ligne)
                    Next Ligne
                    Print #f, "********"
                    Print #f,
                
                    MsgBox "Le texte a été sauvegardé"
        Next i
              
        'fermeture du fichier texte
        Close #f
        
        'ETAPE 2 => ENVOYER LE MAIL
        
            ContenuFichier = LireFichierTexte(MonFichier)
                With mail.CreateItem(olMailItem)
                .Subject = "Devis"
                .To = ""
                .Body = ContenuFichier
                .Display
                End With
        
        End Sub
        
        



        -
        Edité par doudoufly 29 mars 2023 à 17:25:37

        • Partager sur Facebook
        • Partager sur Twitter
          29 mars 2023 à 18:03:24

          Tu dois bien avoir 8 parties dans ton fichier texte, mais toutes identiques; c'est parce que le range va s'appliquer que la feuille active puisque tu ne spécifies la feuille concerné par le range.

          Je propose de les parcourir depuis la collection des WorkSheets avec un For Each

          Sub projet()
           
              Dim mail As Variant
              Set mail = CreateObject("outlook.Application")
              Dim derniereLigne As Long
              Dim premiereLigne As Long
              premiereLigne = 26
              Dim ContenuFichier As String
              Dim MonFichier As String
              MonFichier = "C:\Users\xxxx\Documents\projet.txt"
              Dim f As Integer
              f = freeFile
           
              'Outerture du fichier texte
              Open MonFichier For Output As #f
              
              'ETAPE 1 => CREATION DE LA BOUCLE POUR PARCOURIR LES FEUILLES DU CLASSEUR
              Dim ws as WorkSheet
              For Each ws in Worksheets
                  derniereLigne = ws.Cells(Rows.Count, 1).End(xlUp).Row
                   
                  Print #f, ws.Range("D1") & "  TOTAL = " & ws.Range("B7") & " Euros"
                  'ETAPE 2 => CREATION D'UNE BOUCLE POUR PARCOURIR UN TABLEAU DANS CHAQUE FEUILLE
                  For Ligne = premiereLigne To derniereLigne
                      Print #f, Tab, ws.Range("B" & Ligne), ws.Range("C" & Ligne), ws.Range("G" & Ligne)
                  Next Ligne
                  Print #f, "********"
                  Print #f,
                  MsgBox "Le texte a été sauvegardé"
              Next i
              
              'fermeture du fichier texte
              Close #f
              
              'ETAPE 2 => ENVOYER LE MAIL
              
              ContenuFichier = LireFichierTexte(MonFichier)
              With mail.CreateItem(olMailItem)
                  .Subject = "Devis"
                  .To = ""
                  .Body = ContenuFichier
                  .Display
              End With
           
          End Sub


          Sinon en conservant les indices

          Sub projet()
           
          ...
              Dim i
              For i = 1 to Worksheets.count
                  Dim ws as WorkSheet
                  Set ws = Worksheets(i)
          [...]
              Next i
          ... 
          End Sub



          • Partager sur Facebook
          • Partager sur Twitter
            30 mars 2023 à 16:57:13

            Bonjour umfred super ça marche ! merci bcp :) 

            Afin de poursuivre l'ensemble des feuilles portent une numérotation exemple pour l'année 2023 c'est 2301, 2302 etc.

            Je souhaiterais si possible et si pas trop compliqué, sélectionner les feuilles de 2301 à 2310 ou toutes les feuilles qui commencent par 23.

            C'est faisable ?

            Merci encore.

            -
            Edité par doudoufly 30 mars 2023 à 16:57:37

            • Partager sur Facebook
            • Partager sur Twitter
              30 mars 2023 à 19:36:55

              oui, c'est le nom des feuilles (ws.Name dans mon code), donc on peut tester ce que l'on veut dessus

              If vba.left(ws.Name,2) = "23" Then
                  ' si ça commence par 23 (quelque soit la suite)
              Else
                  ' sinon
              End If



              • Partager sur Facebook
              • Partager sur Twitter
                31 mars 2023 à 17:09:03

                Salut umfred, merci pout tout ça fonctionne.

                Par contre j'avais une erreur avec le vba.left(ws.Name,2)="23" que j'ai remplacé par left(ws.Name,2)="23" et ça marche.

                Merci encore pour ton aide.

                A+

                • Partager sur Facebook
                • Partager sur Twitter
                  31 mars 2023 à 17:56:48

                  OK, merci pour le retour. 

                  J'ai préfixé par VBA parce que parfois, dans certains cas, il peut ne pas trouver la fonction ou utiliser la "mauvaise" fonction (la fonction d'excel de même nom, et pas la fonction vba); Je crois que ça vient des références cochées dans le projet vba.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 avril 2023 à 9:25:55

                    Ok, merci pour ton aide et le temps que tu y as consacré !

                    A bientôt. Je clôture le sujet 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 avril 2023 à 16:48:00

                      Salut à tous !

                      Bon, je rouvre le sujet afin d'améliorer le code :). Bon je vais être honnête je n'ai pas encore chercher ... mais le ferai !

                      Rappel:

                      ma boucle balai toutes les feuilles du classeur pour envoyer un mail synthétisant les devis. Le truc c'est que maintenant je souhaiterais joindre dans le mail les devis qui sont en format PDF. Pour ça chaque devis à une référence et je souhaiterais que la boucle parcoure le dossier contenant le devis en question et le joigne.

                      Exemple:

                      Feuille 1 => 1 devis pour référence 001 / Aller chercher dans le dossier devis le fichier (format PDF) qui contient 001 (colonne E ) si oui le joint dans le mail => passe à la feuille 2

                      Feuille 2 => 2 devis pour référence 002 & 003 / Aller les chercher dans le dossier devis si oui le joint et ainsi de suite ....

                      Ci-dessous le code actuel:

                      Sub envoyerDevis()
                      
                      Dim dateAujourdhui As Date
                          dateAujourdhui = Date
                      Dim mail As Variant
                          Set mail = CreateObject("outlook.Application")
                      Dim derniereLigne As Long
                      Dim premiereLigne As Long
                          premiereLigne = 26
                      Dim ContenuFichier As String
                      Dim MonFichier As String
                      MonFichier = "M:\Users\xxx\Dossiers\devis.txt"
                      Dim f As Integer
                          f = FreeFile
                          Open MonFichier For Output As #f
                      
                      'ETAPE 1 => CREATION DE LA BOUCLE POUR PARCOURIR LES FEUILLES DU CLASSEUR
                      Dim i
                      For i = 1 To Worksheets.Count
                          Dim ws As Worksheet
                          Set ws = Worksheets(i)
                          derniereLigne = ws.Cells(Rows.Count, 1).End(xlUp).Row
                      'CONDITION IF pour copier les données
                          ' si ça commence par 23 (quelque soit la suite)
                          If Left(ws.Name, 2) = "23" And ws.Range("B18") = "DEVIS" And ws.Range("B1") <> "" And ws.Range("D1") <> "" And ws.Range("B11") = "" And ws.Range("B12") = "NON COMMUNIQUE" Then
                      
                              Print #f, ws.Range("D1") '& " Total = " & ws.Range("B7") & " E"
                              'ETAPE 2 => CREATION D'UNE BOUCLE POUR PARCOURIR UN TABLEAU DANS CHAQUE FEUILLE
                                  For Ligne = premiereLigne To derniereLigne
                                      Print #f, Tab, ws.Range("B" & Ligne), ws.Range("C" & Ligne), ws.Range("G" & Ligne)
                                      Next Ligne
                                      Print #f,
                                      Print #f,
                              
                                      MsgBox "Le texte a été sauvegardé"
                                      
                                      ws.Range("B4").Value = dateAujourdhui
                                      ws.Range("B11").Value = dateAujourdhui
                                      ws.Range("B12").Value = "ATTENTE"
                          End If
                      Next i
                            
                      'fermeture du fichier texte
                      Close #f
                      
                      'ETAPE 2 => ENVOYER LE MAIL
                      
                          ContenuFichier = LireFichierTexte(MonFichier)
                              With mail.CreateItem(olMailItem)
                              .Subject = "Devis pour accord"
                              .To = "xxxx"
                              .Body = ContenuFichier
                              .Display
                              End With
                      
                      End Sub

                      Merci par avance pour votre aide.

                      @+

                      -
                      Edité par doudoufly 14 avril 2023 à 16:49:33

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 avril 2023 à 15:41:51

                        le dossier des devis est constant ? (ou correspond à un dossier facilement identifiable?)

                        comment apparait la référence du devis dans le nom du fichier pdf ? si référence 001ça veut dire que le fichier s'appelle '001.pdf" ou "001_devis.pdf" ou ...

                        où trouver cette référence dans ton classeur ?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 mai 2023 à 17:35:57

                          Salut umfred ! désolé pour l'absence.

                          Je t'ai envoyé un fichier pour que tu puisses mieux comprendre.

                          A+

                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 mai 2023 à 17:32:31

                            l'idée c'est plutôt de mettre les infos ici dans le forum pour tout le monde (et éventuellement me prévenir par mp)

                            doudoufly a écrit:

                            Salut, excuses moi pas mal pris avec le boulot

                            En fait, l'idée c'est de joindre dans le mail les devis que j'ai en format PDF des fournisseurs.

                            Ces devis se situent dans un dossier sur le serveur qui porte le même nom que l'onglet de la feuille.

                            Après je peux peut-être ajouter une colonne à mon tableau excel et y mettre la localisation du fichier et comme ça la boucle parcour le tableau et joint le fichier.

                            Tu en penses quoi ? Si t'as besoin de plus d'info n'hésites pas. En pièce jointe une photo d'un exemple de feuille excel.Feuille qui décrit le projet

                            A+

                            Si les devis sont tous dans le même répertoire de base et que le chemin se présente sous la forme RepBase\[nom_onglet]\[fichier_devis].pdf, définir une variable pour le répertoire de base et récupérer les morceaux du chemin pour avoir les chemins et lors du parcours de la feuille excel, les ajouter dans un tableau (ou une collection) au fur et à mesure. Ensuite, à la création du mail, rajouter ces chemins en parcourant ce tableau à nouveau

                            Récupération dans un tableau avec redimensionnement dynamique (pas testé mais ça devrait fonctionner, sauf peut-être l'initialisation

                            Dim RepBase as string
                            RepBase="c:\devis\"
                            Dim tableau_fichier() as String
                            ...
                            ReDim Preserve tableau_fichier(0) as String
                            For Ligne = premiereLigne To derniereLigne
                                ...
                                'on ajoute à la fin le chemin vers le fichier
                                tableau_fichier(ubound(tableau_fichier))= RepBase & ws.Name & "\" & ws.Range("E" & ligne).value & ".pdf"
                                'on redimensionne en préservant les données à n+1
                                Redim Preserve tableau_fichier(ubound(tableau_fichier)+1)
                            Next Ligne
                            'retire le dernier élement qui doit être vide normalement
                            if UBound(tableau_fichier >0) then ReDim Preserve tableau_fichier(UBound(tableau) - 1)
                            
                            


                            Récupération dans une collection

                            Dim RepBase as string
                            RepBase="c:\devis\"
                            ...
                            Dim liste_fichier(0) as new collection 'initialise une collection vide
                            For Ligne = premiereLigne To derniereLigne
                                ...
                                'on ajoute à la fin le chemin vers le fichier
                                liste_fichier.Add RepBase & ws.Name & "\" & ws.Range("E" & ligne).value & ".pdf"
                            Next Ligne
                            



                            exemple d'ajout de pièce jointe (https://excel-malin.com/codes-sources-vba/envoyer-un-email-avec-excel/#Plusieurs_pieces_jointes8230 )

                            With oMailItem
                            '...
                            .To = "comptabilite@entreprise.fr"
                            .Subject = "Factures pour le mois de juin"       
                            .BodyFormat = olFormatRichText
                            .Body = Body
                            '...
                            .Attachments.Add "C:\MonDossier\MonFichier.xlsx"
                            .Attachments.Add "C:\MonDossier\MonFichier1.docx"
                            .Attachments.Add "C:\AutreDossier\Facture_123.pdf"
                            .Attachments.Add "C:\AutreDossier\Devis_234.pdf"
                            '...
                            .Send
                            End With



                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 mai 2023 à 18:21:19

                              Salut ! merci dès que je peux je m'y mets :) et te tiens au courant.

                              A+

                              -
                              Edité par doudoufly 16 mai 2023 à 18:28:45

                              • Partager sur Facebook
                              • Partager sur Twitter
                                27 novembre 2023 à 16:55:42

                                Salut umfred,

                                En fait les devis sont bien dans le répertoire de base "C:\devis\" mais dans ce répertoire on a un dossier portant le nom de la feuille du classeur.

                                Exemple : feuille 2350 bien les devis se trouvent dans C:\devis\2350\ et après ok on va récupérer le nom dans la colonne E

                                Faut juste que j'arrive à récupérer le ws.name. Peut-être plus compliqué je sais pas ce que tu en penses.

                                1)C'est peut-être ce que tu as voulu faire en écrivant :-° oups j'avais pas vu  => tableau_fichier(ubound(tableau_fichier))= RepBase & ws.Name & "\" & ws.Range("E" & ligne).value & ".pdf"

                                2)Du coup pour faire une boucle avec .Attachments.Add l et la variable tableau_Fichier ? encore une fois je débute désolé si c'est évident :) 

                                3) J'ai une erreur en rouge sur le code suivant:

                                if UBound(tableau_fichier >0) then ReDim Preserve tableau_fichier(UBound(tableau) - 1)

                                Merci par avance.

                                -
                                Edité par doudoufly 27 novembre 2023 à 18:55:27

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  27 novembre 2023 à 17:03:49

                                  ta demande ne correspond pas aux codes de ma réponse du 9 mai ??
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    28 novembre 2023 à 14:29:05

                                    Salut, si excuses moi de na pas être plus précis.

                                    En gros c'est comment je peux récupérer les données de la variable tableau pour joindre les fichiers au mail. je vais pas pouvoir les taper un par un si j'ai 10 devis à joindre

                                    .Attachments.Add "C:\MonDossier\MonFichier.xlsx"
                                    .Attachments.Add "C:\MonDossier\MonFichier1.docx"
                                    .Attachments.Add "C:\AutreDossier\Facture_123.pdf"
                                    .Attachments.Add "C:\AutreDossier\Devis_234.pdf"

                                    De plus j'ai une erreur code en rouge le code suivant ne marche pas

                                    if UBound(tableau_fichier >0) then ReDim Preserve tableau_fichier(UBound(tableau) - 1)

                                    Merci à toi

                                    -
                                    Edité par doudoufly 28 novembre 2023 à 14:30:02

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      29 novembre 2023 à 12:23:47

                                      mince, j'ai mal positionné ma parenthèse fermante 

                                      if UBound(tableau_fichier) >0 then ReDim Preserve tableau_fichier(UBound(tableau) - 1)


                                      Le tableau étant un tableau, il faut le parcourir avec un indice (peut-être plus "simple" avec un ForEach)

                                      https://learn.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/for-eachnext-statement 

                                      Dim i as integer ' si pas déjà existant
                                      for i = lbound(tableai) to ubound(tableau)
                                         .Attachments.Add tableau(i)
                                      Next i
                                      
                                      'ou
                                      Dim nom as variant
                                      For Each nom in tableau
                                          .Attachments.Add nom
                                      Next nom



                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        30 novembre 2023 à 17:37:14

                                        Salut,

                                        Les deux ne marchent pas. J'ai la même erreur sur le .Attachments.add que je ne m'explique pas peut-être dans une erreur dans le nom du tableau ou d'emplacement de la boucle.

                                        ContenuFichier = LireFichierTexte(MonFichier)
                                                With mail.CreateItem(olMailItem)
                                                .Subject = "Devis pour accord"
                                                .To = "xxx@xxxx.fr"
                                                .Body = ContenuFichier
                                                
                                                    'Dim j As Integer
                                                    'For j = LBound(tableau_fichier) To UBound(tableau_fichier)
                                                    '.attachments.Add tableau_fichier(j)
                                                    'Next j
                                                    
                                                    Dim nom As Variant
                                                    For Each nom In tableau_fichier
                                                    .Attachments.Add nom
                                                    Next nom
                                                    
                                                .Display
                                                End With



                                        -
                                        Edité par doudoufly 30 novembre 2023 à 17:37:59

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          30 novembre 2023 à 18:12:59

                                          Si au moins tu indiquais le message d'erreur 

                                          et un peu plus du contexte du code, on ne va pas pouvoir tout deviner 

                                          Vérifie au moins le contenu du tableau, si ça indique bien le chemin d'un fichier accessible et existant

                                          Il te manque peut-être quelques lignes par rapport à l'exemple donné dans la doc https://learn.microsoft.com/fr-fr/office/vba/api/outlook.attachments.add 

                                          -
                                          Edité par umfred 30 novembre 2023 à 18:14:25

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            30 novembre 2023 à 18:20:28

                                            Ci-joint le code complet:

                                            Sub envoyerDevis()
                                            
                                            'VARIABLE mail
                                            Dim mail As Variant
                                            Set mail = CreateObject("outlook.application")
                                            
                                            'VARIABLE CONTENU DU MAIL
                                            Dim contenuMail As String
                                            Dim MonFichier As String
                                            MonFichier = "M:\Users\testdevis.txt"
                                            Dim f As Integer
                                            f = FreeFile
                                            Open MonFichier For Output As #f
                                            
                                            'VARIABLES premières et dernières lignes du tableau des devis d'une feuille
                                            Dim derniereLigne As Long
                                            Dim premiereLigne As Long
                                            premiereLigne = 2
                                            
                                            'VARIABLE répertoire devis
                                            Dim RepBase As String
                                            RepBase = "M:\Users\DEVIS"
                                            
                                            'VARIABLE tableau qui récupere la liste des devis colonne A
                                            Dim tableau_fichier() As String
                                            ReDim Preserve tableau_fichier(0) As String
                                            
                                            'BOUCLE FEUILLE PAR FEUILLE
                                            Dim i
                                                For i = 1 To Worksheets.Count
                                                    Dim ws As Worksheet
                                                    Set ws = Worksheets(i)
                                                    derniereLigne = ws.Cells(Rows.Count, 1).End(xlUp).Row
                                                               
                                                        For Ligne = premiereLigne To derniereLigne
                                                        'on ajoute à la fin le chemin vers le fichier
                                                        tableau_fichier(UBound(tableau_fichier)) = RepBase & ws.Name & "\" & ws.Range("A" & Ligne).Value & ".pdf"
                                                        
                                                        Print #f, Tab, tableau_fichier(UBound(tableau_fichier))
                                                        
                                                        'on redimensionne en préservant les données à n+1
                                                        ReDim Preserve tableau_fichier(UBound(tableau_fichier) + 1)
                                                        
                                                        Next Ligne
                                                        
                                                        'retire le dernier élement qui doit être vide normalement
                                                        If UBound(tableau_fichier) > 0 Then ReDim Preserve tableau_fichier(UBound(tableau_fichier) - 1)
                                                                   
                                                Next i
                                            
                                            Close #f
                                            
                                            Sheets("A").Range("A1") = tableau_fichier(UBound(tableau_fichier))
                                            
                                             'ENVOYER MAIL
                                             
                                             Dim j As Integer
                                             
                                             ContenuFichier = LireFichierTexte(MonFichier)
                                                    With mail.CreateItem(olMailItem)
                                                    .Subject = "Devis pour accord"
                                                    .To = "xxx@xxxx.fr"
                                                    .Body = ContenuFichier
                                                    
                                                        
                                                        For j = LBound(tableau_fichier) To UBound(tableau_fichier)
                                                        .attachments.Add tableau_fichier(j)
                                                        Next j
                                                        
                                                        'Dim nom As Variant
                                                        'For Each nom In tableau_fichier()
                                                        '.Attachments.Add nom
                                                        'Next nom
                                                        
                                                    .Display
                                                    End With
                                            
                                            End Sub
                                            
                                            
                                            



                                            l'erreur est : J'ai vérifier l'emplacement ça parait bon. 

                                            -
                                            Edité par doudoufly 30 novembre 2023 à 18:24:26

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              30 novembre 2023 à 19:15:43

                                              et le message d'erreur ? (je suppose que c'est la même erreur quelque soit la boucle utilisée)

                                              voir si ce n'est pas la ligne qui semble manqué par rapport à l'exemple, ce qui donnerait

                                              With mail.CreateItem(olMailItem)
                                                  .Subject = "Devis pour accord"
                                                  .To = "xxx@xxxx.fr"
                                                  .Body = ContenuFichier
                                                  Set myAttachments = .Attachments     
                                                           
                                                  For j = LBound(tableau_fichier) To UBound(tableau_fichier)
                                                      myAttachments.Add tableau_fichier(j)
                                                  Next j
                                                   
                                                  'Dim nom As Variant
                                                  'For Each nom In tableau_fichier()
                                                      '.Attachments.Add nom
                                                  'Next nom
                                                       
                                                  .Display
                                              End With


                                              Mais là le code génére un seul mail, dans lequel il attache tous les fichiers présent dans le tableau_fichier, c'est bien le but recherché ?

                                              Question subsidiaire: la boucle plante avec quelle valeur de j ? et est-ce que le chemin contient un espace? si oui, il faut sans doute rajouter des guillemets autour du chemin

                                              if InStr(tableau_fichier(j)," ") >0 Then 
                                                  myAttachments.Add """" & tableau_fichier(j) & """"
                                              else
                                                  myAttachements.Add tableau_fichier(j)
                                              End If
                                              
                                              'on peut aussi l'écrire avec l'opérateur ternaire
                                              ' myAttachements.Add IIF(InStr(tableau_fichier(j)," ") >0, """" & tableau_fichier(j) & """", tableau_fichier(j))
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                1 décembre 2023 à 10:05:14

                                                Salut Umfred, merci pour ta réponse. J'ai peut-être trouvé l'erreur mais je ne vois pas d'où dans le code

                                                Quand j'enlève la boucle et que je laisse que le code suivant pour envoyer le mail:

                                                ContenuFichier = LireFichierTexte(MonFichier)
                                                        With mail.CreateItem(olMailItem)
                                                        .Subject = "Devis pour accord"
                                                        .To = "xxx@xxxx.fr"
                                                        .Body = ContenuFichier
                                                            
                                                            
                                                        .Display
                                                        End With

                                                ça fonctionne et voilà ce que contient le contenuFichier:

                                                                            M:\xxx\DEVIS1\essai2.pdf
                                                                            M:\xxx\DEVIS2\essai3.pdf
                                                                            M:\xxx\DEVIS2\essai4.pdf 

                                                Je ne sais pas du coup pourquoi il auto-incrémente le dossier DEVIS => DEVIS1, DEVIS2, DEVIS3

                                                C'est normal qui ne trouve pas le PDF car il se trouve dans DEVIS

                                                Je vois pas dans le code d'où ça peut venir !

                                                Pour répondre à ta question oui je cherche à faire q'un seul mail.

                                                Merci encore pour ton aide.

                                                -
                                                Edité par doudoufly 1 décembre 2023 à 10:07:36

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  1 décembre 2023 à 17:08:31

                                                  RepBase = "M:\Users\DEVIS"
                                                  ...
                                                  tableau_fichier(UBound(tableau_fichier)) = RepBase & ws.Name & "\" & ws.Range("A" & Ligne).Value & ".pdf"

                                                  ça vient de ce code là: on ajoute au RepBase, le nom de la feuille (donc sans doute 1, 2, ....)  => "M:\users\DEVIS1\[valeur].pdf"; "M:\users\DEVIS2\[valeur].pdf".
                                                  Dans le code que j'avais proposé initialement, j'avais bien terminé le chemin de RepBase par un "\" => "M:\users\DEVIS\". 

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    20 décembre 2023 à 18:29:26

                                                    Bonsoir,

                                                    Je n'arrive toujours pas à insérer les pièces jointes dans mon mail avec la boucle suivante. La variable tableau() contient les emplacements des fichiers PDF. Mais j'ai une erreur à myAttachements.Add tableau(j). Merci à vous pour votre aide.

                                                    ContenuFichier = LireFichierTexte(fichierTxt)
                                                    With mail.CreateItem(olMailItem)
                                                    .Subject = "Devis pour accord"
                                                    .To = "xxx@xxxx.fr"
                                                    .Body = ContenuFichier
                                                    
                                                        Dim j As Integer
                                                            For j = 0 To UBound(tableau)
                                                            Set myAttachments = .attachments
                                                            myAttachements.Add tableau(j)
                                                             
                                                            '.attachments.Add
                                                            
                                                         Next j
                                                    



                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      20 décembre 2023 à 19:30:56

                                                      sans code d'erreur ça va être compliqué... 

                                                      quelle valeur de j ? et donc quelle valeur de tableau(j) ? 

                                                      Tu recréés à chaque tour de boucle la variable myAttachments, sort la ligne 9 de la boucle (cf message du 30 novembre)

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        21 décembre 2023 à 8:48:10

                                                        Salut umfred, j'ai sorti la variable mayAttachments et ça ne marche pas. J'ai l'erreur suivante:

                                                        Erreur d'éxécution '424':

                                                        Objet requis

                                                        J'espère que c'est ça que tu souhaite savoir si non dis moi comment faire stp :)

                                                        Ci-dessous le code dans son intégralité. Je vais continuer de mon côté à chercher également. Merci A plus.

                                                        Sub essai1()
                                                        
                                                        'VARIABLE MAIL
                                                        Dim mail As Variant
                                                            Set mail = CreateObject("outlook.application")
                                                        Dim contenuMail As String
                                                        Dim fichierTxt As String
                                                            fichierTxt = "XXX"
                                                        Dim f As Integer
                                                        f = FreeFile
                                                        Open fichierTxt For Output As #f
                                                        
                                                        'VARIABLES LIGNES
                                                        Dim derniereLigneF, derniereLigneT, premiereLigneF, ligne As Long
                                                        premiereLigneF = 2
                                                        
                                                        'VARIABLE DEVIS
                                                        Dim repDevis As String
                                                        repDevis = "XXX"
                                                        
                                                        'VARIABLES TABLEAU
                                                        Dim tableau() As String
                                                        ReDim Preserve tableau(0) As String
                                                        Dim counter As Integer
                                                            counter = 0
                                                        
                                                        'BOUCLE FEUILLE PAR FEUILLE
                                                        Dim fl As Integer
                                                            For fl = 1 To Worksheets.Count
                                                                Dim ws As Worksheet
                                                                Set ws = Worksheets(fl)
                                                                derniereLigneF = ws.Cells(Rows.Count, 1).End(xlUp).Row
                                                                              
                                                                'BOUCLE POUR ENREGISTRER DANS LE TABLEAU
                                                                For ligne = premiereLigneF To derniereLigneF
                                                                    ReDim Preserve tableau(counter) As String
                                                                    tableau(counter) = repDevis & ws.Name & "\" & ws.Range("A" & ligne).Value & ".pdf"
                                                                    Print #f, Tab, tableau(counter)
                                                                    counter = counter + 1
                                                                Next ligne
                                                                
                                                            Next fl
                                                         
                                                        'VERIFICATION
                                                        For Each valeur In tableau
                                                        res = res & valeur & vbLf
                                                        Next
                                                        
                                                        MsgBox res
                                                                               
                                                        Close #f
                                                        
                                                        'ENVOYER MAIL
                                                        
                                                        ContenuFichier = LireFichierTexte(fichierTxt)
                                                        With mail.CreateItem(olMailItem)
                                                        .Subject = "Devis pour accord"
                                                        .To = "xxx@xxxx.fr"
                                                        .Body = ContenuFichier
                                                        
                                                        'ERROR ICI
                                                        
                                                            Dim j As Integer
                                                            Set myAttachments = .attachments
                                                            
                                                                For j = 0 To UBound(tableau)
                                                          
                                                                myAttachements.Add tableau(j)
                                                        
                                                                Next j
                                                        End With
                                                        
                                                        End Sub
                                                        



                                                        -
                                                        Edité par doudoufly 21 décembre 2023 à 8:51:50

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          21 décembre 2023 à 12:34:01

                                                          ContenuFichier = LireFichierTexte(fichierTxt)
                                                          Dim mymail
                                                          Set mymail = mail.CreateItem(olMailItem)
                                                          With mymail
                                                              .Subject = "Devis pour accord"
                                                              .To = "xxx@xxxx.fr"
                                                              .Body = ContenuFichier
                                                           
                                                              'ERROR ICI
                                                           
                                                              Dim j As Integer
                                                              Dim myAttachments
                                                              Set myAttachments = .attachments
                                                               
                                                              For j = 0 To UBound(tableau)
                                                             
                                                                  myAttachements.Add tableau(j)
                                                           
                                                              Next j
                                                          End With
                                                          L'erreur est la même que dans ton message précédent ? sur ta ligne 68 ? 
                                                          quelle valeur de j ? (voir dans la fenêtre Variables Locales ou en tapant dans la fenêtre d'exécution ?j , si les fenêtres ne sont pas visibles passer par le menu affichage pour les activer)
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            21 décembre 2023 à 17:18:57

                                                            L'erreur est la même que dans ton message précédent ? => j'ai modifié le code donc peux pas te dire


                                                            quelle valeur de j ? => C'est la référence de la variable tableau (0, 1, 2, 3 etc) pour localiser la donnée enregistrée qui est une variable string (l'emplacement du fichier PDF).


                                                            voir dans la fenêtre Variables Locales ou en tapant dans la fenêtre d'exécution ?j , si les fenêtres ne sont pas visibles passer par le menu affichage pour les activer) => Tu veux savoir quoi ? Dans la fenêtre exécution il y a rien et dans la fenêtre variable ça met J vide


                                                            Par contre avec le code suivant ça marche uniquement si le fichier PDF est bien présent. Mais si il ne l'ai pas alors qu'il est sensé être pour la variable tableau il met l'erreur

                                                            "fichier introuvable. vérifier que le chemin d'accès et le nom du fichier soit correct". Il faudrait peut-être mettre une condition pour vérifier la présence du fichier dans le répertoire avant de faire l'attachments

                                                            'essai 2
                                                                    For Each valeur In tableau
                                                                    .attachments.Add valeur
                                                                    Next




                                                            -
                                                            Edité par doudoufly 21 décembre 2023 à 17:27:41

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              22 décembre 2023 à 10:44:59

                                                              l'erreur de ta capture indique qu'il ne trouve pas le fichier que tu passes à .attachments.add donc oui tu pourrais rajouter un test vérifiant la présence du fichier.

                                                              Quand je demandais la valeur de j c'est sa vraie valeur au moment de l'erreur, pour que tu puisses regarder la valeur correspondante dans ton tableau; là comme tu as changé de type de boucle, ce n'est plus d'actualité pour j, mais ça le reste pour la valeur du chemin (ta variable valeur)

                                                              Lors de l'erreur, si tu cliques sur débogage, tu vas pouvoir voir la valeur de ton chemin (ici dans ta variable valeur) soit dans les variables locales soit en tapant dans la fenêtre exécution:

                                                              ?valeur 
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Boucles dans plusieurs feuilles Excel en VBA

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              • Editeur
                                                              • Markdown