XL 2010 Numéro de facture adaptable selon l'année en VBA

Orson83

XLDnaute Impliqué
Bonjour le forum,
Mon niveau déplorable en VBA ne me permet pas d'aboutir. Avec votre aide, j'aimerai construire un numéro de facture qui s'adapte selon l'année en cours.
Exemple : si année 2023, alors FA2023-001, si année 2024, alors FA2024-001, etc., soit, PREFIXEAAAA-SUFFIXE
Dans mon fichier joint, il y a une macro qui fonctionne, mais qui ne me permet pas d'obtenir le résultat souhaité. J'ai essayé d'adapter avec des bouts de code, mais non o_O
Précisions :
- Un système de compteur est présent dans le gestionnaire de noms "Fact_", il me permettra de corriger une erreur éventuelle avant de remettre une facture au client.
- Le compteur est là uniquement pour corriger une erreur technique (humaine) et non comptable
Je joins un fichier test dans ce post. Merci pour votre aide.
Orson83
 

Pièces jointes

  • Num facture V1.xlsm
    72.9 KB · Affichages: 17
Dernière édition:

vgendron

XLDnaute Barbatruc
Hello

sans toucher à la fonction Nouveau_Num , avec ca
VB:
Sub Archiver() 'Archive dans la feuille historique factures
Sheets("Facture modèle").Unprotect
Dim ligne As Long
If Range("J5") = "" Then
    [J6] = "Renseigner nom du client"
    Exit Sub      ' Pas de client, on sort
    'L'annotation en J6 ne s'efface pas
Else
    [J6] = "" 'L'annotation en J6 ne s'efface pas
End If
    nFact = Nouveau_NUM("FACT_") 'Compteur Fact_ dans le gestionnaire de nom
    'Sheets("Facture modèle").Unprotect
    Sheets("Facture modèle").[G3] = "FA" & Format(Now, "yyyy") & "-" & Format(nFact, "00")

With Sheets("Historique factures")
    ligne = .Cells(Rows.Count, "B").End(xlUp).Row + 1
    .Range("B" & ligne).Value = Sheets("Facture modèle").Range("G3").Value 'Num. facture
    .Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value 'Date émission
    .Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value 'Num. client

End With 'Récupère facture pour l'historique
'With Sheets("Facture modèle")
'    .Range("J5").ClearContents
'    If .Range("G3") Like "*-*" Then
'        NumFact = Split(.Range("G3"), "-")(1)
'    Else
'        NumFact = 0
'    End If
'
'    .Range("G3").Value = "FA" & Format(Year(Now), "yyyy") & "-" & NumFact + 1
'    'Sheets("Facture modèle").Range("G3").Value = Sheets("Facture modèle").Range("G3").Value + 1 'Ajoute +1 en G3 après archivage
    Sheets("Facture modèle").Protect
'End With
End Sub
 

Orson83

XLDnaute Impliqué
Hello

sans toucher à la fonction Nouveau_Num , avec ca
VB:
Sub Archiver() 'Archive dans la feuille historique factures
Sheets("Facture modèle").Unprotect
Dim ligne As Long
If Range("J5") = "" Then
    [J6] = "Renseigner nom du client"
    Exit Sub      ' Pas de client, on sort
    'L'annotation en J6 ne s'efface pas
Else
    [J6] = "" 'L'annotation en J6 ne s'efface pas
End If
    nFact = Nouveau_NUM("FACT_") 'Compteur Fact_ dans le gestionnaire de nom
    'Sheets("Facture modèle").Unprotect
    Sheets("Facture modèle").[G3] = "FA" & Format(Now, "yyyy") & "-" & Format(nFact, "00")

With Sheets("Historique factures")
    ligne = .Cells(Rows.Count, "B").End(xlUp).Row + 1
    .Range("B" & ligne).Value = Sheets("Facture modèle").Range("G3").Value 'Num. facture
    .Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value 'Date émission
    .Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value 'Num. client

