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

3fichier-suivi.xlsm (178.67 Ko)

Bonjour

J'ai simplifié la macro

Si envoyermail=cancel on quitte la macro sinon on l'enregistre

si envoiemail=oui on envoie le mail

9fichier-suivi.xlsm (150.70 Ko)

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

Je crois avoir trouvé la cause.

A+ François

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 :

  1. je clique sur "Envoyer devis au demandeur"
  2. ça convertit la feuille "Devis_transport" en pdf et ça l'ouvre, ce qui me permet de contrôler les infos avant envoi
  3. la fenêtre d'enregistrement s'ouvre également avec le nom de fichier "Devis transport bateau #nom du bateau# - #nom du demandeur#"
  4. 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

Rechercher des sujets similaires à "fonctionnement msgbox vbyesnocancel"