Je n'arrive pas a étendre ma macro

Résolu
Clement -  
 Utilisateur anonyme -

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

4 réponses

  1. Utilisateur anonyme
     

    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
    1. Clement
       

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

      0
  2. Utilisateur anonyme
     

    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
  3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       

      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
  4. Clement
     

    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