Ralentir une Macro

Résolu
Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   -  
Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

J'ai une macro qui me sert à générer et à envoyer environ 200 avis de passage par mois à mes clients, le problème est que celle ci va trop vite et se mets en erreur environ entre 20 et 30 avis de passage déjà générer.

Si je désactive l'envoi automatique et que c'est moi qui clique sur envoyer dans Outlook je n'ai aucune erreur, c'est pour cela que je suppose que ma macro va trop vite et que je souhaiterais la ralentir entre chaque avis de passage générer et envoyer d'environ 3 ou 5 secondes.

Voici mon code :

Sub Creer_ADP()

Dim ligne As Integer
Dim Nombre As Integer
Dim colonne As Integer

Dim nom_pdf As String
Dim chemin_pdf As String
Dim cheminsave As String
Dim chemin_sect As String
Dim chemin_sect2 As String


Dim destinataire, sujet, fichierjoint As String
Dim Chem As String, Rep As String, Fich As String, Dest As String

'Actualisation données emails
'============================
Sheets("Répartition").Select
ThisWorkbook.RefreshAll
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Fax / Email").CurrentPage = "Email"

'Afficher le nombre d'envois
'===========================
Sheets("Avis de passage VP").Select
MsgBox "Nombre Total d'avis à envoyer = " & ActiveSheet.Range("U3").Value


'Boucle
'=======
Sheets("Avis de passage VP").Select

Nombre = ActiveSheet.Range("U4").Value
ligne = 7
colonne = 22

Worksheets("Répartition").Range("A" & ligne).Copy Worksheets("Avis de passage VP").Range("F1")

Do While ligne < Nombre

Worksheets("Répartition").Range("A" & ligne).Copy Worksheets("Avis de passage VP").Range("F1")
ligne = ligne + 1
colonne = colonne + 1

'Impression PDF
'==============
Sheets("Avis de passage VP").Select
nom_pdf = ActiveSheet.Range("J5").Value & ".pdf"
chemin_pdf = ActiveSheet.Range("J18").Value & nom_pdf
'chemin_save = ActiveSheet.Range("J14").Value
'chemin_save2 = ActiveSheet.Range("J15").Value
'chemin_sect = ActiveSheet.Range("J18").Value & nom_pdf
chemin_sect2 = ActiveSheet.Range("J19").Value

'création PDF avec ADOBE
'=======================
ActiveSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=chemin_pdf, _
        Quality:=xlQualityStandard, _
        IncludeDocProperties:=True, _
        IgnorePrintAreas:=False, _
        OpenAfterPublish:=False
        
        
'Copier ok dans A COLLER MAUDE colonne créé :
'===========================================
Sheets("Avis de passage VP").Select
Worksheets("A coller MAUDE").Range("BG" & Range("J1")) = Worksheets("Avis de passage VP").Range("H1")
        
'Envoi Email avec OUTLOOK :
'=========================
Dim OutApp As Object 'Déclaration de l'application objet Outlook
Dim OutMail As Object 'Déclaration du mail objet Outlook
Dim attach As String
Dim signature As String
Dim sigstring As String

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.createitem(0)

attach = Worksheets("Avis de passage VP").Range("J20")

With OutMail 'début de la boucle

    .To = Worksheets("Avis de passage VP").Range("J27")
    .CC = Worksheets("Avis de passage VP").Range("L1") 'va cherche la valeur dans le cellule B1 de la feuille "mail"
    '.BCC = ""
    .Subject = Worksheets("Avis de passage VP").Range("J6")
                                            ' séparer deux valeurs par un &
                                            ' le texte écrit 'en dur' doit toujours être entouré de ""
                                            ' & Time() & propID permet d'avoir l'heure de création du mail
     .display
     .htmlbody = "Bonjour," & "<Br>" & "<Br>" & Worksheets("Avis de passage VP").Range("J7") & "<Br>" & "<Br>" & "Restant à votre disposition." & "<Br>" & .htmlbody
    
     .Attachments.Add attach
    
    .display 'affiche le mail en brouillon dans Outlook, pratique pour vérifier avant d'envoyer
    '.Send 'envoie directement le mail
    '.Save 'sauvegarde le mail


'Copier ok dans A COLLER MAUDE colonne envoyé :
'===========================================
Sheets("Avis de passage VP").Select
Worksheets("A coller MAUDE").Range("BH" & Range("J1")) = Worksheets("Avis de passage VP").Range("H1")


End With 'fin de la boucle

'Fin Boucle :
'============
Loop

