Afficher le N° du devis sur une feuille
J'essaye d'afficher le N° du devis dans une TextBoxDevisEnCours (ici remplie à la main "2025/07/20_a" pour plus de clarté de ma demande) sur la feuille Honda depuis la sélection faite sur le formulaire TousLesDevis et en cliquant sur le bouton Compléter ce devis
Je pense que je ne m'y prends pas bien car je vois bien le nom de la TextBoxDevisEnCours dans sa propriété, mais impossible d'y faire "coller" le N° du devis.
Il n'est pas impossible que je n'ai pas fais le bon choix quant à la méthode pour faire apparaître le N° sur cette feuille.
Le bouton compléter ce devis, doit :
- si un devis est sélectionné dans la ListBoxTousLesDevis,
- afficher le N° du devis dans la TextBoxDevisEnCours dans l'onglet Honda.
Si le Client est sélectionné le bouton Nouveau devis, doit :
- si le Client est sélectionné, récupère le Nom et le prénom pour les afficher dans la fiche client afin d'y sélectionner son adresse et, éventuellement, sa moto.
Comme vous pouvez le voir, je ne dois pas être loin du bon code, mais là, je sèche.
If ComboBoxNomPrenom <> "" Then ' // si le Client est sélectionné
FicheClient.TextBoxNom = Left(Me.ComboBoxNomPrenom) ' récupère le Nom
FicheClient.TextBoxPrenom = Right(Me.ComboBoxNomPrenom) ' récupère le prénom
FicheClient.ShowLe but est de pouvoir ajouter un article au devis en cliquant sur le bouton "ajouter à ce devis"
Merci de votre aide.
Pour ce qui concerne la deuxième partie :
Les fonctions Left et Right demandent 2 arguments, le nom du string et la longueur à récupérer. Sinon, il y a une erreur. A vue de nez, je chercherais la position du premier espace en partant de la gauche via Instr si c'est écrit au format "Prénom Nom", ou de la droite dans le cas d'un format "Nom Prénom" puis les fonctions Left (me.comboboxNomPrenom, position trouvée) et Right dans l'autre cas.
Quelque chose du genre :
Désolé pour le copier brutal.Bonsoir à tous,
- si un devis est sélectionné dans la ListBoxTousLesDevis, afficher le N° du devis dans la TextBoxDevisEnCours dans l'onglet Honda.
Voir le classeur joint.
bonjour le fil,
pour le nom-prénom
Sub Nom_Prenom()
For Each c In Range("tableauClients[NomPrenom]").Cells
s = c.Value 'nom prenom
i = InStrRev(s, " ") 'position dernier espace
If i = 0 Then
MsgBox "aucun espace"
Else
MsgBox s & vbLf & vbLf & Left(s, i - 1) & vbLf & Mid(s, i + 1)
End If
Next
End Subet pour l'autre question (mais attention la macro "terminate" efface cela plus tard)
Private Sub CB_CompleterDevis_Click()
'**************************
' sélectionne ce devis mis en surbrillance et l'ajoute dans la TextBoxDevisEnCours de l'onglet Honda
'**************************
' // si un devis est sélectionné dans la ListBoxTousLesDevis,
' // affiche le nom du devis sélectionné dans la TextBoxDevisEnCours (onglet Honda, au dessus du Tableau1 )
If Me.ListBoxTousLesDevis.ListIndex = -1 Then
MsgBox "Aucun devis sélectionné !", vbCritical
Sheets("Honda").TextBoxDevisEnCours = ""
Else
With Me.ListBoxTousLesDevis
Sheets("honda").TextBoxDevisEnCours = .List(.ListIndex, 3) 'le numero du devis
MsgBox "on a écrit " & Sheets("honda").TextBoxDevisEnCours.Text, vbInformation, "TextBoxDevisEnCours"
End With
End If
End SubBonjour à tous,
On avance un peu.
Problème dans les 2 solutions : le N° du devis dans l'onglet Honda s'efface lorsque je ferme le formulaire TousLesDevis.
Demandes résolues : les noms et prénoms sont correctement séparés avec le code proposé par Bart.
Dans la solution de Bart (BsAlv), c'est bien la liste des noms et prénoms présents dans le TableauClients qui s'inventorie dans la MsgBox, et c'est mieux ainsi, mais pour les NOUVEAUX devis.
Pour le bouton "Compléter ce devis" il faudrait qu'il prenne en compte le devis sélectionné dans la ListBoxTousLesDevis.
Je ne suis pas sûr d'avoir bien positionné la fonction Nom_Prenom
J'ai du définir les variables dans la fonction Nom_Prenom (c'est bien une fonction là, non ?), un peu au pif, sinon ça bloquait.
J'espère que c'est correct puisque ça semble fonctionner correctement.
Dim c As Object, s As String, i As String ' // définition des variables papicx 25/08/2025Merci de votre aide.
Voici le code présent dans le formulaire TousLesDevis
Sub CB_NouveauDevis_Click()
'**************************
' crée un nouveau N° de devis que si le Client existe dans le TableauClients
'**************************
Dim VSpace As Integer
' VSpace = InStr(1, Me.ComboBoxNomPrenom, " ") ' cas de plusieurs espaces non traité
If ComboBoxNomPrenom <> "" Then ' // si le Client est sélectionné
Nom_Prenom
' FicheClient.TextBoxNom = Left(Me.ComboBoxNomPrenom, VSpace - 1) ' récupère le Nom
' FicheClient.TextBoxPrenom = Right(Me.ComboBoxNomPrenom, Len(Me.ComboBoxNomPrenom) - VSpace) ' récupère le prénom
' FicheClient.TextBoxPrenom = Application.Proper(FicheClient.TextBoxPrenom)
FicheClient.Show
End If
If ComboBoxNomPrenom = "" Then ' // si le choix du Client n'est pas fait
If MsgBox("Vous ne pouvez créer un nouveau numéro de devis que si le client existe." & vbCrLf & "Veuillez sélectionner un Client" & vbCrLf _
& vbCrLf & "Voulez-vous créer un nouveau client ?", vbYesNo + vbQuestion + vbDefaultButton1, "NOUVEAU DEVIS") = vbYes Then
' // si OUI, ouvre le formulaire FicheClient
Nom_Prenom
FicheClient.Show
' Feuil1.CB_NouveauClient_Click
Else
Exit Sub
' // si NON, ferme la boite de dialogue
End If
End If
End Sub
Sub Nom_Prenom()
Dim c As Object, s As String, i As String ' // définition des variables papicx 25/08/2025
For Each c In Range("tableauClients[NomPrenom]").Cells
s = c.Value 'nom prenom
i = InStrRev(s, " ") 'position dernier espace
If i = 0 Then
MsgBox "aucune espace trouvée", vbCritical
Else
MsgBox s & vbLf & vbLf & Left(s, i - 1) & vbLf & Mid(s, i + 1) '// les noms et prénoms sont correctement séparés. papicx 25/08/2025
End If
Next
End Sub
Bonjour,
Tu peux avoir que A-z devis par jour ?
Comment vois tu l'implantation des devis A-Z AA-ZZ?
Pour moi il suffit d'avoir une table d'icrementation
Re,
Problème dans les 2 solutions : le N° du devis dans l'onglet Honda s'efface lorsque je ferme le formulaire TousLesDevis.
Pour ma part, c'est fait exprès. Si vous ne désirez pas vider le devis en cours, alors supprimez la procédure :
Private Sub UserForm_Terminate()
Sheets("Honda").TextBoxDevisEnCours = ""
End Subnota : Pourquoi avoir utilisé une Textbox TextBoxDevisEnCours sur la feuille "Honda" plutôt qu'une cellule de la feuille (ou bien une seule cellule résultat de plusieurs cellules fusionnées)? Restons simples et utilisons les ressources de base des feuilles de calcul d'Excel.
C'est toujours délicat de traiter tous les cas de nom/prénom en français. Exemple : La Fontaine -> le test prendra légitiment comme nom "La" et comme prénom "Fontaine" et ne détectera aucune anomalie (prénom manquant). On n'y peut rien, notre langue est compliquée
Bonjour dysorthographie,
Pour une même date, les N° des devis seront incrémentés par un suffixe "_[lettre]" , mais on en n'est pas encore là.
Ce sera l'objet d'une nouvelle demande.
Là, le tableau a été rempli à la main pour avancer dans le projet, donc avec des erreurs de chronologie. (je n'ai pas vérifié).
@mafraise
Pour ma part, c'est fait exprès. Si vous ne désirez pas vider le devis en cours, alors supprimez la procédure :
Merci, je n'avais pas compris la phrase de Bart à ce sujet ! (je pensais qu'il voulait dire " ultérieurement", dans les jours à venir...)
J'ai mis en commentaire pour désactiver l'effacement, et ça fonctionne. Merci bien.
Pourquoi avoir utilisé une Textbox TextBoxDevisEnCours sur la feuille "Honda" plutôt qu'une cellule de la feuille (ou bien une seule cellule résultat de plusieurs cellules fusionnées)? Restons simples et utilisons les ressources de base des feuilles de calcul d'Excel.
Tout simplement, si j'ose dire, parce que les largeurs des colonnes ne sont pas toutes de la bonne longueurs.
C'est toujours délicat de traiter tous les cas de nom/prénom en français. Exemple : La Fontaine -> le test prendra légitiment comme nom "La" et comme prénom "Fontaine" et ne détectera aucune anomalie (prénom manquant). On n'y peut rien, notre langue est compliquée.
oui, c'est vrai que notre langue est compliquée.
Cependant, Bart a réussi à faire un code qui fait bien le job.
Fait le test avec mon fichier, tu verras.
re,
si le prénom contient des miniscules et le nom que des majuscules, alors on a une autre méthode pour les distinguer ....
Bonjour Bart,
Je te remercie de cette avancée significative.
J'ai fais des tests des fonctions proposées avec des noms et prénoms improbables dans leur contenus.
Il en ressort que c'est la fonction Nom_Prenom_SensiblesCasse qui sort gagnante !
Je te montre LE cas qui a posé problème avec la fonction Nom_Prenom_Split , mais je pense que tu t'en doutait vu que tu m'as proposé les deux.
Tandis qu'avec la fonction Nom_Prenom_SensiblesCasse ça sépare bien mieux les noms et prénoms.
Pour les Nouveaux Devis : L'approche pour faire avancer ce projet était déjà une avancée importante.
With FicheClient
.TextBoxNom = temp(0)
.TextBoxPrenom = temp(1)
r = Application.IfError(Application.Match(sNomPrenom, Range("TableauClients[NomPrenom]"), 0), 0) 'le premier match de ce client
If r = 0 Then
MsgBox "Client inconnu": Exit Sub
ElseL'idéal serait de pouvoir sélectionner directement la bonne adresse et le bon véhicule.
À cet effet, j'avais prévu qu'à la création du devis, et pour l'édition "papier" (ou pdf), que la ligne du TableauClients soit enregistrée dans le TableauDevis, colonne NoLigneClient (G).
Le numéro du devis, si c'est possible, serait la date suivi d'un suffixe du type "_(lettre minuscule)" à moins que tu ais une autre idée...
NB : j'ai intégré les modifications mentionnées dans ton message du 25/08/2025 à 10h04.
Merci de ton aide.
Si les champs Nom et Prénoms sont séparés à la saisie, vous pouvez vous débarrasser de l'espace pour insérer un caractère facile à tester, exemple en concaténant les valeurs, quelque chose du style (ici je prends "/" comme exemple):
Me.ComboBoxNomPrenom = Me.Nom.Value & "/" & Me.Prénom.Value Là vous n'aurez plus de problèmes avec un nom du style SOUPALOGNON Y CROUTON/Gonzague Charles-Pierre Gäetan.
On peux s'assurer que l'on accepte que des caractères via un un sub correspondant au TextBox désiré. Un sub <NomTextBox>_Change s'active lors d'un changement de focus (sortie du TextBox par click ou Esc)
Private Sub Nom_Change() '<- Mettre le <NomTextbox> ici
If CStr(Me.Nom) = False Then ' <- Pour n'accepter que des caractères en cas de fausse manip
Me.Nom = ""
End If
End SubL'apparence de la feuille changera un peu mais c'est tout.
re, salut Swedish Chef
l'idée du @Swedish Chef n'est pas si bête ! Si on met par exemple une virgule+espace ou un point-virgule+espace entre le nom et le prénom, cela est pratique et pas gênant.
Le numéro de ligne pour le client dans le tableau "tableauClients" n'est pas une bonne idée, je suis sûr que, plus tard, tu ajouteras/supprimeras des lignes ou tu tries ce tableau. Donc si la colonne "Ligne" contient une formule, comme maintenant, cela causera des problèmes. C'est pourquoi, il faut choisir une référence unique pour chaque combinaison "client-adresse-moto".
Bonjour Swedish Chef
SOUPALOGNON Y CROUTON/Gonzague Charles-Pierre Gäetan
Ah vous aussi vous le connaissez?
Bon, je sors...
Bonsoir à tous.
Le formulaire qui crée les fiches client formate les noms et prénoms, via 2 textbox, et le code de Bart pour les séparer fonctionne impeccablement. De ce coté là, c'est résolu.
Bart a raison quant au mauvais choix que j'avais fait de prendre les numéros de ligne pour faire la jonction entre les 2 tableaux.
Son idée d'un index Client-Adresse-Moto générée automatiquement lors de la fiche client est une très bonne option.
Pour les nouveaux intervenants dans ce sujet, je rappelle que le tableau client actuel a été rempli à la main.
La colonne G contiendra cette fameuse clé à l'avenir.
On pourrait l'appeler clef-CAM par exemple.
Une nouvelle colonne au TableauClients sera donc nécessaire.
Edit 22h07.
Je viens de faire le test du nom de SOUPALOGNON Y CROUTON/Gonzague Charles-Pierre Gäetan et le code de Bart, sans rien y changer, fonctionne impeccablement.
J'ai seulement agrandi les TextBox des Nom et Prenom.
CQFD
création de la fiche client
création de son devis
création du nouveau devis : les noms et prénoms sont correctement séparés.
Les clef-CAM là, du TableauClients ont été écrite à la main, juste une incrémentation pour ne pas devoir tout réécrire, juste pour voir si ça fonctionne.
Quand la clef-CAM sera générée automatiquement, dans un futur proche, on pourra utiliser celle-ci pour soit éditer les devis, soit en faire des nouveaux avec les coordonnées des clients, surtout s'ils ont plusieurs adresses postales et/ou motos.
Merci de votre aide.
quelques corrections mineures.
re,
un essai, on lance la demande d'un nouveau devis à partir de l'userform "Tous les devis" et en supposant que le listbox1 de clients n'est pas utilisé
Bonjour et merci pour le travail accompli.
sur le formulaire FicheClient
• J'ai mis un MaxLengh à 10 sur le champs immatriculation
• J'ai ajouté un bouton "ajouter une moto", destiné à ajouter une moto depuis une adresse existante. Le bouton s'efface lors du click pour ne laisser apparaitre que le bouton "VALIDER" (ex bouton ajouterClient ) Je n'ai pas touché au code de celui-ci.
• Je n'ai pas trouvé à quoi servait le TextBox1 .
sur le formulaire TousLesDevis
• Sur l'action du bouton nouveau devis, j'ai adapté le message en fonction du nombre de clef_CAM trouvées.
• repris les valeurs des colonnes définies dans les propriétés de la ListBox1
' liste, adresse, CP, ville, Moto, Couleur,Immatriculation, Clef_CAM
' .ColumnWidths = "25;100;100;100;100;100;100;100;50" 'avec ces largeurs total : 775
.ColumnWidths = "20;150;150;49,95;135;80;80;75;30" 'avec ces largeurs total : 769,95 pour reprendre les valeurs définies dans les propriétés de la ListBox1
ce qui donne
Je ne sais pas s'il est possible de mettre une image dans la msgbox...
enfin, ça je devrais devoir trouver l'astuce sur ce forum. Laisse moi chercher un peu, stp.
Merci de ton aide.
Bonjour,
Je viens de constaté que j'ai fais une erreur dans le formulaire TousLesDevis en modifiant le titre "Ligne" par "Clef".
il faudra remettre "Ligne" dans le Caption du Titre1 comme ci-dessous.
J'ai ajouté le symbole € dans le total
MonTotal = Format(MonTotal, "# ##0.00 €") ' formatage du total du devis papicx 24/08/2025 ajout du € le 28/08/2025Bonsoir,
J'ai essayé d'avancer sur le formulaire AjouterAuDevis. Je te communique mon ébauche, si ça peut t'aider...
Je suis bien conscient qu'il manque la variable du numéro de devis sélectionné, entre autre, pour que ça fonctionne.
Private Sub UserForm_Initialize()
Dim LOT1, LOTD
Set LOT1 = Range("Tableau1").ListObject 'le tableau structuré Tableau1 des pièces Honda
Set LOTD = Range("TableauDevis").ListObject 'le tableau structuré des devis
' // PROJET copie tous les champs dans le formulaire AjouterAuDevis papicx 28/08/2025
' // récupère les valeurs du TableauDevis
' With LOTD.ListRows.Range '
' TextBoxNomPrenom = LOTD.Range("NomPrenom")
' TextBoxNoDevis = LOTD.Range("NoDevis")
' TextBoxTitreDevis = LOTD.Range("TitreDevis")
' TextBoxQu = LOTD.Range("BoxQu") ' quantité prévue est présent à titre indicatif sur le formlaire
' End With
' // récupère les valeurs du Tableau1 (onglet Honda)
' With LOT1.ListRows.Range '
' TextBoxDesignation = LOT1.Range("designation")
' TextBoxRefOriginale = LOT1.Range("RefOriginale")
' TextBoxRefAlternative = LOT1.Range("RefAlternative")
' TextBoxNewRefHonda = LOT1.Range("NewRefHonda")
' TextBoxDPCTTC = LOT1.Range("DPCTTC")
' TextBoxRefAdaptable = LOT1.Range("RefAdaptable")
' TextBoxFournisseur = LOT1.Range("Fournisseur")
' TextBoxTTC€Adapable = LOT1.Range("TTC€Adapable")
' End With
End SubJe ne sais pas si ça va être utile, mais j'ai fait un tableau de correspondance comme on avait fait pour les autres formulaires.
C'est le Tableau20 qui est dans l'onglet Liste, à droite du Tableau19
Une autre capture qui pourrait être utile.
merci de votre aide
re,
un essai, c'était juste pour les 3 premiers TBs ?