Erreur dans boucle
Bonjour à tous,
c'est ma 1ère fois sur le forum et je bloque dans mon code VBA.
J'ai un fichier Excel avec des adresses mails pour X fournisseurs (fichier A) et j'ai Y fichiers Excel (B) à envoyer à des fournisseurs du fichier A (j'ai plus de fournisseurs que de fichiers Excel car certains fournisseurs ne sont tout simplement pas concernés pour ce trimestre).
J'ai créé un code qui va chercher le fichier Excel (B) qui se rattache au fournisseur et à un numéro de contrat (grâce à son intitulé qui comporte ces informations). Maintenant, je veux envoyer ce fichier Excel à l'adresse mail rattachée à ce fournisseur (indiquée dans le fichier A) et faire une boucle sur tous les fournisseurs.
Pour tous ceux qui ont un fichier les concernant, leur envoyer, pour le reste ne rien faire.
Or voilà où je suis perdue. Je souhaite que dans ma boucle, lorsque le fournisseur et son contrat ne matchent aucun fichier Excel (B), on passe au suivant jusqu'à ce qu'on trouve un fichier qui match et serait à envoyer et ainsi de suite.
J'espère être assez claire, voici mon code pour l'instant, le problème étant que lorsqu'aucun fichier Excel ne match un fournisseur, il envoie le fichier sur lequel je traite mon code (A) car c'est le fichier actif or c'est ce que je ne veux pas :
Sub Envoyer_Mail_Outlook()
Dim ObjOutlook As New Outlook.Application
Dim oBjMail, RP
Dim Wb As Workbook
Dim myItem As Outlook.MailItem
Dim myAttachments As Outlook.Attachments
Dim Varcellvalue As String
Set myApp = CreateObject("Outlook.Application")
Set myItem = myApp.CreateItem(olMailItem)
Set myAttachments = myItem.Attachments
For i = 3 To 15
Varcellvalue = Range("B" & i) & " - " & Range("C" & i)
Workbooks.Open ("C:\Users\XX\XX\XXX\XXXX\XX -" & Varcellvalue & ".xls")
myAttachments.Add (ActiveWorkbook.FullName)
ThisWorkbook.Activate
myItem.Subject = Range("B" & i) & " - " & Range("C" & i)
myItem.Body = Range("B" & i) & " - " & Range("C" & i)
myItem.To = Range("I" & i)
myItem.Send
Set oBjMail = Nothing
Set ObjOutlook = Nothing
Next i
End Sub
Merci beaucoup pour votre aide !
Bonjour,
Je débute en VBA donc je ne suis pas sur du tout mais il faudrait pas que tu ajoutes une condition "Si" du genre "Si le fichier match avec le fournisseur, alors tu envoies, sinon tu passes au suivant" ?
bonjour,
une proposition de correction (non testée)
Sub Envoyer_Mail_Outlook()
Dim myapp As Object, myitem As Object, i As Long
Dim varcellvalue As String, nf As String, repertoire As String
Set myapp = CreateObject("Outlook.Application")
repertoire = "C:\Users\XX\XX\XXX\XXXX\XX -"
For i = 3 To 15
Set myitem = myapp.CreateItem(0) '0 = mailItem
varcellvalue = Range("B" & i) & " - " & Range("C" & i)
nf = Dir(repertoire & varcellvalue & ".xls") 'on vérifie si fichier existe
If nf <> "" Then 'si fichier existe
With myitem
.Subject = Range("B" & i) & " - " & Range("C" & i)
.Body = Range("B" & i) & " - " & Range("C" & i)
.To = Range("I" & i)
.attachments.Add repertoire & varcellvalue & ".xls"
.display
'.Send enlever ' pour envoi automatique des messages
End With
End If
Next i
End Sub
Bonjour,
ton soucis c'est que tu ne testes nul part que ton fichier a bien été ouvert, tu peux essayer ce bout de code:
Sub Envoyer_Mail_Outlook()
Dim Fichier as Workbook
Dim ObjOutlook As New Outlook.Application
Dim oBjMail, RP
Dim Wb As Workbook
Dim myItem As Outlook.MailItem
Dim myAttachments As Outlook.Attachments
Dim Varcellvalue As String
Set myApp = CreateObject("Outlook.Application")
Set myItem = myApp.CreateItem(olMailItem)
Set myAttachments = myItem.Attachments
For i = 3 To 15
Varcellvalue = Range("B" & i) & " - " & Range("C" & i)
set Fichier = Workbooks.Open ("C:\Users\XX\XX\XXX\XXXX\XX -" & Varcellvalue & ".xls")
if Not Fichier is Nothing then
Fichier.Activate
myAttachments.Add (ActiveWorkbook.FullName)
myItem.Subject = Range("B" & i) & " - " & Range("C" & i)
myItem.Body = Range("B" & i) & " - " & Range("C" & i)
myItem.To = Range("I" & i)
myItem.Send
Fichier.Close
Set oBjMail = Nothing
Set ObjOutlook = Nothing
Set Fichier = Nothing
End If
Next i
End Sub
Merci de me dire si ça fonctionne
If not fichier is nothing devrait vérifier que le classeur a bien été ouvert, sinon Fichier devra être vide, car je le vide après chaque envoi de mail.
EDIT:
salut h2so4
Ça fonctionne merci beaucoup !
bonjour,
une proposition de correction (non testée)
Sub Envoyer_Mail_Outlook() Dim myapp As Object, myitem As Object, i As Long Dim varcellvalue As String, nf As String, repertoire As String Set myapp = CreateObject("Outlook.Application") repertoire = "C:\Users\XX\XX\XXX\XXXX\XX -" For i = 3 To 15 Set myitem = myapp.CreateItem(0) '0 = mailItem varcellvalue = Range("B" & i) & " - " & Range("C" & i) nf = Dir(repertoire & varcellvalue & ".xls") 'on vérifie si fichier existe If nf <> "" Then 'si fichier existe With myitem .Subject = Range("B" & i) & " - " & Range("C" & i) .Body = Range("B" & i) & " - " & Range("C" & i) .To = Range("I" & i) .attachments.Add repertoire & varcellvalue & ".xls" .display '.Send enlever ' pour envoi automatique des messages End With End If Next i End Sub
Bonjour,
ton soucis c'est que tu ne testes nul part que ton fichier a bien été ouvert, tu peux essayer ce bout de code:
Sub Envoyer_Mail_Outlook() Dim Fichier as Workbook Dim ObjOutlook As New Outlook.Application Dim oBjMail, RP Dim Wb As Workbook Dim myItem As Outlook.MailItem Dim myAttachments As Outlook.Attachments Dim Varcellvalue As String Set myApp = CreateObject("Outlook.Application") Set myItem = myApp.CreateItem(olMailItem) Set myAttachments = myItem.Attachments For i = 3 To 15 Varcellvalue = Range("B" & i) & " - " & Range("C" & i) set Fichier = Workbooks.Open ("C:\Users\XX\XX\XXX\XXXX\XX -" & Varcellvalue & ".xls") if Not Fichier is Nothing then Fichier.Activate myAttachments.Add (ActiveWorkbook.FullName) myItem.Subject = Range("B" & i) & " - " & Range("C" & i) myItem.Body = Range("B" & i) & " - " & Range("C" & i) myItem.To = Range("I" & i) myItem.Send Fichier.Close Set oBjMail = Nothing Set ObjOutlook = Nothing Set Fichier = Nothing End If Next i End Sub
Merci de me dire si ça fonctionne
If not fichier is nothing devrait vérifier que le classeur a bien été ouvert, sinon Fichier devra être vide, car je le vide après chaque envoi de mail.
EDIT:
salut h2so4
Bonjour ! Merci beaucoup pour ton aide
Merci encore en tout cas
Bonjour,
J'aurais peut-être dû mettre un On error resume next avant, c'est pour ça, mais la solution de h2so4 est plus adaptée oui
Bonne continuation et merci de m'avoir fait un retour