Ameliorer mon Code VBA

Bonjour à tous. j’ai ce tableau que je dois remplir avec un userform.
J’ai crée un facturier. Ce volet c’est la gestion client. Je crée le facturier, le numéro de facture est crée au moment où je valide ma facture et c’est ce numéro qui est en B3.

Je veux maintenant faire un userfom pour la gestion des règlements clients. De sorte à ce qu’une facture, donc avec un numéro, puisse être payé en plusieurs fois. Et donc je fais mon userform

Mon problème se situe au niveau de la validation. une facture peut être payée en plusieurs fois. donc le MÊME NUMÉRO de facture peut être choisi dans le userform… Mon soucis c’est que dès que je choisis le même numéro de facture et que j’enregistre, il écrase l’enregistrement qui porte le même numéro… au lieu d’enregistrer à la suite…
Je ne sais pas si je me suis fais bien comprendre mais bon j’ai besoin de votre aide

Bonjour,
Pour répondre correctement, il serait peut-être mieux d’avoir un classeur exemple de travail pour faire les modifications éventuelles
Sur une image, à part l’admirer, et écrire au feutre sur l’écran, on fait pas grand chose :grin:

:grin::grin::grin::grin: Pas faux… Je voulais juste qu’on me dise pourquoi je demande à la machine d’ajouter une ligne quand j’appuie “valider” et la machine va écraser une ligne. Bon c’est vrai qui a un peu les même caracteristiques qu’une ligne déjà là… mais bonFacture projet.xlsm (162,8 Ko)

Re, bonsoir,

Bon, j’ai regardé un petit peu mais…;:hushed:

J’y comprends rien dans ta gestion