'Compter le nombre de fichiers générés :
'=======================================
nbfic = 0
Fichier = Dir(ActiveSheet.Range("J18").Value)
Do While Fichier <> ""
  nbfic = nbfic + 1
  Fichier = Dir
Loop

MsgBox ("Nombre de fichiers générés = ") & ActiveSheet.Range("U3").Value


'ouvrir le dossier d'enregistrement du fichier
'=============================================
Shell "explorer.exe /e," & chemin_sect2, vbNormalFocus


End Sub

Pouvez vous m'aider s'il vous plaît ?
Windows / Chrome 137.0.0.0

A voir également:

4 réponses

Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   5
 

Bonjour,

Essais effectués, cela fonctionne dans les 2 cas, je vais conserver la prog de la macro avec la fonction "DoEvents" qui est plus rapide.

Merci à vous pour votre aide sur ce sujet.

Cordialement

1
Bruno83200_6929 Messages postés 623 Date d'inscription   Statut Membre Dernière intervention   141
 

Bonjour,

Pour ralentir votre macro et ajouter un délai de 3 à 5 secondes entre chaque génération et envoi d'avis de passage, vous pouvez insérer une pause dans la boucle principale à l'aide de la fonction Application.Wait. Voici comment modifier votre code pour ajouter un délai de 5 secondes (vous pouvez ajuster à 3 secondes si nécessaire) après chaque envoi d'email.

J'ai modifié votre code :

Sub Creer_ADP()

Dim ligne As Integer
Dim Nombre As Integer
Dim colonne As Integer

Dim nom_pdf As String
Dim chemin_pdf As String
Dim cheminsave As String
Dim chemin_sect As String
Dim chemin_sect2 As String

Dim destinataire, sujet, fichierjoint As String
Dim Chem As String, Rep As String, Fich As String, Dest As String

'Actualisation données emails
'============================
Sheets("Répartition").Select
ThisWorkbook.RefreshAll
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Fax / Email").CurrentPage = "Email"

'Afficher le nombre d'envois
'===========================
Sheets("Avis de passage VP").Select
MsgBox "Nombre Total d'avis à envoyer = " & ActiveSheet.Range("U3").Value

'Boucle
'=======
Sheets("Avis de passage VP").Select

Nombre = ActiveSheet.Range("U4").Value
ligne = 7
colonne = 22

Worksheets("Répartition").Range("A" & ligne).Copy Worksheets("Avis de passage VP").Range("F1")

Do While ligne < Nombre

    Worksheets("Répartition").Range("A" & ligne).Copy Worksheets("Avis de passage VP").Range("F1")
    ligne = ligne + 1
    colonne = colonne + 1

    'Impression PDF
    '==============
    Sheets("Avis de passage VP").Select
    nom_pdf = ActiveSheet.Range("J5").Value & ".pdf"
    chemin_pdf = ActiveSheet.Range("J18").Value & nom_pdf
    chemin_sect2 = ActiveSheet.Range("J19").Value

    'création PDF avec ADOBE
    '=======================
    ActiveSheet.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=chemin_pdf, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=False
            
    'Copier ok dans A COLLER MAUDE colonne créé :
    '===========================================
    Sheets("Avis de passage VP").Select
    Worksheets("A coller MAUDE").Range("BG" & Range("J1")) = Worksheets("Avis de passage VP").Range("H1")
            
    'Envoi Email avec OUTLOOK :
    '=========================
    Dim OutApp As Object 'Déclaration de l'application objet Outlook
    Dim OutMail As Object 'Déclaration du mail objet Outlook
    Dim attach As String
    Dim signature As String
    Dim sigstring As String

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.createitem(0)

    attach = Worksheets("Avis de passage VP").Range("J20")

    With OutMail 'début de la boucle
        .To = Worksheets("Avis de passage VP").Range("J27")
        .CC = Worksheets("Avis de passage VP").Range("L1")
        .Subject = Worksheets("Avis de passage VP").Range("J6")
        .display
        .htmlbody = "Bonjour," & "<Br>" & "<Br>" & Worksheets("Avis de passage VP").Range("J7") & "<Br>" & "<Br>" & "Restant à votre disposition." & "<Br>" & .htmlbody
        .Attachments.Add attach
        .display 'affiche le mail en brouillon dans Outlook
        '.Send 'envoie directement le mail
        '.Save 'sauvegarde le mail

        'Copier ok dans A COLLER MAUDE colonne envoyé :
        '===========================================
        Sheets("Avis de passage VP").Select
        Worksheets("A coller MAUDE").Range("BH" & Range("J1")) = Worksheets("Avis de passage VP").Range("H1")
    End With 'fin de la boucle

    ' Ajout du délai de 5 secondes
    Application.Wait Now + TimeValue("00:00:05")

