Code Userform erronné / Dranreb

Le_Troll_Du_27

XLDnaute Occasionnel
Bonjour le forum,

Comment incrémenter une date qui sera elle même reprise pour la lettre de relance2 et elle-même, le même casse-tête. Exemple la date Relance!D10 sera mise sur le courrier suivant dans 30j si non paiement en Relance!Q26. Sur la feuille Relance2 le même soucis vers Relance3 entre D10 et Q26
plus la relance du courrier précédent. Un jeu de couleur pour plus de lisibilité
Relance1 et Relance3 même modèle

Code:
'Début  ***** Code de programmation de l'Userform C_RECAP_SUIVI_FACTURES  *****
 '***** Correspond au programme du FORMULAIRE à son ouverture *****
 Option Explicit
 Dim WithEvents CL As ComboBoxLiées
 Dim LCou As Long ' Numéro de ligne en cours de MàJ. 0 ==> Création.
 Dim VLgn() ' Valeurs de la ligne courante à charger ou décharger.
 '***** Correspond au programme du FORMULAIRE à son ouverture *****
 'Cet évènement est important car il permet de définir les propriétés des objets et les valeurs par défaut des variables, lors du lancement du Userform.
 Private Sub UserForm_Initialize()    'à l'initialisation de l'userform
     Set CL = New ComboBoxLiées
     CL.Plage Sheets("SUIVI FACTURES").Rows(5)
     CL.Add ComboBox1, "A"
     CL.Add ComboBox2, "B"
     CL.CorrespRequise = True
     CL.Actualiser

 End Sub
 '**** Correspond au programme du bouton "QUITTER" *****
 Private Sub BtnFermer_Click()
     If BtnFermer.Caption = "EFFACER" Then
         CL.Nettoyer: BtnFermer.Caption = "FERMER"
     Else: Me.Hide: End If
 End Sub
 '***** Correspond au programme du bouton "INSERER DANS SUIVI FACTURES" *****
 Private Sub CL_Change(ByVal Complet As Boolean, ByVal NbrLgn As Long)
 If NbrLgn = 1 Then Exit Sub
 LCou = 0
 ReDim VLgn(5 To 5, 1 To 22)
 GarnirChamps
 Me.BtnValider.Caption = "INSERER DANS SUIVI FACTURES"
 Me.BtnAnnuler.Caption = "Effacer"
 End Sub
Code:
 '***** Correspond au programme du bouton "MODIFIER" *****
 Private Sub CL_BingoUn(ByVal Ligne As Long)
 LCou = Ligne
 VLgn = CL.PlgTablo.Rows(LCou).Resize(, 24).Value
 GarnirChamps
 Me.BtnValider.Caption = "Modifier"
 Me.BtnAnnuler.Caption = "Effacer"

 Private Sub GarnirChamps()
         TextBox1 = VLgn(1, 3)       ' date de la facture
         TextBox2 = VLgn(1, 4)       ' date d'échéance
         TextBox3 = VLgn(1, 5)       ' montant ttc
         TextBox4 = VLgn(1, 6)       ' nombre de jours dépassés
         TextBox5 = VLgn(1, 7)       ' majoration
         TextBox6 = VLgn(1, 8)       ' solde dû
         TextBox7 = VLgn(1, 9)       ' réglée
         TextBox8 = VLgn(1, 10)      ' date du règlement
         TextBox9 = VLgn(1, 11)      ' montant total payé
         TextBox10 = VLgn(1, 12)     ' majoration payée
         TextBox11 = VLgn(1, 13)     ' première relance
         TextBox12 = VLgn(1, 14)     ' deuxième relance
         TextBox13 = VLgn(1, 15)     ' troisième relance
         TextBox14 = VLgn(1, 16)     ' observation
         TextBox15 = VLgn(1, 17)     ' tva 5.5%
         TextBox16 = VLgn(1, 18)     ' tva 7%
         TextBox17 = VLgn(1, 19)     ' tva 10%
         TextBox18 = VLgn(1, 20)     ' tva 20%
         TextBox19 = VLgn(1, 21)     ' montant ht
         TextBox20 = VLgn(1, 22)     ' adresse
         TextBox21 = VLgn(1, 23)     ' code postal
         TextBox22 = VLgn(1, 24)     ' ville

 End Sub
