Je n'arrive pas a étendre ma macro

Résolu

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. 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. Le problème c'est que sur la théorie je comprends mais je n'arrive pas à l'appliquer

      0
  2. 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
    1. Contributeur

      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. Contributeur

        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
    2. 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