POUR MOI:
Si tu fais une facture pour une vente de produit, le client paye la totalité et BOUM dans la base de données de facture
Si le client demande à payer en plusieurs fois, dans ce cas une case à cocher dans la facture, “BOUM” dans la Base de données de facture avec une colonne qui prescrit un étalement avec la somme due et une alerte
Cet étalement sera repris sur une modification avec le même N° de facture et son versement qui sera ajouté à ce qu’il a déjà payé avec la somme due avec une indice ("paiement 1, paiement 2, etc…)
une fois la somme réglée, plus d’avertissement
et un tri sur le N° de facture pour visionner les progressions avec un autre tri sur bouton pour trier sur les date de commande,
Sinon, c’est le gros “bins” avec des N° de facture ajoutés

C’est mon principe de fonctionnement

Mais c’est ce que j’ai tenté de faire. Peut être maladroitement. Il y a la page enregistrement de facture. Toutes les factures y sont enregistrées. La seconde c’est celle qui traite les règlements. On enregistre la totalité du montant payé ou les règlements partiels… Dans les deux cas je vais créer une feuille qui va faire les tris de sorte à ce que tous les paiements de la même facture soient additionné et soustraient du montant initial de la facture pour en sortir le solde (boum)… Je vais créer un userform pour le suivi des règlements avec une combobox avec les choix de facture…
Mais bon ma question demeure… Comment ne pas écraser deux factures qui ont les mêmes numéros…???

Re,

Le problème vient de ta recherche de N° ligne sur ton USF , remplace par cette macro

Private Sub CommandButton1_Click()
  'modification à partir du bouton modifier
  Dim Ligne As Long
    If MsgBox("Confirmez vous le règlement de cette facture ?", vbYesNo, "Demande de confirmation de Modification") = vbYes Then
      If Me.ComboBox1.ListIndex = -1 Then Exit Sub
      Set ws = Sheets("Gestion Reglements Clients")
      Ligne = ws.Range("A" & Rows.Count).End(xlUp).Row + 1
      ws.Cells(Ligne, "B") = ComboBox1
      ws.Cells(Ligne, "D") = TextBox1
      ws.Cells(Ligne, "E") = TextBox2
      ws.Cells(Ligne, "F") = TextBox3
      ws.Cells(Ligne, "G") = TextBox4
      ws.Cells(Ligne, "H") = TextBox5
      ws.Cells(Ligne, "I") = TextBox6
      ws.Cells(Ligne, "J") = TextBox7
      ws.Cells(Ligne, "K") = TextBox8
      ws.Cells(Ligne, "L") = TextBox9
      ws.Cells(Ligne, "M") = TextBox10
    End If
End Sub

Ensuite, j’irai pas plus loin, car tout est à refaire, car c’est un vrai “méli-mélo” :hushed:

Imagine que tu créés une feuille à chaque facture, si tu as 10 factures, OK, quand tu auras une centaine de facture, tu auras un classeur hyper lourd, et d’une lenteur d’exécution.
Tu as mis des tableaux alors que tu commandes tout pas VBA, aucun intérêt.
Etc…

Re,

Avec un peu de temps, à tester

Il faut créer un dossier dans l’explorateur de windows dans le dossier du classeur que je joint, celui-ci enregistrera la facture en PDF (donc pas de perte de place) et tu pourras aller les visionner et/ou l’imprimer par le bouton.

Teste si cela convient
Facture projet2.xlsm (157,0 Ko)

Je te remercie déjà pour ta disponibilité, c’est vraiment cool… Chez nous les croyants, on dit : Dieu te bénira… :slight_smile:
1 Merci pour le fichier, je le regarde et je te reviens
2. Les tableaux dont tu parles, ils ne doivent pas exister??? J’ai fais des tableaux pour pouvoir enregistrer des données et ensuite les renvoyer au moment de faire des recherches… tu les trouve inutiles??? Donc j’avais pensé à un USF pour une recherche client… du genre tu entres le numéro de la facture ou le nom du client et le USF te renvois sa situation… pour ça il me faut des tableaux non???
merci dejà de ta réponse…

Je sais que je te fatigue et que je te prends du temps, si tu étais à côté je t’aurai offert une bonne grosse bière frappée!!! :slight_smile: :slight_smile: Merci encore

Re,

Oui mais à savoir Tableau & VBA ne font pas trop bon ménage.
J’avais oublié de préciser que le N° de facture s’incrémente automatiquement par rapport au nom du client
si le client1 à 5 factures son N° de facture sera client1/6 s’il n’y en que 2 Client1/3

Teste et tu verras bien

et pour le nom du dossier —> Archives Factures

Comprend pas

As-tu lu
Il faut créer un dossier dans l’explorateur de windows dans le dossier du classeur que je joint
et pour le nom du dossier —> Archives Factures

Le classeur que tu joint à donc un dossier ??? J’avoue ne pas comprendre ta phrase…

Tu demandes que je crée un dossier dans l’explorateur de Windows… Ok!
Tu demandes que je crée ce dossier dans le dossier du classeur que tu joins… (Perdu😢)… Et qui devra s’appeller “Archives facture”…

Sois indulgent, je comprends vite mais faut qu’on m’explique longtemps… :sunglasses:

Re,

DUR DUR

image

De plus, tu remets ma macro pour l’enregistrement en PDF comme je te l’ai fourni
pas besoin de ton C:\Users\hpj…

:grin::grin::grin::grin::grin::grin::grin::grin: ça marche comme par hasard!!!
Écoute je suis bluffé par ta maitrise… tu as un bouquin dans lequel tu t’inspire???
Comment tu fais???
Surtout cette partie là

Re,
Cela fait plus de 25 ans que je pratique, alors les bouquins au départ OUI, après c’est comme parler normalement.
Mais rassure toi, je vais aussi “farfouiller” sur le Net pour des problème beaucoup plus hard.
Je ne suis pas non plus un Expert. :wink:

Ensuite, j’ai des routines comme celle que tu montres qui sont toutes faites dans un dossier contenat des modules répétitifs pour économiser mes bouts de doigt :grin:

Je vais continuer… Je viens de me rendre compte de l’immensité de la tâche qui m’attend…
Félicitation à toi!!!
Et puis si tu as des pistes pour m’aider à “parler” (:wink:) comme toi je suis tout ouïe…

Tu mérite plus qu’une bière… tu mérites 2 bières!!!
Merci à toi et on se recontacte!!!

Bon voilà, c’est encore moi… :grin::grin::grin::grin: (ton pire cauchemar :imp::imp:) J’ai un soucis avec le code du Montant restant dû…


il me met “Montant soldé” alors qu’en la réalité :

Le montant n’est pas soldé…
J’ai bien essayé de toucher ton code mais bon…

Normalement il devait pouvoir m’afficher la différence entre 27 697 870 - 21 896 365 c’est à dire les 5 801 505…

Si tu veux bien m’expliquer le code que tu utilise… et surtout la démarche… ce serait cool merci

Re,

Eh oui, des erreurs d’inattention
Regarde dans USF “Reglement”, j’ai omis de préciser le nom de la feuille
—>Solde = Wd.Cells(j, 13) au lieu de —>Solde =Cells(j, 13)

Private Sub ComboBox1_Change()
'pour afficher dans les textbox
  Dim LigneSolde%, Solde As Double
   If Me.ComboBox1.ListIndex = -1 Then Exit Sub
   Set Ws = Sheets("Enregistrement_Facture")
   Set Wd = Sheets("Gestion Reglements Clients")
   Dl = Wd.Range("B" & Rows.Count).End(xlUp).Row
   Ligne = Me.ComboBox1.ListIndex + 3
   Me.TextBox1 = Ws.Cells(Ligne, 2)
   Me.TextBox2 = Ws.Cells(Ligne, 1)
   Me.TextBox3 = Ws.Cells(Ligne, 2)
   Me.TextBox4 = Ws.Cells(Ligne, 4)
   Me.TextBox5 = Ws.Cells(Ligne, 6)
    For j = Dl To 3 Step -1
      If Me.ComboBox1.Value = Wd.Cells(j, 2).Value Then
        Solde = Wd.Cells(j, 13)
        Me.TextBox10 = Solde
        Exit For
      Else
        Me.TextBox10 = Me.TextBox5
      End If
    Next j
    If Me.TextBox10 >= 0 Then
      Me.TextBox10 = " Montant Soldé"
    End If
End Sub