Code:
Private Sub BtnAnnuler_Click()
 Select Case BtnAnnuler.Caption
    Case "Annuler": GarnirChamps: BtnAnnuler.Caption = "Effacer"
    Case "Effacer": CL.Nettoyer: BtnAnnuler.Caption = "Quitter"
    Case "Quitter": Unload Me
    End Select
 End Sub
 '***** Correspond au programme du bouton "VALIDER" *****
 Private Sub BtnValider_Click()
 Dim I&
 If LCou = 0 Then
    LCou = CL.PlgTablo.Rows.Count
    CL.PlgTablo.Rows(LCou).Copy
    CL.PlgTablo.Rows(LCou).Insert
    Application.CutCopyMode = False
    LCou = LCou + 1
    For I = 1 To CL.Count ' Écrire les Text des ComboBox
       VLgn(1, CL.Item(I).Col) = Trim$(CL.Item(I).CBx.Text)
       Next I: End If
       
         VLgn(1, 3) = TextBox1       ' date de la facture
         VLgn(1, 4) = TextBox2       ' date d'échéance
         VLgn(1, 5) = TextBox3       ' montant ttc
         VLgn(1, 6) = TextBox4       ' nombre de jours dépassés
         VLgn(1, 7) = TextBox5       ' majoration
         VLgn(1, 8) = TextBox6       ' solde dû
         VLgn(1, 9) = TextBox7       ' réglée
         VLgn(1, 10) = TextBox8      ' date du règlement
         VLgn(1, 11) = TextBox9      ' montant total payé
         VLgn(1, 12) = TextBox10     ' majoration payée
         VLgn(1, 13) = TextBox11     ' première relance
         VLgn(1, 14) = TextBox12     ' deuxième relance
         VLgn(1, 15) = TextBox13     ' troisième relance
         VLgn(1, 16) = TextBox14     ' observation
         VLgn(1, 17) = TextBox15     ' tva 5.5%
         VLgn(1, 18) = TextBox16     ' tva 7%
         VLgn(1, 19) = TextBox17     ' tva 10%
         VLgn(1, 20) = TextBox18     ' tva 20%
         VLgn(1, 21) = TextBox19     ' montant ht
         VLgn(1, 22) = TextBox20     ' adresse
         VLgn(1, 23) = TextBox21     ' code postal
         VLgn(1, 24) = TextBox22     ' villeCL.PlgTablo.Rows(LCou).Resize(, 12).Value = VLgn
 CL.Actualiser
 End Sub
 
Dernière édition:

Bebere

XLDnaute Barbatruc
Re : Suivi Facture avec lettre de relance / Code Userform erronné

bonjour
code feuille relance2 avec essai couleur

Option Explicit
' déclaration des variables
Dim I As Long, J As Long, x

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$4" Then
I = 20 ' 1ère ligne de détail de la relance
Range("C20:X24").ClearContents
' effacement de la zone de détail
With Sheets("SUIVI FACTURES")
For J = 5 To .Range("A65536").End(xlUp).Row
If UCase(.Cells(J, 1)) = UCase(Target) Then
Cells(5, 4) = .Cells(J, 22) 'adresse
Cells(6, 4) = .Cells(J, 23) 'code postal
Cells(7, 4) = .Cells(J, 24) 'ville
Cells(I, 3) = .Cells(J, 2) 'n° de facture
Cells(I, 6) = .Cells(J, 3) 'date de création
Cells(I, 10) = .Cells(J, 4) 'échéance
Cells(I, 14) = .Cells(J, 12) 'majoration payé
Cells(I, 17) = .Cells(J, 8) 'montant ttc reste du
Cells(I, 21) = .Cells(J, 11) 'montnant ttc payé
I = I + 1
End If
Next J
End With
couleur
End If
End Sub


