Vba-e Probleme boucle sur envoi mail
Fermé
Invite5
-
1 juil. 2009 à 14:09
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 - 3 juil. 2009 à 14:57
Bidouilleu_R Messages postés 1181 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 12 juillet 2012 - 3 juil. 2009 à 14:57
Bonjour,
J'ai un problème, j'ai une macro qui envoi un mail lorsque range("a1").value = "1"
Le problème c'est que cette valeur (1) ne doit pas changer, donc j'ai des envois de mail en boucle !
Comment faire en que la macro envoimail s'execute une seule fois après avoir tester la valeur de a1?
Merci !
J'ai un problème, j'ai une macro qui envoi un mail lorsque range("a1").value = "1"
Le problème c'est que cette valeur (1) ne doit pas changer, donc j'ai des envois de mail en boucle !
Comment faire en que la macro envoimail s'execute une seule fois après avoir tester la valeur de a1?
Merci !
A voir également:
- Vba-e Probleme boucle sur envoi mail
- Publipostage mail - Accueil - Word
- Programmer envoi mail gmail - Guide
- É - Guide
- Envoi mail cci - Guide
- Windows live mail - Télécharger - Mail
23 réponses
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
1 juil. 2009 à 15:17
1 juil. 2009 à 15:17
bonjour,
une remarque ! range("a1").value = "1"
le fait de mettre des guillemets te trompera si tu contrôles une valeur 1 est différent de "1"
fait ce test
Sub toto()
Sheets("feuil1").Select
If IsNumeric(Range("A1").Value) Then
MsgBox ("c'est un chiffre")
Else
MsgBox ("c'est du texte")
End If
End Sub
selon que cela te fait progresser ou non....
tu peux nous montrer ta boucle....
A+
une remarque ! range("a1").value = "1"
le fait de mettre des guillemets te trompera si tu contrôles une valeur 1 est différent de "1"
fait ce test
Sub toto()
Sheets("feuil1").Select
If IsNumeric(Range("A1").Value) Then
MsgBox ("c'est un chiffre")
Else
MsgBox ("c'est du texte")
End If
End Sub
selon que cela te fait progresser ou non....
tu peux nous montrer ta boucle....
A+
Voila ma boucle :
Il me créé des centaines de messages outlook.
Private Sub Worksheet_Change(ByVal Target As Range) DateJour = Now DOA = Range("e161").Value Date48 = 48 If DateJour - DOA > Date48 Then Range("z161").Value = "1" Else: Range("z161").Value = "0" End If Sheets("Main courante").Select If IsNumeric(Range("Z161").Value) Then Call SendMail_Outlook end sub
Il me créé des centaines de messages outlook.
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
1 juil. 2009 à 15:59
1 juil. 2009 à 15:59
If DateJour - DOA > Date48 Then
Range("z161").Value = 1
Else: Range("z161").Value = 0
End If
Sheets("Main courante").Select
If Range("Z161").Value<>0 Then
Call SendMail_Outlook
endif
end sub
Range("z161").Value = 1
Else: Range("z161").Value = 0
End If
Sheets("Main courante").Select
If Range("Z161").Value<>0 Then
Call SendMail_Outlook
endif
end sub
Toujours la boucle !
J'ai remarqué que si je faisais, après SendMail_Outlook un Range("Z161").Value = 2
Il restait à 1 mail.
Donc il faut arrêter la macro SendMail_Outlook après une seule execution, comment faire?
merci!
J'ai remarqué que si je faisais, après SendMail_Outlook un Range("Z161").Value = 2
Il restait à 1 mail.
Donc il faut arrêter la macro SendMail_Outlook après une seule execution, comment faire?
merci!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
1 juil. 2009 à 21:46
1 juil. 2009 à 21:46
Range("Z161").Value = 2 ....... Il restait à 1 mail.
C'est normal car tu utilises .... Worksheet_Change
en mettant 2 il y a un changement donc tu relances la procédure et comme
la valeur est différente de 0 tu lances un mail.
mais on peut améliorer...
Essaye ça!
Private Sub Worksheet_Change(ByVal Target As Range)
DateJour = Now
DOA = Range("e161").Value
Date48 = 48
If DateJour - DOA > Date48 Then
Range("z161").Value = 1
Else: Range("z161").Value = 0
End If
Sheets("Main courante").Select
If Range("Z161").Value<>0 and Range("Z161").Value<2 Then
Call SendMail_Outlook
endif
end sub
A+
C'est normal car tu utilises .... Worksheet_Change
en mettant 2 il y a un changement donc tu relances la procédure et comme
la valeur est différente de 0 tu lances un mail.
mais on peut améliorer...
Essaye ça!
Private Sub Worksheet_Change(ByVal Target As Range)
DateJour = Now
DOA = Range("e161").Value
Date48 = 48
If DateJour - DOA > Date48 Then
Range("z161").Value = 1
Else: Range("z161").Value = 0
End If
Sheets("Main courante").Select
If Range("Z161").Value<>0 and Range("Z161").Value<2 Then
Call SendMail_Outlook
endif
end sub
A+
Ton code marche !
mais la je comprends pas ! qd j'entre une date dans e165, il m'envoi quand même un tas d'e-mail !
je n'ai donné aucune instruction ni conidtion sur cette cellule !
je pense que c'est Private Sub Worksheet_Change(ByVal Target As Range) qui gene.
on v y arriver ! :p
mais la je comprends pas ! qd j'entre une date dans e165, il m'envoi quand même un tas d'e-mail !
je n'ai donné aucune instruction ni conidtion sur cette cellule !
je pense que c'est Private Sub Worksheet_Change(ByVal Target As Range) qui gene.
on v y arriver ! :p
Si on mettait un bouton : Tester la feuille, et les instructions et conditions sur un _Click ?
Parce que a chaque fois qu'on modifit une cellule il reteste Z161 j'ai l'impression.
Parce que a chaque fois qu'on modifit une cellule il reteste Z161 j'ai l'impression.
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
2 juil. 2009 à 10:06
2 juil. 2009 à 10:06
Non il faut faire un petit truc différend !
Patiente je te dis çA...
Patiente je te dis çA...
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
2 juil. 2009 à 10:19
2 juil. 2009 à 10:19
Essaye comme ça!
j'ai mis des commentaires ... il faut lire
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Intersection As Range, Plage As Range
Set Plage = Range("Z161") ' on ne contrôle qu'une cellule
Set Intersection = Application.Intersect(Target, Plage)
DateJour = Now
DOA = Range("e161").Value
Date48 = 48
If DateJour - DOA > Date48 Then
Range("z161").Value = 1
Else: Range("z161").Value = 0
End If
Sheets("Main courante").Select
If Intersection Is Nothing Then
' on ne fait rien c'est pas la bonne cellule
Else
'c'est Z161 on fait le traitement
If Range("Z161").Value<>0 and Range("Z161").Value<2 Then
Call SendMail_Outlook
End if
End If
Set Plage = Nothing ' on reset l'objet
Set Intersection = Nothing ' idem
end sub
j'ai mis des commentaires ... il faut lire
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Intersection As Range, Plage As Range
Set Plage = Range("Z161") ' on ne contrôle qu'une cellule
Set Intersection = Application.Intersect(Target, Plage)
DateJour = Now
DOA = Range("e161").Value
Date48 = 48
If DateJour - DOA > Date48 Then
Range("z161").Value = 1
Else: Range("z161").Value = 0
End If
Sheets("Main courante").Select
If Intersection Is Nothing Then
' on ne fait rien c'est pas la bonne cellule
Else
'c'est Z161 on fait le traitement
If Range("Z161").Value<>0 and Range("Z161").Value<2 Then
Call SendMail_Outlook
End if
End If
Set Plage = Nothing ' on reset l'objet
Set Intersection = Nothing ' idem
end sub
Ah j'ai compris, par contre à mon aivs, il y a une fonction qui s'appel récurisivemen, message d'erreur : espace pile insufisant
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
2 juil. 2009 à 11:09
2 juil. 2009 à 11:09
l'erreur doit venir de là!
Call SendMail_Outlook
Call signifie appelle de procedure pour execution.
SendMail_outlook est ta procedure.
comme outlook est une application
tu dois la retrouver dans un module .
il y aura une ligne un peu comme ça set monapp=application.... outlook
A la fin de la procedure
vérifie qu'il y a bien set monapp = nothing.
Cette erreur est commise par 95% des gens qui gens qui font un boulot mais ne range pas le matériel.
Vérifie aussi qu'il y a bien libération de l'application avec monapp.quit
Bien sur tu as compris que monapp est une variable objet elle s'appelle peut-être autrement ^^..
A+
Call SendMail_Outlook
Call signifie appelle de procedure pour execution.
SendMail_outlook est ta procedure.
comme outlook est une application
tu dois la retrouver dans un module .
il y aura une ligne un peu comme ça set monapp=application.... outlook
A la fin de la procedure
vérifie qu'il y a bien set monapp = nothing.
Cette erreur est commise par 95% des gens qui gens qui font un boulot mais ne range pas le matériel.
Vérifie aussi qu'il y a bien libération de l'application avec monapp.quit
Bien sur tu as compris que monapp est une variable objet elle s'appelle peut-être autrement ^^..
A+
Module
Instruction
Même message d'erreur ! Je crois que je vais tout recommencer, et faire quelque chose de plus simple nan?
Sub SendMail_Outlook() Dim ol As New Outlook.Application Dim olmail As MailItem Dim CurrFile As String Set ol = New Outlook.Application Set olmail = ol.CreateItem(olMailItem) With olmail .To = "" .Subject = "Test" .Body = "" .display End With End Sub
Instruction
'c'est Z161 on fait le traitement If Range("Z161").Value <> 0 And Range("Z161").Value < 2 Then Call SendMail_Outlook End If End If Set Plage = Nothing ' on reset l'objet Set Intersection = Nothing ' idem Set ol = Nothing End Sub
Même message d'erreur ! Je crois que je vais tout recommencer, et faire quelque chose de plus simple nan?
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
2 juil. 2009 à 12:38
2 juil. 2009 à 12:38
Qu'est-ce que je disais....
Sub SendMail_Outlook()
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
With olmail
.To = ""
.Subject = "Test"
.Body = ""
.display
End With
ol.quit
Set olmail=nothing
End Sub
Sub SendMail_Outlook()
Dim ol As New Outlook.Application
Dim olmail As MailItem
Dim CurrFile As String
Set ol = New Outlook.Application
Set olmail = ol.CreateItem(olMailItem)
With olmail
.To = ""
.Subject = "Test"
.Body = ""
.display
End With
ol.quit
Set olmail=nothing
End Sub
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
2 juil. 2009 à 13:43
2 juil. 2009 à 13:43
Le problème est difficile car moi je n'ai d'erreur.
Je ne vois pas.
je le fais sous 2007. avec la bibliothèque microsoft outlook 12.0
je ne vois pas.
je ne peux pas t'aider plus.
Je ne vois pas.
je le fais sous 2007. avec la bibliothèque microsoft outlook 12.0
je ne vois pas.
je ne peux pas t'aider plus.
bonjour,
Comment faire un call d'une macro dont l'indicateur est : Worksheet_Change(ByVal Target As Range)
Call Worksheet_Change ne fonctionne pas !
merci!
Comment faire un call d'une macro dont l'indicateur est : Worksheet_Change(ByVal Target As Range)
Call Worksheet_Change ne fonctionne pas !
merci!
Bidouilleu_R
Messages postés
1181
Date d'inscription
mardi 27 mai 2008
Statut
Membre
Dernière intervention
12 juillet 2012
295
3 juil. 2009 à 13:27
3 juil. 2009 à 13:27
bonjour recopie ta macro dans un module
sub test()
' adapte le code de ta macro
end sub
tu pourras alors appler ta macro avec call.
Attention aux objets et variables déjà existante...
A+
sub test()
' adapte le code de ta macro
end sub
tu pourras alors appler ta macro avec call.
Attention aux objets et variables déjà existante...
A+