Je n'arrive pas a étendre ma macro

Résolu/Fermé
Clement - Modifié le 20 oct. 2022 à 12:10
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 - 21 oct. 2022 à 08:43

Bonjour,

J'ai testé ma macro sur la première ligne de ma feuille et je souhaite qu'elle s'applique sur les lignes suivantes.

Pour expliquer le projet, lorsque la date en C1 est dépassée, cela envoi un mail de prévention.
Voici ma macro. Concrètement je veux que les 1 passe au 2 puis 3 et ainsi desuite.

Sub Alerte()

Dim M As Object, OlApp As Object, Destinataire As String, n As Integer

If Date > [D1] And [E1] = "" Then
  Destinataire = ***@***
  Set OlApp = CreateObject("Outlook.application")
  Set M = OlApp.CreateItem(olMailItem)
  With M
    .Subject = "Alerte"
    .Body = "Il faut recommander une " & Range("B1") & " pour " & Range("A1")
    .Recipients.Add Destinataire
    .Send
  End With
  [E1] = "X"
End If

End Sub

Merci d'avance pour votre aide !

EDIT: Ajout des balises de code.

Clément

A voir également:

4 réponses

Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
20 oct. 2022 à 14:19

Bonjour 

je te conseille la lecture de la doc concernant les boucle for.

Il sera sage de sortir cette ligne

Set OlApp = CreateObject("Outlook.application")

De la boucle, ça évitera d'initialiser "50" instances de d'outlook alors qu'une suffit


1

Le problème c'est que sur la théorie je comprends mais je n'arrive pas à l'appliquer

0
Whismeril Messages postés 19145 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 29 septembre 2024 919
21 oct. 2022 à 08:43

Bonjour 

Pour tes prochains posts, merci d'utiliser la coloration syntaxique comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

De plus, l'indentation permet de faciliter la lecture, donc le développement et surtout le déboggage.

Je t'ai conseillé de sortir la création de l'objet outlook de la boucle, yg_be (que je salue) l'a fait dans ses exemples.

Mais toi non, du coup du lances 305 instances d'outlook en toile de fond, ça sature la RAM et prend un temps beaucoup plus important que nécessaire.

Dans ces exemples, yg_be a aussi sorti l'assignation du destinataire de la boucle, comme c'est tout le temps le même, tu crées là encore 305 variables différentes pour stocker la même chose, chargelent de RAM, perte de temps etc...


Bref de manière générale, dans une boucle, on ne fair que ce qui change


1
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 Ambassadeur 1 539
20 oct. 2022 à 15:24

bonjour,

peut-être:

dim lg as long
  Set OlApp = CreateObject("Outlook.application")
Destinataire = ***@***
for lg = 1 to 123
If Date > cells(lg,"d") And cells(lg,"e") = "" Then
  Set M = OlApp.CreateItem(olMailItem)
  With M
    .Subject = "Alerte"
    .Body = "Il faut recommander une " & cells(lg,"b") & " pour " & cells(lg,"a")
    .Recipients.Add Destinataire
    .Send
  End With
  cells(lg,"e") = "X"
End If
next lg
0
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 539
20 oct. 2022 à 15:28

On peut aussi arrêter la boucle sur une condition:

dim lg as long
lg=1
do while cells(lg,"d") <> ""
    ' ...
    lg=lg+1
loop
1

Voici mon code final qui fonctionne

Sub Auto_Open()
Dim M As Object, OlApp As Object, Destinataire As String, n As Integer
n = 1
Do While n < 305
If Date > Range("I" & n) And Range("J" & n) = "" Then
Destinataire = ***@***
Set OlApp = CreateObject("Outlook.application")
Set M = OlApp.CreateItem(olMailItem)
With M
.Subject = "Alerte"
.Body = "Il faut recommander une " & Range("C" & n) & " pour " & Range("F" & n)
.Recipients.Add Destinataire
.Send
End With
Range("J" & n) = "X"
End If
n = n + 1
Loop
End Sub

0