Sub couleur()
Dim L As Long

For L = 20 To 24
Cells(L, 3).Interior.ColorIndex = -4142
x = DateDiff("d", Cells(L, 6), Cells(L, 10))
If Cells(L, 3) <> "" Then
If Cells(L, "N") <> "" Then
If Cells(L, "N") - Cells(L, "Q") = 0 Then Cells(L, 3).Interior.ColorIndex = Cells(18, "AF").Interior.ColorIndex 'bleu
ElseIf Cells(L, 12) = "" And x <= 30 Then
Cells(L, 3).Interior.ColorIndex = Cells(18, "AE").Interior.ColorIndex 'vert
ElseIf Cells(L, 12) = "" And x > 30 Then
Cells(L, 3).Interior.ColorIndex = Cells(18, "AD").Interior.ColorIndex 'rouge
End If
End If

Next L

End Sub
 

Le_Troll_Du_27

XLDnaute Occasionnel
Re : Suivi Facture avec lettre de relance / Code Userform erronné

Bonjour Bébère,

Le code pour la relance fonctionne et rempli bien ça fonction. Mais serait-t-il possible d'argumenter par une date par la relance1 qui rappelle 30 jours apres la date du courrier 1 sur la relance2 avec ca propre date et meme chose pour la relance final 3
 

Le_Troll_Du_27

XLDnaute Occasionnel
Re :Code Userform erronné / Dranreb

Bonjour le forum, le fil,

Je viens de m'apercevoir que je n'ai pas réglé cette partie ci.

C'est les sources de Dranreb et j'ai planté l'userform
Pouvez-vous jeter un œil et me dire ce qu'il ne va pas
Merci
amicalement
Laurent
 

Dranreb

XLDnaute Barbatruc
Re : Code Userform erronné / Dranreb

Bonjour.

Vous avez un problème parce que vous utilisez des VLgn(5, c) au lieu de VLgn(1, c) dans la Sub GarnirChamps.
Ça passe quand ça vient du ReDim VLgn(5 To 5, 1 To 24) de la Sub CL_Change,
mais pas quand ça vient du VLgn = CL.PlgTablo.Rows(LCou).Resize(, 24).Value de la Sub CL_BingoUn.
La propriété Value d'un Range figurant plusieurs cellules est toujours un tableau 2D Basé 1.
Pour une seule ligne de 24 colonnes c'est donc toujours VLgn(1 To 1, 1 To 24)

Par ailleurs tout cela semble organisé pour autoriser la création, mais elle n'est pas possible à cause de l'instruction CL.CorrespRequise = True de la Sub UserForm_Initialize. Si vous l'enlevez donc, vous pourriez mettre à la place CL.CouleurSympa. Le fond des ComboBox deviendrait rougeâtre quand vous y taperiez un code qui n'existe pas encore.

Il ne doivent pas servir à grand chose les commentaires que vous avez mis au dessus des procédures car il y a des "'***** Correspond au programme…" qui n'ont aucun rapport avec les Private Sub CL_ qui les suivent, au lieu de "'***** Évènement ComboBoxLiées se produisant quand…".
 
Dernière édition:

Le_Troll_Du_27

XLDnaute Occasionnel
Re : Code Userform erronné / Dranreb