End With 'Récupère facture pour l'historique
'With Sheets("Facture modèle")
'    .Range("J5").ClearContents
'    If .Range("G3") Like "*-*" Then
'        NumFact = Split(.Range("G3"), "-")(1)
'    Else
'        NumFact = 0
'    End If
'
'    .Range("G3").Value = "FA" & Format(Year(Now), "yyyy") & "-" & NumFact + 1
'    'Sheets("Facture modèle").Range("G3").Value = Sheets("Facture modèle").Range("G3").Value + 1 'Ajoute +1 en G3 après archivage
    Sheets("Facture modèle").Protect
'End With
End Sub
Le fil,
@vgendron,
Merci pour cette proposition.
De votre côté, avez-vous testé cette macro dans un classeur Excel ?
Chez moi, rien ne se passe. Je l'ai copiée dans un module, puis dans la feuille Facture modèle, j'ai fait des retouches, etc., mais rien à faire.
J'ai un blocage ici :
VB:
 nFact = Nouveau_NUM("FACT_") 'Compteur Fact_ dans le gestionnaire de nom

Est-il possible de supprimer tout ce qui ne sert à rien ?
 

Phil69970

XLDnaute Barbatruc
Bonjour @Orson83 et Vincent

j'aimerai construire un numéro de facture qui s'adapte selon l'année en cours.

Pourtant tout était fait ici


Mais c'est pas la solution que tu as retenu mais l'avais tu essayé ?
Car tu aurais vu que le mois et l'année se gère automatiquement

Et de plus tout le code est commenté .... ;)
 

Orson83

XLDnaute Impliqué
Bonjour @Orson83 et Vincent



Pourtant tout était fait ici


