Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
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
 

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é
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 @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

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

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 ?
 

Orson83

XLDnaute Impliqué
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)


Pour le format personnalisé: "FA2023"0000

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é
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
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…