Fonctionnement MsgBox VbYesNoCancel
Bonjour,
J'ai un problème qui doit être tout simple à résoudre, mais je ne trouve pas la solution. Je pense que c'est un problème d'ordre des procédures
Voici ce que je veux : Suite à la saisie de données sur un formulaire, je clique sur le bouton "enregistrer" pour envoyer les données saisies dans une base.
Le clic ouvre une MsgBox qui m'informe de l'enregistrement des données et me demande si je veux par la même occasion envoyer un mail au commercial.
C'est donc une MsgBox VbYesNoCancel que j'utilise :
- Yes : affichage du mail à envoyer, enregistrement des données, effacement du formulaire (prêt pour une nouvelle saisie)
- No : enregistrement des données, pas de mail, effacement des données (prêt pour une nouvelle saisie)
- Cancel : je souhaite que le MsgBox se ferme et que je me retrouve avec mon formulaire avec les données que je viens de saisir (les données ne sont pas encore enregistrées)
Pour le moment, les données sont enregistrées avant la demande d'envoi du mail. Et du coup, si j clique sur "Annuler", les données sont enregistrées et le formulaire se vide.
Voici le code en question
Private Sub BoutonEnregistrer_Click()
Dim n As Integer
Dim MonMessage As Object
Dim MaSignature As String
Dim EnvoyerMail
EnvoyerMail = MsgBox("Bateau enregistré avec succès!" & Chr(10) & "Voulez-vous envoyer un mail au commercial ?", vbYesNoCancel + vbExclamation + vbdefautltbutton1, "Bateau enregistré")
n = Me.ScrollBar1.Value
[t_bateaux].Item(n, 1) = "D"
[t_bateaux].Item(n, 2) = SaisieBateau.tb_Autorisation.Value
[t_bateaux].Item(n, 3) = UCase(SaisieBateau.tb_Bateau.Value)
[t_bateaux].Item(n, 4) = UCase(SaisieBateau.tb_NomDemandeur.Value) & " " & SaisieBateau.tb_PrenomDemandeur.Value
[t_bateaux].Item(n, 5) = SaisieBateau.tb_Immat.Value
[t_bateaux].Item(n, 6) = UCase(SaisieBateau.tb_AdresseBateau.Value)
[t_bateaux].Item(n, 7) = SaisieBateau.tb_Telephone.Value
[t_bateaux].Item(n, 8) = SaisieBateau.tb_Mail.Value
[t_bateaux].Item(n, 9) = SaisieBateau.tb_AdresseDemandeur.Value
[t_bateaux].Item(n, 10) = SaisieBateau.tb_CPDemandeur.Value
[t_bateaux].Item(n, 11) = SaisieBateau.tb_VilleDemandeur.Value
[t_bateaux].Item(n, 12) = SaisieBateau.tb_Contact.Value
[t_bateaux].Item(n, 13) = SaisieBateau.ComboBox_Typologie.Value
[t_bateaux].Item(n, 14) = SaisieBateau.ComboBox_Materiaux.Value
[t_bateaux].Item(n, 15) = SaisieBateau.tb_Longueur.Value
[t_bateaux].Item(n, 16) = SaisieBateau.tb_Largeur.Value
[t_bateaux].Item(n, 18) = SaisieBateau.ComboBox_Degazage.Value
[t_bateaux].Item(n, 19) = SaisieBateau.tb_Ident.Value
[t_bateaux].Item(n, 20) = SaisieBateau.ComboBox_Transport.Value
[t_bateaux].Item(n, 24) = SaisieBateau.ComboBox_Devis.Value
[t_bateaux].Item(n, 32) = SaisieBateau.tb_Commentaires.Value
If EnvoyerMail = vbYes Then
Set MaMessagerie = CreateObject("Outlook.Application") 'Création d'un objet Outloook
Set MonMessage = MaMessagerie.CreateItem(0)
MonMessage.Display
MaSignature = MonMessage.htmlbody
With MonMessage
.To = tb_Mail
.Subject = "Demande devis transport bateau" & " " & tb_Bateau & " - " & tb_Immat & " - " & tb_NomDemandeur & " " & tb_PrenomDemandeur
.htmlbody = "Bonjour, <br><br>" & _
"Merci de me transmettre un devis pour le transport du bateau cité en objet et dont les éléments sont en pièces jointes.<br><br>"
.Display 'afficher le mail avant de l'envoyer sinon placer send pour l'envoyer
End With
ElseIf EnvoyerMail = vbNo Then
Unload Me
ElseIf EnvoyerMail = vbCancel Then
Unload Me 'ici je voudrais que la MsgBox se ferme et que je retrouve le formulaire avec les données que je viens de saisir et qui ne sont pas encore enregistrées
End If
Unload Me
Sheets("LISTE").Range("V1").Value = ""
SaisieBateau.Show
End Sub
Merci d'avance pour votre aide
Bonjour
Un fichier est TOUJOURS le bienvenu
Private Sub BoutonEnregistrer_Click()
Dim n As Integer
Dim MonMessage As Object
Dim MaSignature As String
Dim EnvoyerMail
EnvoyerMail = MsgBox("Bateau enregistré avec succès!" & Chr(10) & "Voulez-vous envoyer un mail au commercial ?", vbYesNoCancel + vbExclamation + vbdefautltbutton1, "Bateau enregistré")
if EnvoyerMail=vbCancel then exit sub
n = Me.ScrollBar1.Value
[t_bateaux].Item(n, 1) = "D"
[t_bateaux].Item(n, 2) = SaisieBateau.tb_Autorisation.Value
[t_bateaux].Item(n, 3) = UCase(SaisieBateau.tb_Bateau.Value)
[t_bateaux].Item(n, 4) = UCase(SaisieBateau.tb_NomDemandeur.Value) & " " & SaisieBateau.tb_PrenomDemandeur.Value
[t_bateaux].Item(n, 5) = SaisieBateau.tb_Immat.Value
[t_bateaux].Item(n, 6) = UCase(SaisieBateau.tb_AdresseBateau.Value)
[t_bateaux].Item(n, 7) = SaisieBateau.tb_Telephone.Value
[t_bateaux].Item(n, 8) = SaisieBateau.tb_Mail.Value
[t_bateaux].Item(n, 9) = SaisieBateau.tb_AdresseDemandeur.Value
[t_bateaux].Item(n, 10) = SaisieBateau.tb_CPDemandeur.Value
[t_bateaux].Item(n, 11) = SaisieBateau.tb_VilleDemandeur.Value
[t_bateaux].Item(n, 12) = SaisieBateau.tb_Contact.Value
[t_bateaux].Item(n, 13) = SaisieBateau.ComboBox_Typologie.Value
[t_bateaux].Item(n, 14) = SaisieBateau.ComboBox_Materiaux.Value
[t_bateaux].Item(n, 15) = SaisieBateau.tb_Longueur.Value
[t_bateaux].Item(n, 16) = SaisieBateau.tb_Largeur.Value
[t_bateaux].Item(n, 18) = SaisieBateau.ComboBox_Degazage.Value
[t_bateaux].Item(n, 19) = SaisieBateau.tb_Ident.Value
[t_bateaux].Item(n, 20) = SaisieBateau.ComboBox_Transport.Value
[t_bateaux].Item(n, 24) = SaisieBateau.ComboBox_Devis.Value
[t_bateaux].Item(n, 32) = SaisieBateau.tb_Commentaires.Value
if EnvoyerMail = vbYes
Set MaMessagerie = CreateObject("Outlook.Application") 'Création d'un objet Outloook
Set MonMessage = MaMessagerie.CreateItem(0)
MonMessage.Display
MaSignature = MonMessage.htmlbody
With MonMessage
.To = tb_Mail
.Subject = "Demande devis transport bateau" & " " & tb_Bateau & " - " & tb_Immat & " - " & tb_NomDemandeur & " " & tb_PrenomDemandeur
.htmlbody = "Bonjour, <br><br>" & _
"Merci de me transmettre un devis pour le transport du bateau cité en objet et dont les éléments sont en pièces jointes.<br><br>"
.Display 'afficher le mail avant de l'envoyer sinon placer send pour l'envoyer
End With
endif
Unload Me
Sheets("LISTE").Range("V1").Value = ""
SaisieBateau.Show
End Sub
A+ François
Bonjour Fanfan38,
Désolé c'est un oubli de ma part. En pièce jointe le fichier en cours de conception.
C'est un peu foutraque donc, il y a des lignes de code qui servent sans doute à rien, des boutons inutiles...
Merci encore pour les réponses précédentes. Juste histoire d'abuser, est-ce qu'il vous serait possible de mettre quelques commentaires dans votre code, car j'ai un peu galéré pour comprendre, et je ne suis pas sûr d'avoir tout compris...
Merci encore
Bonjour
J'ai simplifié la macro
Si envoyermail=cancel on quitte la macro sinon on l'enregistre
si envoiemail=oui on envoie le mail
A+ François
Bonsoir Fanfan
Et merci encore pour la réponse rapide.
En revanche, en testant la saisie d'un nouveau bateau (ESSAI), je constate que ma saisie a écrasé une ligne déjà existante... Aucune idée de comment cela est possible.
Mais il est vrai que je m'étais rendu compte que certaines saisies se retrouvaient au milieu de ma base et je m'étais posé la question de savoir si des lignes existantes avaient été écrasées... J'en ai la confirmation.
Et après un second test, la nouvelle saisie (TEST800) s'enregistre bien en dernière ligne. Mais ça pose problème si ça arrive ne serait-ce qu'une fois sur 50...
Il y a également la date de 1er contact qui ne tient plus compte du masque de saisie. Est-ce que cela est dû au fait que je l'ai basculé dans un frame ?
Bonne soirée
Bonjour
Un nouveau merci pour votre solution.
J'ai toujours un problème avec, dans mon formulaire de saisie des bateaux, le masque de saisie de la date de 1er contact (en bas du cadre Bateau) qui ne fonctionne que lorsque je clique dans un autre textbox, mais pas en faisant tabulation, alors que celui de la date d'autorisation marche nickel :
Private Sub tb_Contact_Change()
tb_Contact.BackColor = &H80000005
End Sub
Private Sub tb_Contact_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
tb_Contact.BackColor = &H80000005
If InStr("0123456789", VBA.Chr(KeyAscii)) = 0 Then
KeyAscii = 0
tb_Contact.BackColor = &HFF&
End If
End Sub
Private Sub tb_Contact_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If Len(tb_Contact.Text) = 0 Then GoTo Fin
If Len(Replace(tb_Contact.Text, "/", "")) <> 6 And Len(Replace(tb_Contact.Text, "/", "")) <> 8 Then
GoTo ErreurSaisieBateau
End If
If Len(tb_Contact.Text) = 6 Then
If Right(tb_Contact, 2) > 50 Then
tb_Contact = Left(tb_Contact, 4) & 19 & Right(tb_Contact, 2)
Else
tb_Contact = Left(tb_Contact, 4) & 20 & Right(tb_Contact, 2)
End If
End If
tb_Contact.Text = Left(Replace(tb_Contact.Text, "/", ""), 2) & "/" & Mid(Replace(tb_Contact.Text, "/", ""), 3, 2) & "/" & Right(Replace(tb_Contact.Text, "/", ""), 4)
tb_Contact.MaxLength = 10
If Not IsDate(tb_Contact.Value) Then
GoTo ErreurSaisieBateau
End If
GoTo Fin
ErreurSaisieBateau:
Cancel = True
With tb_Contact
.BackColor = &HFF&
MsgBox "Date SaisieBateau incorrecte"
tb_Contact.Text = Replace(tb_Contact.Text, "/", "")
.SetFocus
.SelStart = 0
.SelLength = Len(tb_Contact.Text)
End With
Fin:
End Sub
Bonjour
J'ai modifié la saisie de tes dates avec un calendrier
A+ François
Bonsoir Fanfan
Il y a un problème avec le deuxième calendrier qui renvoie une date au format anglais. Et là, le module de classe vient de me faire avoir une quasi attaque... Kesako ??? J'en fais quoi ? Comment je rapatrie tout ça sur mon fichier ?
Justement, entre temps, j'ai avancé sur mon projet. A mon allure...
Dans mon userform SaisieBateau j'ai rajouté des checkbox. Je souhaite que les labels des cases cochées apparaissent dans la listbox lb_Equipements de mon userform FicheBateau. J'ai commencé par écrire un code qui renvoie les valeurs des labels dans mon onglet Suivi en bout de ligne. Mais je ne suis pas convaincu.
J'ai trouvé le code ci-dessous mais je ne sais pas où le placer et comment l'adapter.
Private Sub CommandButton2_Click()
Dim Ctrl As Control
Dim j As Integer
Dim Chk As MSForms.CheckBox
For Each Ctrl In UserForm4.Controls
If TypeOf Ctrl Is MSForms.CheckBox Then
Set Chk = Ctrl
If Chk.Value = True Then
TextBox_Intit.Value = TextBox_Intit.Value & Chk.Caption & " "
End If
End If
Next Ctrl
End Sub
A terme, les valeurs des labels des checkbox devront également se retrouver sur une feuille (Fiche traitement) que je formaterai en pdf
Bonjour
Tu ne peux utiliser les valeurs de saisie bateau pour fiche bateau sans passer par la feuille suivi.
Donc j'ai modifié ta macro pour que quand tu valides un nouveau bateau les cases cochées soient enregistrées sur la feuille suivi.
Ensuite je les reprends quand tu ouvres fiche bateau...
A+ François
Préféres tu garder les dates ou veux tu un calendrier?
Bonjour Fanfan,
Je préfère garder les dates à saisir avec une navigation par tabulation plutôt que de devoir prendre la souris en main...
Pour info, je suis en train de regrouper plusieurs userform sur un seul car je trouvais qu'il y avait beaucoup de manip et que certaines faisaient doublon...
Re bonjour
Je bloque sur un MsgBox qui me renvoie le message suivant : "Erreur de compilation : Erreur de syntaxe"
Ce message apparaît lorsque je clique sur le bouton "Relance commercial" dans l'userform "Consultation", onglet "Devis". Le but est de demander si on relance le commercial malgré une réponse déjà reçu de sa part.
Par rapport à d'autres MsgBox qui fonctionnent, je ne vois pas mon erreur...
Private Sub BoutonRelanceCommercial_Click()
Dim i As Long
i = Sheets("LISTE").Range("V1").Value
If t_bateaux.Item(i, 26) > 0 Then MsgBox ("Le commercial a déjà répondu." & Chr(10) & "Voulez-vous tout de même le relancer ?", vbYesNo, "Relancer le commercial") <> vbYes then exit sub
'renvoie le message d'erreur : "Erreur de compilation : Erreur de syntaxe"
Dim RelanceDevis As Object
Set RelanceDevis = CreateObject("Outlook.Application") 'Création d'un objet Outloook
Set RelanceDevis = RelanceDevis.CreateItem(0)
RelanceDevis.Display
With RelanceDevis
.To = tb_Mail
.Subject = "RELANCE : Demande devis transport bateau" & " " & tb_Bateau & " - " & Consultation.tb_Immat & " - " & tb_NomDemandeur
.htmlbody = "Bonjour," & "<br><br>" & _
"Un mail vous a été envoyé le " & tb_DateMailCommercial & ". " & "À ce jour, nous n'avons pas reçu de réponse de votre part." & "<br>" & _
"Merci de me transmettre un devis pour le transport du bateau cité en objet et dont les éléments sont en pièces jointes" & "<br><br>" & _
"Nom du demandeur : " & tb_NomDemandeur & "<br>" & _
"Téléphone du demandeur : " & Consultation.tb_Telephone & "<br>" & _
"Mail du demandeur : " & tb_Mail & "<br>" & _
"Nom du bateau : " & tb_Bateau & "<br>" & _
"Type du bateau : " & Consultation.tb_typologie & "<br>" & _
"Matériaux du bateau : " & Consultation.tb_Materiaux & "<br>" & _
"Longueur du bateau : " & Consultation.tb_Longueur & "<br>" & _
"Largeur du bateau : " & Consultation.tb_Largeur & "<br>" & _
"Localisation du bateau : " & Consultation.tb_AdresseBateau & "<br>" & _
.Display 'afficher le mail avant de l'envoyer sinon placer send pour l'envoyer
End With
End Sub
ATTENTION! le nom de ton tableau est t_Bateaux (et non t_bateaux)
Tu as mis si msgbox=vbyes then exit sub (j'ai modifié)...
A+ François
Ah bah oui, forcément, ça va marcher moins bien si j'écris mal les noms...
Bon allez, un dernier problème pour aujourd'hui.
Lorsque je clique sur le bouton "Envoyer devis au demandeur", ça ouvre le devis au format pdf grâce à la commande display. Comment faire pour afficher une fenêtre qui me demande d'abord d'enregistrer le pdf (c'est à l'utilisateur de sélectionner le dossier où l'enregistrer) puis, une fois enregistré, ouverture automatique d'Outlook avec un mail déjà rédigé et contenant le pdf qu'on vient d'enregistrer ?
Bon week-end, c'est pas dit que je ne revienne pas sur le fichier durant celui-ci
En tout cas, merci beaucoup pour ton aide précieuse
Tant que tu n'as pas appuyer sur le bouton CommandButton1 tu ne peux envoyer le devis
J'ai trouvé ça: (a mettre en fin de maco CommandButton1)
Sub choixRepEtFichier()
Dim repertoire As String, nomFichier As String, extension As String
repertoire = "c:\"
nomFichier = "fichierTest"
extension = ".xls"
Application.Dialogs(xlDialogSaveAs).Show repertoire & nomFichier & extension
End Sub
A+ François
Bonjour Fanfan,
Le code à saisir c'est celui dans le message ou celui dans le Module 2 ?
Celui du message me fait enregistrer le fichier complet.
Celui du module 2 enregistre le pdf avec un nom par défaut alors qu'il faut adapter le nom à chaque bateau et changer l'emplacement.
Pas sûr que je me sois bien exprimé sur ce que j'essaye de faire :
- je clique sur "Envoyer devis au demandeur"
- ça convertit la feuille "Devis_transport" en pdf et ça l'ouvre, ce qui me permet de contrôler les infos avant envoi
- la fenêtre d'enregistrement s'ouvre également avec le nom de fichier "Devis transport bateau #nom du bateau# - #nom du demandeur#"
- lorsque je clique sur "Enregistrer", fermeture du fichier pdf et ouverture d'outlook avec le fameux fichier pdf en pièce jointe du mail à envoyer au demandeur (mail déjà rédigé)
Ci-dessous un morceau de code qui me permet d'ouvrir la fenêtre d'enregistrement à l'emplacement voulu. Il ne me reste qu'à adapter le titre au nom du bateau (à moins que ce soit possible automatiquement ?). Le problème est qu'en même temps ce fichier pdf s'est déjà enregistrer sous le nom LaDate au format yyymmdd.
'conversion pdf du listing et affichage
Dim LaDate As String, LeParcours As String, LeRep As String
LaDate = Format(Date, "yyyymmdd") 'c'est le nom du fichier
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
LeRep & LaDate & "_" & LeParcours & ".pdf", Quality:= _
xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, _
From:=1, To:=1, OpenAfterPublish:=True
Sheets("Devis_transport").Visible = False
Dim Chemin_Fichier As String
'Chemin et nom que l'on veut donner au fichier
Chemin_Fichier = "C:\Users\b.lastennet\Documents\AO APER\Suivis\Test\Devis transport bateau.pdf"
'au cas où l'usager annule au lien d'enregistrer
On Error Resume Next
Application.GetSaveAsFilename(InitialFileName:=Chemin_Fichier, _
fileFilter:="PDF (*.pdf), *.txt", FilterIndex:=1, _
Title:="Enregistrer sous", Buttontext:="Enregistrer") = "Devis transport bateau"
Sheets("Devis_transport").Visible = False
Bon week-end
Avec le fichier...
Bonjour
Là on est plus au fonctionnement msgbox vbyes....
A+ François
Bonjour Fanfan,
Je confirme qu'on n'est plus trop dans le sujet d'origine, mais je pensais qu'il valait mieux continuer sur le même fil.
Je vais poser ma question dans un autre post.
Merci encore pour ton aide
Tu ne m'as pas dit si ton envoie de mail est correct
A+ François