Bonjour 974RE, Yeahou, le fil,
tu as écrit : « Je crois que Soan à raison, aujourd'hui je coupe: plage, déjeuner les pieds dans l'eau, sieste et......je reprends! »
quoi ? t'as déjà fini d'faire trempette ?ben t'as pas nagé bien longtemps, dis donc ! tu pourras jamais rattraper Laure Manaudou si tu t'entraînes aussi peu ! bon, t'as d'la chance, regarde, elle t'attend :
Regarde la pièce jointe 1100325
tu as aussi écrit : « Je vais de ce pas décortiquer tes codes. » ; ben ça non plus ça t'a pas pris bien longtemps ! moi qui croyais qu'on t'reverrai plus avant un mois ou deux !bon, c'est vrai qu'mes codes sont très faciles à comprendre, et en plus c'est comme les crêpes : c'est bien plus...
Ok, bien reçu, c'est vrai que j'étais fixé sur le problème de l'USF Estimatif_Coût . Sur ce plan, tout fonctionne comme je le voulais, ce qui donne de la fluidité dans la manipulation de l'USF Devis. Tout est là il suffit de suivre la marche.@974RE
regarde d'abord le nouveau fichier de mon post #73 (qui comporte déjà plusieurs améliorations) ; pour l'USF Devis, tout est fait jusque avant les 3 cases vertes (sans avoir cliqué sur le bouton Estimatif, ou au retour du UF Estimatif) ; pour la suite, donne-moi un exemple de ce que tu saisis dans les 3 cases vertes ; c'est juste du texte, n'est-ce pas ? ou autre chose ? ça aidera beaucoup si tu peux me donner un exemple chiffré complet (dont les infos à saisir dans Estimatif), avec un exemple du Devis final (sans infos confidentielles, bien sûr !).
la suite sera que je vais complètement revoir le code VBA de tes 2 boutons Ajouter et Archiver Devis, tout en continuant de suivre les infos de ton post #55 (c'est un long post, et j'ai pas encore tout lu et appliqué tes consignes !) ; quand ça sera fait, je crois bien que ça devrait faire en même temps les nouvelles demandes de ton post #74 (j'ai déjà téléchargé le fichier joint de ton post #74, mais j'le verrai bien plus tard, car chaque chose en son temps !).
là, j'dois vraiment arrêter mon PC pour aller dormir !j'reprendrai quand j'serai bien reposé, et aussi après un bon repas. j'pense que le fichier suivant sera prêt tard cette nuit, ou demain !
soan
Option Explicit
Private Sub ComboBox1_Change() 'Recherche : item modifié => MAJ des champs
Dim lig&: lig = ComboBox1.ListIndex
If lig = -1 Then
'si on a appuyé sur Échap, on efface les champs
ComboBox2 = "": NOM = "": ADRESSE = "": ComboBox3.ListIndex = -1: CP = ""
TextBox2 = "": PriseEnCharge = "": Trajet = "": FinCourse = "": Exit Sub
End If
With Worksheets("Client").Cells(lig + 2, 2)
'on remplit les champs avec les cellules de la feuille "Client"
ComboBox2 = .Value 'Civilité
NOM = .Offset(, 1) 'NOM
ADRESSE = .Offset(, 2) 'ADRESSE
ComboBox3 = .Offset(, 4) 'VILLE
TextBox2 = .Offset(, 7) 'Date Évènement
End With
End Sub
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 27 Then Unload Me 'Échap sur le champ Recherche
End Sub
Private Sub ComboBox3_Change() 'VILLE modifiée => mise à jour du Code Postal
If ComboBox3.ListIndex <> -1 Then CP = Format(ComboBox3.Column(1), "00 000")
End Sub
Private Sub CP_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'CP
If CP <> "" Then CP = Format(CP, "00 000") 'on formate le Code Postal
End Sub
Private Sub TextBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'Date Évènement
Calendar.Affiche Me, Me.TextBox1.Name, ActiveControl.Name: Cancel = True
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Date Évènement
TextBox2 = Format(TextBox2, "dddd d mmmm yyyy ") 'on formate la Date Évènement
End Sub
Private Sub Valider1_Click() '1er bouton Valider
Application.ScreenUpdating = 0
With [Devis!B2]
If Jour <> "" Then .Offset(, 1) = Jour 'DATE (du jour)
If TextBox1 <> "" Then .Offset(2) = TextBox1 'N° Devis
If ComboBox2 <> "" Or NOM <> "" _
Then .Offset(4, 1) = ComboBox2 & " " & NOM 'Civilité & NOM
If ADRESSE <> "" Then .Offset(5, 1) = ADRESSE 'ADRESSE
If CP <> "" Or ComboBox3 <> "" _
Then .Offset(6, 1) = CP & " " & ComboBox3 'CP & VILLE
If TextBox2 <> "" Then .Offset(9) = TextBox2 'Date Évènement
End With
Application.ScreenUpdating = -1
End Sub
Private Sub Valider2_Click() '2ème bouton Valider
Application.ScreenUpdating = 0
With [Devis!A14]
If PriseEnCharge <> "" Then .Value = PriseEnCharge 'Prise en Charge
If Trajet <> "" Then .Offset(2) = Trajet 'Trajet
If FinCourse <> "" Then .Offset(4) = FinCourse 'Fin de Course
End With
Application.ScreenUpdating = -1
End Sub
Private Sub Estimatif_Click() 'bouton rouge Estimatif
Estimatif_Coût.Show 'affiche le UserForm Estimatif
End Sub
Sub MAJ_HT(Q$, s$) 'Mise à jour du Montant HT
Dim k As Byte: s = Replace$(s, Chr$(160), ""): k = Len(s)
If Right$(s, 2) = " €" Then k = k - 2: s = Left$(s, k)
If Q = "" Or k = 0 Then lblHT.Caption = "": Exit Sub
lblHT.Caption = IIf(Val(Q) = 0 Or Val(s) = 0, _
0, Format(Q * Val(s), "#,##0 €"))
End Sub
Private Sub Désignation_Change() 'Désignation : item modifié => MAJ PU & HT
Dim k%: k = Désignation.ListIndex
lblPU = Format(Round(Val(Replace$([Prestation!B13].Offset(k), _
",", ".")), 0), "#,##0 €"): MAJ_HT Qté, lblPU.Caption
End Sub
Private Sub Qté_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Qté
MAJ_HT Qté, lblPU.Caption
End Sub
Private Sub Ajouter_Click()
Application.ScreenUpdating = 0
With Worksheets("Devis")
With .ListObjects("ListDevis").ListRows.Add()
If Désignation.ListIndex > -1 Then .Range(1, 1) = Désignation.Value
If IsNumeric(Qté.Text) Then .Range(1, 2) = CDbl(Qté.Text)
If IsNumeric(lblPU.Caption) Then .Range(1, 3) = CDbl(lblPU.Caption)
If IsNumeric(lblHT.Caption) Then .Range(1, 4) = CDbl(lblHT.Caption)
End With
End With
Application.ScreenUpdating = -1
End Sub
Private Sub ArchiverDevis_Click()
Dim A
With Worksheets("Archive Devis").ListObjects(1).ListRows.Add()
A = Array(TextBox1.Value, Jour.Value, , NOM, ADRESSE, CP & " " & ComboBox3, _
TextBox1, Désignation, CDbl(Qté.Text), CDbl(lblPU.Caption), _
Int(CDbl(lblPU.Caption) * CDbl(Qté.Text)), PriseEnCharge, Trajet, FinCourse, "")
.Range.Resize(, UBound(A) + 1).Value = A
End With
End Sub
Private Sub Quitter_Click()
Dim sh As Worksheet: Set sh = Worksheets("Devis")
With sh.ListObjects("ListDevis")
If Not .DataBodyRange Is Nothing Then
If MsgBox("Êtes-vous certain de vouloir vider le tableau ?", _
vbYesNo, "Demande de confirmation") = vbYes Then
.DataBodyRange.Delete
sh.Range("C2, B4, C6, C7, C8, B11, A14, A16, A18") = ""
End If
End If
End With
Unload Me: Accueil.Show 0
End Sub
Private Sub UserForm_Initialize()
Dim chn$, lig&, n&: Jour = Format(Date, "dd/mm/yyyy"): lig = 2
Do
chn = Worksheets("Client").Cells(lig, 3): If chn = "" Then Exit Do
ComboBox1.AddItem chn: lig = lig + 1 'liste déroulante Recherche
Loop
Désignation.List = Worksheets("Prestation").Range("ListForfaits").Value
n = Worksheets("Archive Devis").ListObjects("ArchiveDevis").ListRows.Count + 1
TextBox1 = Year(Date) & "-" & Format(n, "000") 'N° Devis
End Sub
Bonjour Soan, content de te relire. J'ai eu peur que tu m'ais laissé tomber. Promis je ne douterais plus jamais. Surtout après ce post! De mon coté j'ai essayé de résoudre mon problème d'archivage, mais je n'ai pas réussi à obtenir ce que je voulais. Mais avec ton aide, se sera fait. Je regarde tout ça et je reviens vers toi. Merci, merci....Bonjour 974RE,
j'ai toujours pas fait le code du bouton Archiver Devis, car j'ai encore fait plein d'autres modifs !
ouvre le nouveau classeur ➯ fenêtre "Menu" ; appuie sur la touche Échap ➯ ce UserForm se ferme, et retour sur la feuille "Devis" ; fais Ctrl m ➯ fenêtre "Menu" ; appuie sur Échap ➯ retour sur la feuille "Devis".
fais Ctrl m ➯ fenêtre "Menu" ; clique sur le bouton Devis ➯ fenêtre "Devis" ; tu peux voir tout de suite ces 4 changements les plus évidents : j'ai remonté les 3 champs verts juste sous la Date Évènement ; il y a un 1er bouton Valider à droite de cette Date Évènement, et un 2ème bouton Valider à gauche du bouton rouge ; note aussi que l'année de la Date est sur 4 chiffres.
clique sur le bouton rouge ➯ fenêtre "Estimatif", et en arrière-plan : feuille "Prestation" ; appuie sur Échap ➯ retour sur la fenêtre "Devis", et en arrière-plan, ça retourne sur la feuille "Devis" ! même si on le voit pas, tu es sur le champ Recherche ; la preuve : appuie sur Échap ➯ retour sur la feuille "Devis".
tu veux revoir la fenêtre "Devis" ? ok, mais cette fois, au lieu de faire Ctrl m puis d'appuyer sur le bouton Devis, fais tout simplement Ctrl d ; c'est quand même plus simple, n'est-ce pas ?
dans la liste Recherche, sélectionne par exemple Lauret ➯ en dessous, les champs se remplissent ; appuie sur Échap ➯ le champ Recherche est effacé, et aussi les renseignements correspondants (tu ne le vois pas ici car les 3 champs verts sont déjà vides, mais si tu y avais déjà saisi quelque chose auparavant, tu verrais que les 3 champs verts sont aussi effacés) ; ne le fais pas, mais si tu appuyais de nouveau sur Échap alors que le champ est vide, ça fermerait le UserForm : retour sur la feuille "Devis" (mébon, tu sais maint'nant qu'il suffit d'faire Ctrl d pour ré-afficher ce UserForm).
sur la feuille "Devis", toutes les cellules de destination pour les renseignements sont vides ; ce sont C2 ; B4 ; C6 ; C7 ; C8 ; B11 ; A14 ; A16 ; A18.
dans la liste Recherche, sélectionne maintenant Piment ➯ en dessous, les champs se remplissent ; clique sur le 1er bouton Valider ➯ ça écrit tous les renseignements sur la feuille de calcul, aux bons endroits.
pour les 3 champs verts, saisis simplement : A ; B ; C ; clique sur le 2ème bouton Valider ➯ ça écrit les 3 champs verts en A14, A16, et A18.
pour la suite, du bouton Estimatif au bouton Ajouter, je n'ai rien besoin de détailler, car tu connais déjà : c'est resté pareil qu'avant ; attention : j'ai fait plein d'modifs dans le code VBA :
VB:Option Explicit Private Sub ComboBox1_Change() 'Recherche : item modifié => MAJ des champs Dim lig&: lig = ComboBox1.ListIndex If lig = -1 Then 'si on a appuyé sur Échap, on efface les champs ComboBox2 = "": NOM = "": ADRESSE = "": ComboBox3.ListIndex = -1: CP = "" TextBox2 = "": PriseEnCharge = "": Trajet = "": FinCourse = "": Exit Sub End If With Worksheets("Client").Cells(lig + 2, 2) 'on remplit les champs avec les cellules de la feuille "Client" ComboBox2 = .Value 'Civilité NOM = .Offset(, 1) 'NOM ADRESSE = .Offset(, 2) 'ADRESSE ComboBox3 = .Offset(, 4) 'VILLE TextBox2 = .Offset(, 7) 'Date Évènement End With End Sub Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) If KeyAscii = 27 Then Unload Me 'Échap sur le champ Recherche End Sub Private Sub ComboBox3_Change() 'VILLE modifiée => mise à jour du Code Postal If ComboBox3.ListIndex <> -1 Then CP = Format(ComboBox3.Column(1), "00 000") End Sub Private Sub CP_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'CP If CP <> "" Then CP = Format(CP, "00 000") 'on formate le Code Postal End Sub Private Sub TextBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 'Date Évènement Calendar.Affiche Me, Me.TextBox1.Name, ActiveControl.Name: Cancel = True End Sub Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Date Évènement TextBox2 = Format(TextBox2, "dddd d mmmm yyyy ") 'on formate la Date Évènement End Sub Private Sub Valider1_Click() '1er bouton Valider Application.ScreenUpdating = 0 With [Devis!B2] If Jour <> "" Then .Offset(, 1) = Jour 'DATE (du jour) If TextBox1 <> "" Then .Offset(2) = TextBox1 'N° Devis If ComboBox2 <> "" Or NOM <> "" _ Then .Offset(4, 1) = ComboBox2 & " " & NOM 'Civilité & NOM If ADRESSE <> "" Then .Offset(5, 1) = ADRESSE 'ADRESSE If CP <> "" Or ComboBox3 <> "" _ Then .Offset(6, 1) = CP & " " & ComboBox3 'CP & VILLE If TextBox2 <> "" Then .Offset(9) = TextBox2 'Date Évènement End With Application.ScreenUpdating = -1 End Sub Private Sub Valider2_Click() '2ème bouton Valider Application.ScreenUpdating = 0 With [Devis!A14] If PriseEnCharge <> "" Then .Value = PriseEnCharge 'Prise en Charge If Trajet <> "" Then .Offset(2) = Trajet 'Trajet If FinCourse <> "" Then .Offset(4) = FinCourse 'Fin de Course End With Application.ScreenUpdating = -1 End Sub Private Sub Estimatif_Click() 'bouton rouge Estimatif Estimatif_Coût.Show 'affiche le UserForm Estimatif End Sub Sub MAJ_HT(Q$, s$) 'Mise à jour du Montant HT Dim k As Byte: s = Replace$(s, Chr$(160), ""): k = Len(s) If Right$(s, 2) = " €" Then k = k - 2: s = Left$(s, k) If Q = "" Or k = 0 Then lblHT.Caption = "": Exit Sub lblHT.Caption = IIf(Val(Q) = 0 Or Val(s) = 0, _ 0, Format(Q * Val(s), "#,##0 €")) End Sub Private Sub Désignation_Change() 'Désignation : item modifié => MAJ PU & HT Dim k%: k = Désignation.ListIndex lblPU = Format(Round(Val(Replace$([Prestation!B13].Offset(k), _ ",", ".")), 0), "#,##0 €"): MAJ_HT Qté, lblPU.Caption End Sub Private Sub Qté_Exit(ByVal Cancel As MSForms.ReturnBoolean) 'Qté MAJ_HT Qté, lblPU.Caption End Sub Private Sub Ajouter_Click() Application.ScreenUpdating = 0 With Worksheets("Devis") With .ListObjects("ListDevis").ListRows.Add() If Désignation.ListIndex > -1 Then .Range(1, 1) = Désignation.Value If IsNumeric(Qté.Text) Then .Range(1, 2) = CDbl(Qté.Text) If IsNumeric(lblPU.Caption) Then .Range(1, 3) = CDbl(lblPU.Caption) If IsNumeric(lblHT.Caption) Then .Range(1, 4) = CDbl(lblHT.Caption) End With End With Application.ScreenUpdating = -1 End Sub Private Sub ArchiverDevis_Click() Dim A With Worksheets("Archive Devis").ListObjects(1).ListRows.Add() A = Array(TextBox1.Value, Jour.Value, , NOM, ADRESSE, CP & " " & ComboBox3, _ TextBox1, Désignation, CDbl(Qté.Text), CDbl(lblPU.Caption), _ Int(CDbl(lblPU.Caption) * CDbl(Qté.Text)), PriseEnCharge, Trajet, FinCourse, "") .Range.Resize(, UBound(A) + 1).Value = A End With End Sub Private Sub Quitter_Click() Dim sh As Worksheet: Set sh = Worksheets("Devis") With sh.ListObjects("ListDevis") If Not .DataBodyRange Is Nothing Then If MsgBox("Êtes-vous certain de vouloir vider le tableau ?", _ vbYesNo, "Demande de confirmation") = vbYes Then .DataBodyRange.Delete sh.Range("C2, B4, C6, C7, C8, B11, A14, A16, A18") = "" End If End If End With Unload Me: Accueil.Show 0 End Sub Private Sub UserForm_Initialize() Dim chn$, lig&, n&: Jour = Format(Date, "dd/mm/yyyy"): lig = 2 Do chn = Worksheets("Client").Cells(lig, 3): If chn = "" Then Exit Do ComboBox1.AddItem chn: lig = lig + 1 'liste déroulante Recherche Loop Désignation.List = Worksheets("Prestation").Range("ListForfaits").Value n = Worksheets("Archive Devis").ListObjects("ArchiveDevis").ListRows.Count + 1 TextBox1 = Year(Date) & "-" & Format(n, "000") 'N° Devis End Sub
soan
Repose toi bien, bon week-end!oui, je suis toujours là, même si parfois je tarde beaucoup !
j'vais aller m'reposer, et j'te souhaite bon week-end !
soan
With Worksheets("Devis")
With .ListObjects("ListDevis").ListRows.Add()
'...
End With
End With
With Worksheets("Devis").ListObjects("ListDevis").ListRows.Add()
'...
End With
Private Sub Ajouter_Click()
Application.ScreenUpdating = 0
With Worksheets("Devis").ListObjects("ListDevis").ListRows.Add()
If Désignation.ListIndex > -1 Then .Range(1, 1) = Désignation.Value
If IsNumeric(Qté.Text) Then .Range(1, 2) = CDbl(Qté.Text)
If IsNumeric(lblPU.Caption) Then .Range(1, 3) = CDbl(lblPU.Caption)
If IsNumeric(lblHT.Caption) Then .Range(1, 4) = CDbl(lblHT.Caption)
End With
Application.ScreenUpdating = -1
End Sub
Private Sub Valider1_Click() '1er bouton Valider
Application.ScreenUpdating = 0
With [Devis!B2]
If Jour <> "" Then .Offset(, 1) = Jour 'DATE (du jour)
If TextBox1 <> "" Then .Offset(2) = TextBox1 'N° Devis
If ComboBox2 <> "" Or NOM <> "" _
Then .Offset(4, 1) = ComboBox2 & " " & NOM 'Civilité & NOM
If ADRESSE <> "" Then .Offset(5, 1) = ADRESSE 'ADRESSE
If CP <> "" Or ComboBox3 <> "" _
Then .Offset(6, 1) = CP & " " & ComboBox3 'CP & VILLE
If TextBox2 <> "" Then .Offset(9) = TextBox2 'Date Évènement
End With
Application.ScreenUpdating = -1
End Sub
Private Sub Valider2_Click() '2ème bouton Valider
Application.ScreenUpdating = 0
With [Devis!A14]
If PriseEnCharge <> "" Then .Value = PriseEnCharge 'Prise en Charge
If Trajet <> "" Then .Offset(2) = Trajet 'Trajet
If FinCourse <> "" Then .Offset(4) = FinCourse 'Fin de Course
End With
Application.ScreenUpdating = -1
End Sub
Bonjour Soan,Bonjour 974RE,
dans mon post #80, j'ai oublié de te parler de ces quelques infos :
le bouton Ajouter sert pour ajouter une ligne de détail au tableau de la feuille "Devis" ; si par exemple tu dois ajouter 8 lignes de détail, tu vas devoir les ajouter l'une après l'autre, et donc tu auras cliqué 8× sur le bouton Ajouter ; exact, n'est-ce pas ? or au début, c'est ta sub Ajouter_Click() qui écrivait tous les renseignements qui sont au-dessus (de Date à Fin de Course) ! c'est-à-dire que ça les écrivait 8× alors qu'une seule fois aurait suffit !
c'est pour ça que j'ai ajouté un bouton Valider pour les renseignements du dessus : c'est lui qui écrit une seule fois ces infos sur la feuille "Devis" ; puis j'me suis rendu compte que ça n'allait pas avec un seul bouton Valider, car en écrivant les infos des champs verts, on écrivait de nouveau, et inutilement toutes les autres infos !
voilà pourquoi j'ai mis deux boutons Valider : un pour les renseignements situés au-dessus des 3 champs verts, et l'autre pour les 3 champs verts ; de plus, si ces renseignements ont déjà été écrits sur la feuille "Devis", et que tu ouvres le UserForm Devis, comme les champs du UF sont vides, tu peux faire comme avec le UF Estimation : remplir uniquement les champs à modifier et cliquer sur Valider : ça écrira ces seuls champs sans modifier les autres.
quand j'ai déplacé du code VBA de la sub Ajouter_Click() dans la sub Valider_Click(), j'ai oublié que c'était devenu possible de réunir 2 With dans Ajouter_Click().
ainsi, ces 2 With imbriqués :
VB:With Worksheets("Devis") With .ListObjects("ListDevis").ListRows.Add() '... End With End With
sont devenus un seul With :
VB:With Worksheets("Devis").ListObjects("ListDevis").ListRows.Add() '... End With
(au tout début, y'avait des lignes de code VBA qui dépendaient seulement du 1er With, et ça empêchait de réunir les 2 With)
voici la sub actuelle complète :
VB:Private Sub Ajouter_Click() Application.ScreenUpdating = 0 With Worksheets("Devis").ListObjects("ListDevis").ListRows.Add() If Désignation.ListIndex > -1 Then .Range(1, 1) = Désignation.Value If IsNumeric(Qté.Text) Then .Range(1, 2) = CDbl(Qté.Text) If IsNumeric(lblPU.Caption) Then .Range(1, 3) = CDbl(lblPU.Caption) If IsNumeric(lblHT.Caption) Then .Range(1, 4) = CDbl(lblHT.Caption) End With Application.ScreenUpdating = -1 End Sub
tout ce que j'ai écrit dans la 2ème partie de ce post était avant que je mette 2 boutons Valider, car maintenant, à la place de l'unique sub Valider_Click() il y a ces deux subs : Valider1_Click() et Valider2_Click() :
VB:Private Sub Valider1_Click() '1er bouton Valider Application.ScreenUpdating = 0 With [Devis!B2] If Jour <> "" Then .Offset(, 1) = Jour 'DATE (du jour) If TextBox1 <> "" Then .Offset(2) = TextBox1 'N° Devis If ComboBox2 <> "" Or NOM <> "" _ Then .Offset(4, 1) = ComboBox2 & " " & NOM 'Civilité & NOM If ADRESSE <> "" Then .Offset(5, 1) = ADRESSE 'ADRESSE If CP <> "" Or ComboBox3 <> "" _ Then .Offset(6, 1) = CP & " " & ComboBox3 'CP & VILLE If TextBox2 <> "" Then .Offset(9) = TextBox2 'Date Évènement End With Application.ScreenUpdating = -1 End Sub Private Sub Valider2_Click() '2ème bouton Valider Application.ScreenUpdating = 0 With [Devis!A14] If PriseEnCharge <> "" Then .Value = PriseEnCharge 'Prise en Charge If Trajet <> "" Then .Offset(2) = Trajet 'Trajet If FinCourse <> "" Then .Offset(4) = FinCourse 'Fin de Course End With Application.ScreenUpdating = -1 End Sub
soan
Bonsoir Soan,@974RE
j'ai bien vu ton post #85, avec ton nouveau fichier.
maint'nant, on va s'occuper du bouton Archiver Devis ; je t'entends dire « enfin ! »tu vois, tu l'as pensé trop fort : j'l'ai entendu même si t'es à plus de 11 000 km d'ici ! ; bon, j'espère que t'es vraiment en forme, car va y'avoir plein d'boulot ! ATTENTION : n'ouvre PAS encore le fichier joint ! tu le feras APRÈS avoir lu les 3 points ci-dessous ! c'est juste pour que tu sois bien synchronisé avec la démo que je vais te proposer.
1) ton code VBA initial n'est pas terrible, car il cherche à écrire les infos à partir des contrôles du UF Devis ; et comme tu saisis les lignes de détail l'une après l'autre, ça signifie que t'es obligé d'archiver les lignes de détail de la même façon : l'une après l'autre aussi ! alors que c'est beaucoup plus simple d'archiver le devis à partir des infos qui ont été écrites sur la feuille "Devis" !
2) comme ta feuille "Archive Devis" ne sert pas pour y faire de la saisie mais juste pour ajouter de nouvelles données au fur et à mesure des devis à archiver, j'ai préféré convertir en plage normale ton tableau structuré "ArchiveDevis" ; donc il n'existe plus, mais bien sûr, les données sont toujours là !
3) ta feuille "Archive Devis" comporte un gros problème structurel ! en effet, tu veux y écrire toutes les lignes de détail, de la Désignation au Montant HT (colonnes H à K) ; donc s'il y a par exemple 8 lignes de détail, tu vas avoir 8 lignes en plus, n'est-ce pas ? et pour ces 8 lignes de détail tu veux répéter toutes les autres infos de la ligne ? ça n'est pas bon ! c'est pour éviter ça qu'il faut utiliser 2 feuilles de calcul : la 2ème feuille pour les lignes de détail, et la 1ère feuille pour les autres infos ; cependant, afin de savoir à quel devis correspondent les lignes de détail de la 2ème feuille, il faut absolument répéter l'info N° Devis, qu'on place en 1ère colonne pour voir de suite ce renseignement essentiel !
ouvre le fichier joint ➯ fenêtre "Menu" ; appuie sur Échap ➯ le UF se ferme ; tu es sur la feuille "A.DV" : c'est la 1ère feuille Archive DeVis ; regarde les 11 colonnes A à K ; il y a les 3 lignes 2 à 4, car 3 devis ont déjà été archivés : DEV2021-001 ; DEV2021-002 ; DEV2021-003 ; quand plus tard on archivera le 4ème devis, tu pourras voir que ça va ajouter une seule ligne, en ligne 5, quelque soit le nombre de lignes de détail de ce 4ème devis.
va sur la feuille "A.LD" ; c'est la 2ème feuille Archive Devis, pour les Lignes de Détail ; regarde les 5 colonnes A à E ; il y a les 3 lignes 2 à 4, car chacun des 3 devis qui ont déjà été archivés n'avaient qu'une seule ligne de détail ; pour le futur 4ème devis, qui aura 4 lignes de détail, tu pourras voir que ça va ajouter 4 lignes, des lignes 5 à 8.
va sur la feuille "Devis" ; tu peux voir en C4 que le N° Devis est : DEV2021-004 ; fais défiler vers le bas pour voir le tableau du devis ; note que j'ai ajouté 2 lignes, juste pour que la démo sois plus convaincante.
note aussi que j'ai ajouté une remise de 10% ; c'est normal : tu sais bien que j't'achète aucune prestation si tu m'fais pas une remise d'au moins 10% ! c'est qu'je suis un client très difficile, moi ! et sans cette remise, j'risque bien d'aller voir ce que propose la concurrence !
le 4ème devis est donc déjà rempli, avec ses 4 lignes de détail ; fais Ctrl d ; comme le devis est déjà correct sur la feuille "Devis", ne saisis rien et clique sur le bouton Arlésienne ; oui, c'est bien ça, c'est celui qui s'est tant fait attendre : le bouton Archiver Devis ➯ message :
« Le devis DEV2021-004 a été archivé. » : un miracle s'est accompli, en ce jour de l'an de grâce 2021, et ça malgré la pandémie !
oui bon, je sais, t'es pas obligé d'me croire sur parole, hein ?alors je te laisse aller vérifier : appuie sur Échap pour sortir du message ; clique sur la croix blanche sur fond rouge du coin haut droit du UF pour le fermer (n'utilise pas le bouton Quitter, car ça permet d'éviter la question « Êtes-vous certain de vouloir vider le Devis ? ») ; va sur la feuille "A.DV" ; regarde la nouvelle ligne 5 (pour le devis DEV2021-004) ; va sur la feuille "A.LD" ; regarde les 4 nouvelles ligne 5 à 8 (pour le devis DEV2021-004) ; c'est ok : ton archivage est fait ! attends, c'est pas fini : va sur la feuille "Devis" ; fais Ctrl d ; et que vois-tu dans la petite case à gauche de celle de la date ? ça s'rait pas ça, ton N° de devis qui s'incrémente automatiquement ? oui, hein ? qui c'est qui est super content, et qui va pouvoir aller fêter ça ?
soan
Bonsoir Soan, ça y est, j'arrive à générer un PDF à partir de ma feuille Devis. Par contre, je voudrais que le PDF prenne le nom du numéro du Devis et du Nom du Client: "DEV2021-004 Mme Piment".Bonjour Soan,
Je reviens vers toi pour un nouveau problème. Maintenant que le Devis fonctionne bien, je voudrais l'éditer en format PDF et le stocker dans un fichier. J'ai essayé en m'appuyant sur des codes que j'ai trouvé sur internet, mais je n'y arrive pas.
Un coup pouce s'il te plaît.
Merci à bientôt.