XL 2010 Historique factures et incrémentation numéro croissant

Orson83

XLDnaute Impliqué
Bonjour la communauté,
J'ai une macro qui est censée sauvegarder l'historique des factures dans une feuille dédiée et incrémenter un numéro de facture croissant. Le problème, c'est qu'elle ne fonctionne pas :oops:
Merci pour votre aide.
Je joins un fichier exemple dans ce post.
Orson83
 

Pièces jointes

  • Num facture V1.xlsm
    68.2 KB · Affichages: 12
Solution
Re

@Orson83
De ce je comprends le code VBA de ton classeur, ligne est une variable qui permet d'identifier sur quelle ligne on doit recopier les données issues de la feuille Facture modèle
Le problème quand on utilise xlDown, c'est que si la colonne est vide, on arrive tout en bas de la feuille.

Pour la numérotation, que penses-tu de mon exemple ?
(On peut l'associer au bouton nouvelle facture)

Donc en mixant les deux codes, voila ce que j'obtiens
VB:
Sub Archiver_TER()
Dim ligne As Long
nFact = Nouveau_NUM("FACT_")
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
.Range("C"...

Staple1600

XLDnaute Barbatruc
Bonsoir @Orson83, @TooFatBoy , le fil

Avec ce test, on s'aperçoit que ligne vaut 1 048 477
(ce qui dépasse le nombre de ligne d'une feuille Excel)
VB:
Sub Archiver()
Dim ligne As Long
ligne = Sheets("Historique factures").Range("B6").End(xlDown).Row + 1
MsgBox ligne ' pour test
'Sheets("Historique factures").Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value
'Sheets("Historique factures").Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value
'Sheets("Facture modèle").Range("J5").ClearContents
End Sub
D'habitude on part verts la fin de la feuille
Avec ce type de syntaxe
Code:
Sub Archiver_BIS()
Dim ligne As Long
ligne = Sheets("Historique factures").Cells(Rows.Count, "B").End(xlUp).Row + 1
MsgBox ligne ' pour test
MsgBox Cells(ligne, "B").Address
'Sheets("Historique factures").Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value
'Sheets("Historique factures").Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value
'Sheets("Facture modèle").Range("J5").ClearContents
End Sub
Ici le résultat est B3 qui est bien la 1ere cellule vide en colonne B de la feuille Historique.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

Ce qui donne donc dans le contexte
Code:
Sub Archiver_OK()
Dim ligne As Long
ligne = Sheets("Historique factures").Cells(Rows.Count, "B").End(xlUp).Row + 1
Sheets("Historique factures").Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value
Sheets("Historique factures").Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value
Sheets("Facture modèle").Range("J5").ClearContents
End Sub
Résultat obtenu ci-dessous
t
FactCapture.PNG
 

Staple1600

XLDnaute Barbatruc
Re,

@Orson83
Pour ce qui est de l'incrémentation du numéro de facture
(on peut utiliser un nom, visible ou pas)
• Petit exemple ci-dessous (a tester sur un classeur vierge)
Code:
Sub test_NUMERO()
nFact = Nouveau_NUM("FACT_")
MsgBox nFact
[A1] = nFact
End Sub

Private Function Nouveau_NUM(NumFact) As String
    Dim n As Name, v
    On Error Resume Next
    Set n = ThisWorkbook.Names(NumFact)
    On Error GoTo 0
    If n Is Nothing Then
    ThisWorkbook.Names.Add NumFact, RefersTo:=2
        v = 1
    Else
        v = Replace(n.RefersTo, "=", "")
        n.RefersTo = v + 1
    End If
    Nouveau_NUM = v
End Function
NB: Pour le numéro, appuyer sur CTRL+F3
 

Orson83

XLDnaute Impliqué
Re

Ce qui donne donc dans le contexte
Code:
Sub Archiver_OK()
Dim ligne As Long
ligne = Sheets("Historique factures").Cells(Rows.Count, "B").End(xlUp).Row + 1
Sheets("Historique factures").Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value
Sheets("Historique factures").Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value
Sheets("Facture modèle").Range("J5").ClearContents
End Sub
Résultat obtenu ci-dessous
tRegarde la pièce jointe 1173041
Bonsoir @Staple1600, @TFB, le forum,
Merci pour cette proposition qui fonctionne parfaitement 👍
Je souhaite t'envoyer un MP, mais je n'y parviens pas.
Peux-tu m'en envoyer un pour que j'y réponde ?
 

Orson83

XLDnaute Impliqué
Re,

@Orson83
Pour ce qui est de l'incrémentation du numéro de facture
(on peut utiliser un nom, visible ou pas)
• Petit exemple ci-dessous (a tester sur un classeur vierge)
Code:
Sub test_NUMERO()
nFact = Nouveau_NUM("FACT_")
MsgBox nFact
[A1] = nFact
End Sub

Private Function Nouveau_NUM(NumFact) As String
    Dim n As Name, v
    On Error Resume Next
    Set n = ThisWorkbook.Names(NumFact)
    On Error GoTo 0
    If n Is Nothing Then
    ThisWorkbook.Names.Add NumFact, RefersTo:=2
        v = 1
    Else
        v = Replace(n.RefersTo, "=", "")
        n.RefersTo = v + 1
    End If
    Nouveau_NUM = v
End Function
NB: Pour le numéro, appuyer sur CTRL+F3
Re @Staple1600,
Cette proposition me semble intéressante, merci.
Dans la précédente macro que tu as modifiée ...
VB:
Sub Archiver_OK()
Dim ligne As Long
ligne = Sheets("Historique factures").Cells(Rows.Count, "B").End(xlUp).Row + 1
Sheets("Historique factures").Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value
Sheets("Historique factures").Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value
Sheets("Facture modèle").Range("J5").ClearContents
End Sub
la ligne :
Code:
ligne = Sheets("Historique factures").Cells(Rows.Count, "B").End(xlUp).Row + 1
... devait incrémenter un numéro de facture croissant dans la feuille "Historique factures", colonne B.
Je trouvai que c'était assez simple de pouvoir générer un numéro et effacer la facture simplement en cliquant sur le bouton.
Qu'en penses-tu ?
 

Staple1600

XLDnaute Barbatruc
Re

@Orson83
De ce je comprends le code VBA de ton classeur, ligne est une variable qui permet d'identifier sur quelle ligne on doit recopier les données issues de la feuille Facture modèle
Le problème quand on utilise xlDown, c'est que si la colonne est vide, on arrive tout en bas de la feuille.

Pour la numérotation, que penses-tu de mon exemple ?
(On peut l'associer au bouton nouvelle facture)

Donc en mixant les deux codes, voila ce que j'obtiens
VB:
Sub Archiver_TER()
Dim ligne As Long
nFact = Nouveau_NUM("FACT_")
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
.Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value
.Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value
End With
Sheets("Facture modèle").Range("J5").ClearContents
End Sub
Private Function Nouveau_NUM(NumFact) As String
    Dim n As Name, v
    On Error Resume Next
    Set n = ThisWorkbook.Names(NumFact)
    On Error GoTo 0
    If n Is Nothing Then
    ThisWorkbook.Names.Add NumFact, RefersTo:=2
        v = 1
    Else
        v = Replace(n.RefersTo, "=", "")
        n.RefersTo = v + 1
    End If
    Nouveau_NUM = v
End Function
Résultat après avoir cliquer trois fois sur le bouton Nouvelle Facture et Archiver
Fact2Capture.PNG

PS: J'ai appliqué sur le format personnalisé: 00000 en G3 (feuille modèle) et colonne B (feuille Historique)
 

Orson83

XLDnaute Impliqué
Re

@Orson83
De ce je comprends le code VBA de ton classeur, ligne est une variable qui permet d'identifier sur quelle ligne on doit recopier les données issues de la feuille Facture modèle
Le problème quand on utilise xlDown, c'est que si la colonne est vide, on arrive tout en bas de la feuille.

Pour la numérotation, que penses-tu de mon exemple ?
(On peut l'associer au bouton nouvelle facture)

Donc en mixant les deux codes, voila ce que j'obtiens
VB:
Sub Archiver_TER()
Dim ligne As Long
nFact = Nouveau_NUM("FACT_")
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
.Range("C" & ligne).Value = Sheets("Facture modèle").Range("F49").Value
.Range("D" & ligne).Value = Sheets("Facture modèle").Range("F5").Value
End With
Sheets("Facture modèle").Range("J5").ClearContents
End Sub
Private Function Nouveau_NUM(NumFact) As String
    Dim n As Name, v
    On Error Resume Next
    Set n = ThisWorkbook.Names(NumFact)
    On Error GoTo 0
    If n Is Nothing Then
    ThisWorkbook.Names.Add NumFact, RefersTo:=2
        v = 1
    Else
        v = Replace(n.RefersTo, "=", "")
        n.RefersTo = v + 1
    End If
    Nouveau_NUM = v
End Function
Résultat après avoir cliquer trois fois sur le bouton Nouvelle Facture et Archiver
Regarde la pièce jointe 1173052

PS: J'ai appliqué sur le format personnalisé: 00000 en G3 (feuille modèle) et colonne B (feuille Historique)
Super proposition 👍 Merci.
Effectivement, cette macro combine le 2 éléments en cliquant sur un seul bouton, bravo !
De mon côté, dans la colonne B, l'en-tête "Numéro de facture" me donne 1, 2, 3, etc.
Serait-il possible que je récupère un numéro du style : FA2023-01, FA2023-02, etc. ? ...
... en ajoutant le préfixe "FA2023-" en dur et les numéros croissants 01, 02, 03, etc.

Suite à mes essais, je ne parviens plus à revenir au chiffre 1 ou 01 du coup.
Comment je pourrais remettre le compteur à zéro ?
 

Orson83

XLDnaute Impliqué
Super proposition 👍 Merci.
Effectivement, cette macro combine le 2 éléments en cliquant sur un seul bouton, bravo !
De mon côté, dans la colonne B, l'en-tête "Numéro de facture" me donne 1, 2, 3, etc.
Serait-il possible que je récupère un numéro du style : FA2023-01, FA2023-02, etc. ? ...
... en ajoutant le préfixe "FA2023-" en dur et les numéros croissants 01, 02, 03, etc.

Suite à mes essais, je ne parviens plus à revenir au chiffre 1 ou 01 du coup.
Comment je pourrais remettre le compteur à zéro ?
Oups ! avec un format personnalisé le préfixe ?
 

Staple1600

XLDnaute Barbatruc
Re, Bonjour @laurent950

@Orson83
Pour revenir à zéro, on peut supprimer le nom
(Faire CTRL+F3)
NomSans titre.png


Pour le format personnalisé: "FA2023"0000
FormatCapture.PNG

EDITION: ou pour mieux coller à ton souhait
"FA2023-"00

NB: Mais normalement à cause du caractère d'unicité du N° de facture, on ne devrait pas pouvoir revenir en arrière.
Une fois que la première facture est créée pour l'année en cours, on ne devrait qu'incrémenter le numéro, non ?
 

Orson83

XLDnaute Impliqué
Re, Bonjour @laurent950

@Orson83
Pour revenir à zéro, on peut supprimer le nom
(Faire CTRL+F3)
Regarde la pièce jointe 1173061

Pour le format personnalisé: "FA2023"0000
Regarde la pièce jointe 1173060
EDITION: ou pour mieux coller à ton souhait
"FA2023-"00

NB: Mais normalement à cause du caractère d'unicité du N° de facture, on ne devrait pas pouvoir revenir en arrière.
Une fois que la première facture est créée pour l'année en cours, on ne devrait qu'incrémenter le numéro, non ?
Merci @Staple1600,
Merci pour ta réponse de format personnalisé 👍
Effectivement, on ne devrait pas revenir en arrière, mais comme j'ai fait des tests, cela me permettra de revenir à zéro en mode réel.
Je vais refaire un point complet et je reviendrai vers toi 😉
 

Statistiques des forums

Discussions
315 094
Messages
2 116 154
Membres
112 670
dernier inscrit
Flow87