Problème avec worksheet change
bonjour
je ne suis pas experte en vba et j'essaie de me débrouiller en consultant les echanges sur ce forum mais la je bloque.
j'ai créé un formulaire qui alimente une feuille colonnes A à H et qui indique au destinataire que sa demande est prise en compte via envoi de mail : jusqu'ici tout va bien (mais c'est ca qui plante le reste je mets le code tout en bas)
sur cette feuille où les données sont intégrées (tableau de suivi), je dois pouvoir modifier le statut de traitement via liste déroulante (ok aussi) en colonne I et je voudrai que cela envoi l'information au demandeur lorsqu'une modification est réalisée : cela fonctionne mais de manière aléatoire
mon plus gros soucis : je peux sur ce tableau de suivi mettre des informations dans les colonnes suivantes : colonnes J K et L et là j'ai un soucis parce qu'il m'indique erreur destinataire mais je ne veux pas que les modifications de ces colonnes génèrent l’exécution de ma macro . je pense qu'il y a donc un soucis sur mon worksheet_change. Pourriez-vous m'aider ? ce serait super cool merci à ceux qui me liront
voici la macro en question
Private Sub Worksheet_selectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("I1:I10000")) Is Nothing Then
With Target
sTo = .Offset(0, -5).Value
sSubject = .Offset(0, -4).Value
End With
End If
Dim oApp As Outlook.Application
Dim oMsg As Outlook.MailItem
Set oApp = Outlook.Application
Set oMsg = oApp.CreateItem(olMailItem)
With oMsg
.To = sTo
.Subject = "Modification statut traitement OA : " & sSubject
.BodyFormat = olFormatHTML
.Body = "le statut de votre OA : " & sSubject & " vient d'être modifié : " & ActiveCell.Value
'.Attachments.Add ActiveWorkbook.FullName
End With
oMsg.Send
Set oMsg = Nothing
Set oApp = Nothing
le code d'intégration des données du formulaire
Private Sub CommandButton1_Click()
If ComboBox1 = "" Or TextBox2 = "" Or TextBox3 = "" Or TextBox4 = "" Or TextBox5 = "" Or TextBox6 = "" Then
MsgBox ("Veuillez renseigner tous les champs")
Exit Sub
End If
Dim L As Integer
If MsgBox("Confirmez-vous l'enregistrement des données ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
L = Sheets("Tableau Suivi").Range("a65536").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
Sheets("Tableau Suivi").Range("C" & L).Value = ComboBox1
Sheets("Tableau Suivi").Range("D" & L).Value = TextBox8
Sheets("Tableau Suivi").Range("A" & L).Value = TextBox2
Sheets("Tableau Suivi").Range("B" & L).Value = TextBox3
Sheets("Tableau Suivi").Range("E" & L).Value = TextBox4
Sheets("Tableau Suivi").Range("F" & L).Value = TextBox5
Sheets("Tableau Suivi").Range("G" & L).Value = TextBox6
Sheets("Tableau Suivi").Range("H" & L).Value = TextBox7
End If
Dim oApp As Outlook.Application
Dim oMsg As Outlook.MailItem
Set oApp = Outlook.Application
Set oMsg = oApp.CreateItem(olMailItem)
With oMsg
.To = TextBox8.Value
.Subject = "Enregistrement OA par le magasin de Toul"
.BodyFormat = olFormatHTML
.Body = "Bonjour, je vous confirme l'enregistrement de l'OA - Description du besoin : " & TextBox4 & " avec une date de besoin au " & TextBox5
'.Attachments.Add ActiveWorkbook.FullName
End With
oMsg.Send
Set oMsg = Nothing
Set oApp = Nothing
''''''''''''''''''''''''''''''''''''''''''''''''''
'ThisWorkbook.Close SaveChanges:=True
'ThisWorkbook.Close
MsgBox " Enregistrement validé"
Unload Me
Sheets("Intro").Activate
End SubBonjour,
Merci d'utiliser les balises </> pour rendre votre code lisible...
A première vue, cette instruction est placée beaucoup trop tôt dans le code :
End IfDu coup, tout ce qui suit est exécuté, quelle que soit la plage modifiée sur la feuille.
PS : les déclarations de variable en cours de macro sont à proscrire ! Mieux vaut les grouper en début de macro.
Bonjour
désolée pour les balises j'arrivais pas à m'en servir.
merci beaucoup de m'avoir répondu. j'ai changé le End If de place et déjà cela va mieux je peux modifier mes colonnes suivantes sans quand la macro se ré-exécute.
j'ai encore 2 questions :
- qu'entendez vous par "les déclarations de variable en cours de macro sont à proscrire ! Mieux vaut les grouper en début de macro." ? si j'ai bien compris je dois remplacer les active.cell.value qui se promènent par une déclaration dans mon target au début . est-ce bien cela ?
- pourquoi lorsque je créé un nouvel enregistrement via mon formulaire il m'envoie un mail et il me renvoie un mail de modification "vide" quand j'ouvre le tableau de suivi même si je n'ai pas changé la valeur de la cellule ?
merci encore à vous
j'ai encore 2 questions :
- qu'entendez vous par "les déclarations de variable en cours de macro sont à proscrire ! Mieux vaut les grouper en début de macro." ? si j'ai bien compris je dois remplacer les active.cell.value qui se promènent par une déclaration dans mon target au début . est-ce bien cela ?
Bonjour,
Déclaration de variable = instruction qui commence par Dim
Pour la seconde question, je ne sais pas, je n'ai pas épluché en détail le pavé de code !
J'ai modifié un peu la syntaxe, mais je n'ai jamais utilisé VBA pour envoyer des mails, ni la possibilité de le tester pour l'instant, donc ce n'est pas dit que tout fonctionne !
Private Sub Worksheet_selectionChange(ByVal Target As Range)
Dim oApp As Outlook.Application, oMsg As Outlook.MailItem
If Not Intersect(Target, Range("I1:I10000")) Is Nothing Then
With Target
sTo = .Offset(0, -5).Value
sSubject = .Offset(0, -4).Value
End With
Set oApp = Outlook.Application
Set oMsg = oApp.CreateItem(olMailItem)
With oMsg
.To = sTo
.Subject = "Modification statut traitement OA : " & sSubject
.BodyFormat = olFormatHTML
.Body = "le statut de votre OA : " & sSubject & " vient d'être modifié : " & Target.Value
.Send
End With
Set oMsg = Nothing
Set oApp = Nothing
End If
End Sub
Private Sub CommandButton1_Click()
Dim L As Integer, oApp As Outlook.Application, oMsg As Outlook.MailItem
If ComboBox1 = "" Or TextBox2 = "" Or TextBox3 = "" Or TextBox4 = "" Or TextBox5 = "" Or TextBox6 = "" Then
MsgBox ("Veuillez renseigner tous les champs")
Exit Sub
End If
If MsgBox("Confirmez-vous l'enregistrement des données ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
With Sheets("Tableau Suivi")
L = .Range("A" & Rows.Count).End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau non vide
.Range("C" & L).Value = ComboBox1
.Range("D" & L).Value = TextBox8
.Range("A" & L).Value = TextBox2
.Range("B" & L).Value = TextBox3
.Range("E" & L).Value = TextBox4
.Range("F" & L).Value = TextBox5
.Range("G" & L).Value = TextBox6
.Range("H" & L).Value = TextBox7
End With
Set oApp = Outlook.Application
Set oMsg = oApp.CreateItem(olMailItem)
With oMsg
.To = TextBox8.Value
.Subject = "Enregistrement OA par le magasin de Toul"
.BodyFormat = olFormatHTML
.Body = "Bonjour, je vous confirme l'enregistrement de l'OA - Description du besoin : " & TextBox4 & " avec une date de besoin au " & TextBox5
.Send
End With
Set oMsg = Nothing
Set oApp = Nothing
MsgBox " Enregistrement validé"
Unload Me
Sheets("Intro").Activate
End If
End Submerci à vous Pedro22 d'avoir pris le temps de regarder mon problème. je teste cela en rentrant ce soir
bonne fin de journée