Correction macro excel
Résolu
Utilisateur anonyme
-
Patrice33740 Messages postés 8400 Date d'inscription Statut Membre Dernière intervention -
Patrice33740 Messages postés 8400 Date d'inscription Statut Membre Dernière intervention -
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
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
6 réponses
-
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 -
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-
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
-
-
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
-
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 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 -