Mais c'est pas la solution que tu as retenu mais l'avais tu essayé ?
Car tu aurais vu que le mois et l'année se gère automatiquement
Le fil,
Bonsoir @Phil69970,
Non, j'avais retenu la proposition de @Staple1600 au post#9. Il avait beaucoup travaillé dessus et il me semblait que c'était normal.
Finalement, j'ai juste voulu optimiser sa macro pour intégrer la mise à jour de l'année dans le numéro de facture.
Je crois que je me suis lancé dans une aventure qui me dépasse (je me demande si c'est une bonne idée).
Toujours est-il que je suis bloqué.
 

Orson83

XLDnaute Impliqué
Le fil,
Bonsoir @Phil69970,
Non, j'avais retenu la proposition de @Staple1600 au post#9. Il avait beaucoup travaillé dessus et il me semblait que c'était normal.
Finalement, j'ai juste voulu optimiser sa macro pour intégrer la mise à jour de l'année dans le numéro de facture.
Je crois que je me suis lancé dans une aventure qui me dépasse (je me demande si c'est une bonne idée).
Toujours est-il que je suis bloqué.
Je vais essayer avec le code qui récupère les infos à insérer dans la feuille "Historique factures" et ta macro.
Voilà le code de ma feuille "Facture modèle" qui est totalement en vrac :
VB:
Private Sub CommandButton2_Click() 'Archiver les factures
'Doit récupérer les cellules de la Facture modèle pour les intégrer dans la feuille Historique factures
Dim ligne As Long
nFact = Nouveau_NUM("FACT_")
'Sheets("Facture modèle").Unprotect
Sheets("Facture modèle").[G3] = nFact
With Sheets("Historique factures")
ligne = .Cells(Rows.Count, "B").End(xlUp).Row + 1
.Range("B" & ligne).Value = Sheets("Facture modèle").Range("G3").Value 'Num. facture
.Range("C" & ligne).Value = Sheets("Facture modèle").Range("F48").Value 'Date émission
.Range("D" & ligne).Value = Sheets("Facture modèle").Range("F10").Value 'Num. client

.Range("E" & ligne).Value = Sheets("Facture modèle").Range("F5").Value 'Nom Prénom client
.Range("F" & ligne).Value = Sheets("Facture modèle").Range("F6").Value 'Adresse
.Range("G" & ligne).Value = Sheets("Facture modèle").Range("F8").Value 'CP & Ville

.Range("H" & ligne).Value = Sheets("Facture modèle").Range("E13").Value 'Libellé 1
.Range("I" & ligne).Value = Sheets("Facture modèle").Range("E14").Value 'Libellé 2
.Range("J" & ligne).Value = Sheets("Facture modèle").Range("E15").Value 'Libellé 3

.Range("K" & ligne).Value = Sheets("Facture modèle").Range("G37").Value 'Total HT
.Range("L" & ligne).Value = Sheets("Facture modèle").Range("G38").Value 'Total TVA
.Range("M" & ligne).Value = Sheets("Facture modèle").Range("G39").Value 'Total TTC

End With 'Récupère facture pour l'historique
Sheets("Facture modèle").Range("J5").ClearContents
Sheets("Facture modèle").Range("G3").Value = Sheets("Facture modèle").Range("G3").Value + 1
'Sheets("Facture modèle").Protect
End Sub

Sub NumFact()
Dim NumFact$, DebNumFact$

DebNumFact = "F" & Format(Date, "yyyy-mm-")                                 'Exemple ==> F2023-06-    Année 2023 Mois 06 ==> Facture
NumFact = Sheets("Facture modèle").[M1]                                     'Feuille et Cellule ou est stockée le dernier N° de facture à adapter

If Left(NumFact, 9) = DebNumFact$ Then
   NumFact = DebNumFact & Format(Val(Right(NumFact, 2) + 1), "00")          'limité à 100 factures/mois (Modifiable si besoin)
Else
   NumFact = CStr(DebNumFact & "01")                                        'limité à 100 factures/mois (Modifiable si besoin)
End If
Sheets("Facture modèle").[M1] = NumFact                                     'Feuille et Cellule ou est stockée le dernier N° de facture
Sheets("Facture modèle").[G3] = NumFact

Tout ça fonctionne avec un bouton ActiveX.
Je poste un nouveau fichier V2, mais tout est complètement désorganisé.
 

Pièces jointes

  • Num facture V2.xlsm
    72.3 KB · Affichages: 5
Dernière édition:

Orson83

XLDnaute Impliqué
Re

Je te propose ce fichier

J'ai rajouté un message si tu n'as pas mis le nom du client car pas de client pas besoin de facture !!! ;)
Bonjour le fil,
Bonjour @Phil69970,
Très belle proposition que je vais conserver 👍 pour les raisons suivantes :
Macro compréhensible, format flexible et correction du N° accessible directement dans la page, bravo !

Cependant, je rencontre un petit souci à la modification du numéro. En effet, il semblerait que la macro mémorise le dernier N° et fasse un blocage en cas de modification.
Il s'agit de l'avant-dernière ligne : Sheets("Facture modèle").[G3] = NumFact

Autre petit souci, la largeur de ma cellule m'oblige à réduire la taille du numéro à 8 caractères maximum : F236-001 (FAAM-N°)

Pour finir, après avoir cliqué sur le bouton, le numéro affiché devrait être à +1 pour la facture à venir (ex : en M1, dernier N° = FA236-001 et en G3, prochain N° = FA236-002

Désolé de te solliciter à nouveau :(
 

Phil69970

XLDnaute Barbatruc
Re

@Orson83
Cependant, je rencontre un petit souci à la modification du numéro. En effet, il semblerait que la macro mémorise le dernier N° et fasse un blocage en cas de modification.

Pas du tout si tu veux modifier le N° tu peux le faire mais il faut le faire comme je l'ai prévu.

Tout d'abord que fait ma macro :

1) Elle prend la date du jour exemple 29/06/2023

2) Elle mémorise l'année et le mois et ajoute un F donc F-2023-06 qui est le début de numéro de la facture

3) On regarde si un N° de facture existe déjà cellule M1 si un numéro de facture existe cellule M1 (pour rappel le N° complet est de la forme (F-2023-06-XX) ou XX est le numéro qui s’incrémente de la facture pour un même mois et une même année) on récupère les 2 derniers numéro de la facture donc XX et on l’incrémente de 1 donc 24 deviendra 25 par exemple etc

