Correction macro excel

Résolu/Fermé
Utilisateur anonyme - 24 août 2010 à 16:52
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 30 août 2010 à 11:37
Bonjour,

Afin d'envoyer un mail automatique en fonction de la valeur d'une cellule, j'utilise la macro suivante :

Sub Demande_correction1()
If Range("J2").Value = "KO" Or Range("K2").Value = "KO" Or Range("L2").Value = "KO" Or Range("M2").Value = "KO" Or Range("N2").Value = "KO" Or Range("O2").Value = "KO" Then
Dim y As String
Dim ol As Object, myItem As Object
y = Range("G2").Value
chemin = ActiveWorkbook.Path
Set ol = CreateObject("outlook.application")
Set myItem = ol.CreateItem(olMailItem)
myItem.to = y
myItem.Subject = "Demande de Correction"
myItem.Body = "Bonjour, " & Chr(10) & "" & Chr(10) & _
"Message." & Chr(10) & "" & Chr(10) & _
"Cordialement," & Chr(10) & "" & Chr(10) & _
Range("H2").Value & Chr(10) & "" & Chr(10) & _
Range("A1").Value & " : " & Range("A2").Value & Chr(10) & _
Range("B1").Value & " : " & Range("B2").Value & Chr(10) & _
Range("C1").Value & " : " & Range("C2").Value & Chr(10) & _
Range("J1").Value & " : " & Range("J2").Value & Chr(10) & _
Range("K1").Value & " : " & Range("K2").Value & Chr(10) & _
Range("L1").Value & " : " & Range("L2").Value & Chr(10) & _
Range("M1").Value & " : " & Range("M2").Value & Chr(10) & _
Range("N1").Value & " : " & Range("N2").Value & Chr(10) & _
Range("O1").Value & " : " & Range("O2").Value & Chr(10) & _
Range("P1").Value & " : " & Range("P2").Value
myItem.Send
Set ol = Nothing
End If
End Sub

Pourriez m'aider à la modifier afin qu'elle marcher une plage de cellules ( 20 lignes par exemple). En fait je n'arrive pas à modifier cette macro de manière à ce qu'elle ne s'exécute qu'une seule fois par ligne.

Cette macro est lancée à partir de celle - ci :

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, [R2:R2]) Is Nothing Then
Demande_correction1
End If

End Sub

J'aimerai en fait adapter ce code pour un ensemble de lignes est déclencher son exécution dès qu'une valeur est inscrite dans la colonne R pour la ligne correspondante. Je ne sais pas si j'ai été claire.

Merci d'avance

Laure
A voir également:

6 réponses

ailp Messages postés 83 Date d'inscription vendredi 16 avril 2010 Statut Membre Dernière intervention 16 septembre 2010 8
Modifié par ailp le 3/09/2010 à 11:05
Salut

essaye ca :


Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, [R:R]) Is Nothing Then
Demande_correction1(Target.Row)
End If

End Sub


Sub Demande_correction1(byval pRow as Long)
If Range("J" & pRow).Value = "KO" Or Range("K" & pRow).Value = "KO" Or Range("L" & pRow).Value = "KO" Or Range("M" & pRow).Value = "KO" Or Range("N" & pRow).Value = "KO" Or Range("O" & pRow).Value = "KO" Then
Dim y As String
Dim ol As Object, myItem As Object
y = Range("G" & pRow).Value
chemin = ActiveWorkbook.Path
Set ol = CreateObject("outlook.application")
Set myItem = ol.CreateItem(olMailItem)
myItem.to = y
myItem.Subject = "Demande de Correction"
myItem.Body = "Bonjour, " & Chr(10) & "" & Chr(10) & _
"Message." & Chr(10) & "" & Chr(10) & _
"Cordialement," & Chr(10) & "" & Chr(10) & _
Range("H2").Value & Chr(10) & "" & Chr(10) & _
Range("A1").Value & " : " & Range("A" & pRow).Value & Chr(10) & _
Range("B1").Value & " : " & Range("B" & pRow).Value & Chr(10) & _
Range("C1").Value & " : " & Range("C" & pRow).Value & Chr(10) & _
Range("J1").Value & " : " & Range("J" & pRow).Value & Chr(10) & _
Range("K1").Value & " : " & Range("K" & pRow).Value & Chr(10) & _
Range("L1").Value & " : " & Range("L" & pRow).Value & Chr(10) & _
Range("M1").Value & " : " & Range("M" & pRow).Value & Chr(10) & _
Range("N1").Value & " : " & Range("N" & pRow).Value & Chr(10) & _
Range("O1").Value & " : " & Range("O" & pRow).Value & Chr(10) & _
Range("P1").Value & " : " & Range("P" & pRow).Value
myItem.Send
Set ol = Nothing
End If
End Sub