'Fin Boucle :
'============
Loop

'Compter le nombre de fichiers générés :
'=======================================
nbfic = 0
Fichier = Dir(ActiveSheet.Range("J18").Value)
Do While Fichier <> ""
    nbfic = nbfic + 1
    Fichier = Dir
Loop

MsgBox ("Nombre de fichiers générés = ") & ActiveSheet.Range("U3").Value

'ouvrir le dossier d'enregistrement du fichier
'=============================================
Shell "explorer.exe /e," & chemin_sect2, vbNormalFocus

End Sub

Conseils supplémentaires :

Testez avec un petit nombre d'envois : Avant de lancer la macro sur les 200 avis, testez-la sur un échantillon plus petit (par exemple, 10 avis) pour vérifier que le délai résout le problème.
Activez l'envoi automatique : Si vous souhaitez réactiver l'envoi automatique (.Send au lieu de .display), décommentez la ligne .Send et commentez .display après avoir validé que le délai fonctionne.
Optimisation : Pour éviter d'autres erreurs potentielles, assurez-vous que Outlook est bien ouvert avant de lancer la macro, car la création répétée d'objets Outlook (CreateObject("Outlook.Application")) dans la boucle peut également causer des problèmes. Vous pourriez envisager de créer l'objet OutApp une seule fois en dehors de la boucle.

Exemple pour déplacer la création d'Outlook hors de la boucle :

Set OutApp = CreateObject("Outlook.Application") 'Déplacer ici, avant la boucle
Do While ligne < Nombre
    Set OutMail = OutApp.createitem(0) 'Créer un nouvel email à chaque itération
    ' ... (reste du code) ...
Loop
Set OutApp = Nothing 'Libérer l'objet après la boucle

Testez ces modifications et faites-moi savoir si vous rencontrez encore des problèmes.


0
Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   5
 

Bonjour Bruno,

Merci pour la rapidité de votre réponse, mes avis de passage pour Juillet étant déjà envoyé, je ferais l'essai sur ceux d'Août vers le 10 juillet.

0
Bruno83200_6929 Messages postés 623 Date d'inscription   Statut Membre Dernière intervention   141 > Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 

OK tenez moi au courant ! Si cela ne fonctionne pas, on améliorera la macro !

0
Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   5 > Bruno83200_6929 Messages postés 623 Date d'inscription   Statut Membre Dernière intervention  
 

Merci,

Bonne journée a vous

1
cousinhub29 Messages postés 1074 Date d'inscription   Statut Membre Dernière intervention   361
 

Bonjour,

Une autre piste, attendre que l'application ait fini un envoi, avant de passer à l'autre.

Après la commande ".Send" (ou ".Save"), rajouter une ligne "DoEvents"

Peut-être?


0
Utilisateur anonyme
 

Bonjour,

Comme préconisé par cousinhub29 je pense qu'un doevents suffit pour redonner la main à Windows pour lui permettre de gérer sa pagination mémoire.

0
Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   5
 

Re, 

Le mois prochain je ferais l'essai avec les 2 versions.

Merci

1
Bruno83200_6929 Messages postés 623 Date d'inscription   Statut Membre Dernière intervention   141 > Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 

Avec doevents, n'oublie pas de remplacer display par send !

1
Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   5 > Bruno83200_6929 Messages postés 623 Date d'inscription   Statut Membre Dernière intervention  
 

oui comme cela :

        '.display 'affiche le mail en brouillon dans Outlook
        .Send 'envoie directement le mail
        '.Save 'sauvegarde le mail
        
        'Attendre la fin de l'envoi pour passer au prochain
        DoEvents
 

0
cousinhub29 Messages postés 1074 Date d'inscription   Statut Membre Dernière intervention   361 > Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention  
 

Re-,

Tu peux faire un essai, en ne mettant que ton adresse mail dans les cellules.

(Pour voir)

0
Orang-outanBlanc94 Messages postés 71 Date d'inscription   Statut Membre Dernière intervention   5 > cousinhub29 Messages postés 1074 Date d'inscription   Statut Membre Dernière intervention  
 

Non pas possible cela va m'écraser tous les avis de passage générer qui sont enregistrer dans un répertoire spécifiques.

Nous sommes 4 à utiliser cette Macro pour 4 secteurs géographique, vers le 10 juillet je ferais l'essai pour les avis de passage de Aout avec les 2 versions et je conserverai celle qui me semble être la plus adapté à ma demande.

Le fait d'être 4 je pourrai essayer 2 fois chaque version

Je vous tiendrai informé

Merci

1