4) Si tu veux passer du numéro 4 au numéro 76 par exemple
1688040361841.png

Et bien du met le numéro 75 pourquoi 75 et pas 76 directement et bien comme il regarde le dernier numéro auquel il rajoute 1==> 75+1 =76
En clair en M1 est stocké le dernier numéro de facture et pas le prochain

1688040211051.png


Et cela te donnera donc ceci
1688156252173.png


5) Si le mois change on repart à 01 donc le 1er juillet le N° deviendra F-2023-07-01

Exemple j'ai modifié la date système de mon PC pour obtenir ceci
1688156336842.png


Autre petit souci, la largeur de ma cellule m'oblige à réduire la taille du numéro à 8 caractères maximum : F236-001 (FAAM-N°)

Plusieurs remarques à cette question
1) Poses toi les bonnes questions combien auras tu de factures à faire par mois au maximum ?
10 par mois -100 par mois-1 000 par mois-10 000 par mois encore plus .....( c'est Amazon !)

2) Je ne comprends pas le numéro de facture que tu veux car pour moi F236-001 n'est pas parlant pour moi

3) Elargie la colonne si tous les numéros ne rentrent pas ou diminue la police


Pour finir, après avoir cliqué sur le bouton, le numéro affiché devrait être à +1

Et non la macro n'a pas été conçu comme cela mais relire le début de ce post .....
 
Dernière édition:

Orson83

XLDnaute Impliqué
Re

@Orson83


Pas du tout si tu veux modifier le N° tu peux le faire mais il faut le faire comme je l'ai prévu.

Tout d'abord que fait ma macro :

1) Elle prend la date du jour exemple 29/06/2023

2) Elle mémorise l'année et le mois et ajoute un F donc F-2023-06 qui est le début de numéro de la facture

3) On regarde si un N° de facture existe déjà cellule M1 si un numéro de facture existe cellule M1 (pour rappel le N° complet est de la forme (F-2023-06-XX) ou XX est le numéro qui s’incrémente de la facture pour un même mois et une même année) on récupère les 2 derniers numéro de la facture donc XX et on l’incrémente de 1 donc 24 deviendra 25 par exemple etc

4) Si tu veux passer du numéro 4 au numéro 76 par exemple
Regarde la pièce jointe 1173651
Et bien du met le numéro 75 pourquoi 75 et pas 76 directement et bien comme il regarde le dernier numéro auquel il rajoute 1==> 75+1 =76
En clair en M1 est stocké le dernier numéro de facture et pas le prochain

Regarde la pièce jointe 1173650

Et cela te donnera donc ceci
Regarde la pièce jointe 1173654

5) Si le mois change on repart à 01 donc le 1er juillet le N° deviendra F-2023-07-01

Exemple j'ai modifié la date système de mon PC pour obtenir ceci
Regarde la pièce jointe 1173655



Plusieurs remarques à cette question
1) Poses toi les bonnes questions combien auras tu de factures à faire par mois au maximum ?
10 par mois -100 par mois-1 000 par mois-10 000 par mois encore plus .....( c'est Amazon !)

2) Je ne comprends pas le numéro de facture que tu veux car pour moi F236-001 n'est pas parlant pour moi

3) Elargie la colonne si tous les numéros ne rentrent pas ou diminue la police




Et non la macro n'a pas été conçu comme cela mais relire le début de ce post .....
Le fil,
@Phil69970,
Ces explications sont très claires, merci.
J'ai pu débloquer la situation en retouchant légèrement la macro à cause de petites modifs pour reformater le numéro qui sera FA2306-001👍
Un grand merci pour ton travail et le temps passé, j'ai désormais un classeur qui fonctionne au Top !
Bonne soirée et à bientôt ;)
Orson83
 

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 860
Messages
2 092 961
Membres
105 571
dernier inscrit
MAT30190