J'ai modifié ta macro pour lui passer en paramètre la ligne modifié, de ce fait, au lieu d'appeler "J2", tu appeles "J" & pRow qui renverra la cellule J de la ligne modifiée.
Le NotIntersect se fait maintenant sur la plage R:R, donc la colonne R.

+++

Dépannage, formation et création de site internet en Gironde
www.ailp-informatique.net
0
Utilisateur anonyme
27 août 2010 à 16:32
Bonjour,

Merci pour ton aide.

Mais là j'ai un autre souci, je ne sais pas pourquoi, mais avec ta modification, ça ne marche pas du tout.
Ça me met : « Erreur compilation : variable non définie » sur le chemin

Laure
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
24 août 2010 à 17:19
Bonjour,

Pour répondre à ta dernière question : non, pas très claire.

Si tu souhaite exécuter ta macro chaque fois que tu change une valeur de la colonne R modifie l'appel comme ceci :

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, [R:R]) Is Nothing Then
Demande_correction1
End If

End Sub


Cordialement
Patrice
0
Bonjour,

En fait j'ai plus de difficulté à adapter la seconde macro.
Je voudrai que la 1er macro lance l'exécution d'une 2nd macro chaque fois qu'une donnée est saisie dans une cellule de la colonne R. Ma 2nd macro envoyant un message reprenant les valeurs de certaines cellules de la même ligne que la que la cellule ayant été modifié dans la colonne R.

Exemple :

Si je saisie « ok » dans « R2 »
Je voudrai que la 2nd macro envoies un message avec le contenu des cellules O2 et P2 uniquement

Si je saisie « ok » dans « R3 » dans mon message j'aurai le contenu des celles O3 et P3, etc.

la 2nd macro s'éxécutant selon certaines conditions.

Laure
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
27 août 2010 à 21:30
Bonsoir,

Comme tu n'as pas précisé « certaines conditions », je te propose le code ci-dessous qui répond à ton dernier énoncé :

Private Sub Worksheet_Change(ByVal Target As Range)

If Not Intersect(Target, [R:R]) Is Nothing Then
  Demande_correction1 (Target.Row)
End If


End Sub

Sub Demande_correction1(ByVal ligne As Long)
Dim y As String, Msg As String
Dim ol As Object, myItem As Object

If Range("R" & ligne).Value = "ok" Then
  'Ajouter ici les autres conditions d'exécution (penser au End If final) :
  'If [conditions] Then
    y = Range("G2").Value
    Msg = "Bonjour, " & vbLf & vbLf & _
    "Message :" & vbLf & vbLf & _
    Range("O1").Value & " : " & Range("O" & ligne).Value & vbLf & _
    Range("P1").Value & " : " & Range("P" & ligne).Value & vbLf & vbLf & _
    "Cordialement."
    Set ol = CreateObject("outlook.application")
    Set myItem = ol.CreateItem(olMailItem)
    With myItem
      .to = y
      .Subject = "Demande de Correction"
      .Body = Msg
      .Send
    End With
    Set ol = Nothing
  'penser à ajouter la ligne ci-dessous si d'autres conditions
  'End If
End If

End Sub


Cordialement
Patrice
0
Utilisateur anonyme
30 août 2010 à 09:21
Bonjour,

Merci de m'aider.

La 2nd macro que vous me proposez ressemble beaucoup à ma 2nd macro après les modifications de ailp.

Mais là je ne sais pas du tout pourquoi ça me fait « erreur de compilation : variable non définies » sur olMailItem

Laure
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
30 août 2010 à 10:46
Bonjour,

Tu pourrais remplacer olMailItem par 0, mais il est préférable d'ajouter la référence à Outlook dans l'éditeur VBA (Alt+F11) :
Outils, Références..., cocher Microsoft OutLoock xx.x Object Library (xx.x = version)

Patrice
0
Merci beaucoup !

ça marche ... Pourriez vous m'expliquer pourquoi ce n'était pas le cas avec « olMailItem »

Laure
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
30 août 2010 à 11:20
Re,

olMailItem est une constante de la bibliothèque Outloock.
Pour qu'elle soit reconnue par le compilateur, il faut faire référence à cette bibliothèque dans l'éditeur VBA.
L'autre solution consiste à remplace la constante inconnue par sa value (0 pour oldMailItem).

Cordialement
Patrice
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
30 août 2010 à 11:22
PS: les références sont enregistrée dans le projet, cela peut expliquer que dans un nouveau classeur elle soit absente.
0
Utilisateur anonyme
30 août 2010 à 11:35
Merci
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 776
30 août 2010 à 11:37
De rien, avec plaisir
0