Re le forum, le fil, Dranreb
J'aurai une question
Comment garder les valeurs et leurs formules apres validation
AComboBox1NOM
BComboBox2FACT-
CTextBox1Format date
DTextBox2=SI([@[Date facture]]="";"";FIN.MOIS([@[Date facture]]+30;0))
ETextBox3Format €
FTextBox4=SI([@[Date facture]]="";"";SI(OU([@[Date d''échéance]]="";[@Réglée]= "Validée");0;SI([@[Date d''échéance]]>AUJOURDHUI();0;DATEDIF([@[Date d''échéance]];$B$1;"d"))))
GTextBox5=SI([@[Date facture]]="";"";SI([@[Troisième relance ]]="";0;SI([@[Nbre de Jours en dépassement]]>0;[@[Montant TTC]]*$E$1*([@[Nbre de Jours en dépassement]]/365)+40;0)))
HTextBox6=SI([@[Date facture]]="";"";[@[Montant TTC]]+[@Majoration])
ITextBox7=SI([@[Raison sociale]]="";"";SI(OU([@[Montant TTC]]<=[@[Paiement Comptant]];[@[Montant TTC]]<=[@[Paiement Différé]]);"Validée";"En attente"))
JTextBox8Format date
KTextBox9=SI(ET([@[Paiement Comptant]]="";[@[Paiement Différé]]="");"";([@[Paiement Comptant]]+[@[Paiement Différé]]))
LTextBox10=SIERREUR(SI([@Réglée]="Validée";[@[Montant Total Payé]]-[@[Montant TTC]];"");"")
MTextBox11=SI([@Réglée]= "Validée";"";SI([@[Raison sociale]]<>"";SI(AUJOURDHUI()>[@[Date d''échéance]]+15;"Relance1";"");""))
NTextBox12=SI([@Réglée]="Validée";"";SI([@[Raison sociale]]<>"";SI(AUJOURDHUI()>[@[Date d''échéance]]+45;"Relance2";"");""))
OTextBox13=SI([@Réglée]="Validée";"";SI([@[Raison sociale]]<>"";SI(AUJOURDHUI()>[@[Date d''échéance]]+75;"Relance3";"");""))
PTextBox14=SI(ET([@[Date du Règlement]]<=[@[Date d''échéance]];[@[Date du Règlement]]>0;[@[Majoration Payée]]=0);"Dans les temps";SI([@[Date du Règlement]]>[@[Date d''échéance]];"A Surveiller";SI([@Réglée]="Validée";"";SI([@[Raison sociale]]<>"";SI([@[Date d''échéa
QTextBox15Format €
RTextBox16Format €
STextBox17Format €
TTextBox18Format €
UTextBox19=SI([@[Date facture]]="";"";-SOMME(SUIVI_DES_FACTURES[@[TVA 5,5]:[TVA 20]];-[@[Montant TTC]]))
VTextBox20=SI([@[Raison sociale]]="";"";RECHERCHEV([@[Raison sociale]];CLIENTS_PLAGE_CLIENTS;2;FAUX))
WTextBox21=SI([@[Raison sociale]]="";"";RECHERCHEV([@[Raison sociale]];CLIENTS_PLAGE_CLIENTS;3;FAUX))
XTextBox22=SI([@[Raison sociale]]="";"";RECHERCHEV([@[Raison sociale]];CLIENTS_PLAGE_CLIENTS;4;FAUX))

merci

cordialement

Laurent
 

Dranreb

XLDnaute Barbatruc
Re : Code Userform erronné / Dranreb

Normalement ils sont gardés après validation.
C'est quand on demande à effacer ou qu'on tape de l'inexistant dans les ComboBox que tout est effacé.
Si ce n'est pas le comportement souhaité, soumettez à des conditions l'exécution de GarnirChamps dans la CL_Change
Rappel:
Complet And NbrLgn = 0 : Il y a de l'inexistant tapé dans une ComboBox.
Not Complet And NbrLgn = 0 : Rien n'est entré dans aucune.
Complet And NbrLgn = 1: Une correspondance a été trouvée et CL_BingoUn va être exécuté.
Not Complet And NbrLgn > 1 : Plusieurs lignes correspondent à une seule ComboBox renseignée.

S'il y a des formules dispersées à garder c'est un peu ennuyeux. Il faudrait en montrer les valeurs dans des Label, non dans des TextBox, puisque l'opérateur ne doit pas les changer si ce sont des formules. Soit on les réinstalle après avoir fait CL.PlgTablo.Rows(LCou).Resize(, 24).Value = VLgn, soit on n'utilise plus du tout VLgn dans la BtnValider_Click et on écrit au lieu de ça directement les valeur de contrôles dans les cellules CL.PlgTablo(LCou, c) qui ne portent pas de formule. C'est un peu plus long à exécuter mais ça ne se verra sans doute pas. Si ça vous embête d'écrire 36 fois CL.PlgTablo(LCou vous pouver déclarer une Rg As Range, Faire Set Rg = CL.PlgTablo.Rows(LCou) puis faire des Rg.Columns(3).Value = CDate(TextBox1.Text) etc.
Pour voir l'état réel après mise à jour refaire tout de suite derrière VLgn = CL.PlgTablo.Rows(LCou).Resize(, 24).Value (ou Rg.Resize(, 24).Value) puis GarnirChamps.

Attention à respecter les natures de données: les TextBox ne fournissent que des textes. Il faut en principe utiliser CDbl pour les convertir en nombre, CCur en devise, CDate en date.
 
Dernière édition:

Le_Troll_Du_27

XLDnaute Occasionnel
Re : Code Userform erronné / Dranreb

bonjour le forum, le fil, dranreb

Dsl je n'ai pas trop saisi
J'ai vraiment du mal avec cette source
De plus ma mémoire me joue des tours, alors pas évident de suivre


Je te joins mon fichier

Amicalement
Laurent
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Code Userform erronné / Dranreb

Bonjour.

J'ai découvert avec stupeur hier soir, qu'on ne pouvait pas insérer de ligne dans un tableau, qu'il fallait obligatoirement écrire en dessous. Et comme on pouvait s'y attendre ils n'ont pas veillé à ce que si on a affecté par un Set la plage à une variable As Range elle soit rectifiée automatiquement. Ça vas nous obliger à la respécifier au CL.Actualiser (sauf dans la version de ComboBoxLiées évoquée plus loin)

Qu'est ce que vous n'avez pas compris ? (j'ai dit beaucoup de choses, je ne vais pas tout répéter)

Pourquoi y a-t-il dans la base des infos qui peuvent être reconstituées par calcul ? (Que ce soit par formule ou autrement) et pourquoi font elles l'objet de TextBox, modifiables ?

Information: J'ai en chantier une version de ComboBoxLiées qui tient compte des tableaux Excel. Ça complique tout, plus qu'autre chose ! (mais seulement à l'intérieur essentiellement). Je l'ai déjà depuis quelques temps. J'y avais déjà prévu une méthode pour demander l'écriture des valeurs de ComboBox dans un tableau VBA d'une ligne sans être obligé d'écrire soi même la petite boucle un peu mystérieuse, ayant chez vous pour commentaire " ' Écrire les Text des ComboBox". Vu la nécessité prévisible, dans certains cas, pour épargner des formules non groupées dans les premières ni dans les dernières colonnes, d'écrire, entre les formules, directement dans certaines cellules seulement, j'y ai ajouté hier soir une méthode ÉcrireValeurs qui les écrit aussi directement dans les cellules d'une ligne de numéro spécifié.

Si vous décidez de tout reprendre à zéro, comme j'ai vu que vous l'aviez envisagé un moment, je vous conseille d'en profiter pour donner des noms mnémoniques aux TextBox. TBxDateFact au lieu de TextBox1 par exemple. On s'en sort beaucoup plus facilement par la suite, si, si. Et LabDateÉch au lieu de TextBox2, Il vaudrait mieux que ce soit un Label et vous sauriez que son Caption n'est pas à écrire parce que c'est une formule (si toutefois vous décidez de garder quand même celles ci, sachant que le calcul pourrait être fait dans l'UserForm, au GarnirChamps par exemple)
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 105
dernier inscrit
Joffrette