XL 2016 mise à jour automatique de la numérotation

halecs93

XLDnaute Impliqué
(re)bonjour,

Je reviens vers vous car je n'arrive pas à faire en sorte que la numérotation (en colonne A) se mette à jour en fonction des données que j'entre par Userform. En effet, si j'indique une date située entre deux dates déjà définies, mon tableau se met bien dans l'ordre chronologique des dates mais la numérotation ne suit pas.

Help ?

Grand merci
 

Pièces jointes

  • SUIVI COMPTA v3.xlsm
    75.1 KB · Affichages: 8

fanch55

XLDnaute Barbatruc
Bonjour du Terre-fort,
Le numéro suit bien la logique .
Vous ne pouvez pas avoir un tri sur la date et sur le n° d'ordre en même temps .

Tel que c'est conçu, la nouvelle saisie peut prendre un n° existant ...
Imaginez que vous supprimez la ligne 3,
si vous donnez le nombre de lignes existantes + 1 à votre numéro d'ordre pour une nouvelle saisie,
vous allez avoir les 2 dernières lignes avec le même n° d'ordre .

Vous pouvez contourner le pb en altérant le code de l'userform dans la CommandButton1_Click :
[Tableau1].Item(derniereLigne, 1) = Application.Max([Tableau1[N°]]) + 1

mais cela n'empêchera pas votre table d'être présentée
selon l'ordre de tri (colonne B = date ) qui suit dans le code:
ws.Range("B4:K" & derniereLigne).Sort key1:=ws.Range("B4"), _
order1:=xlAscending, Header:=xlYes


Personnellement, pour être plus "rigoureux" ,
j'aurai fait un n° d'ordre du type Stamp (Timbre chronologique) .
La clé serait du genre 202302101340-1 ( première saisie le 10 Février 2023 à 13:40 )
 

fanch55

XLDnaute Barbatruc
Comme je vois que vous utilisez une table structurée,
je vous ai "simplifié" le code avec la modification suggérée :
VB:
Private Sub CommandButton1_Click()
Dim Idx     As Integer
Dim Cell    As Range
Dim Lob     As ListObject
    
    If Not IsDate(Me.TextBox1.Value) Then
        MsgBox "Veuillez entrer une date valide"
        Exit Sub
    End If
    
    Set Lob = Range("Tableau1").ListObject
    
    Lob.Parent.Unprotect ' Déprotéger la feuille
    
        Idx = Lob.ListRows.Add().Index
        Range(Lob & "[N°]").Rows(Idx) = Application.Max([Tableau1[N°]]) + 1
        Range(Lob & "[Date]").Rows(Idx) = CDate(Me.TextBox1.Value)
        Range(Lob & "[Fournisseur]").Rows(Idx) = Me.TextBox2.Value
        Range(Lob & "[Quoi]").Rows(Idx) = Me.TextBox3.Value
        Range(Lob & "[Qui]").Rows(Idx) = Me.ComboBox1.Value
        Range(Lob & "[Compte]").Rows(Idx) = Me.ComboBox2.Value
        Range(Lob & "[Somme]").Rows(Idx) = Me.TextBox4.Value
        Range(Lob & "[Facture]").Rows(Idx) = Me.ComboBox3.Value
        Range(Lob & "[[Mode" & vbLf & "Paiement]]").Rows(Idx) = Me.ComboBox4.Value
        Range(Lob & "[[Ch / Cb / Esp.]]").Rows(Idx) = Me.ComboBox5.Value
        Range(Lob & "[Observations]").Rows(Idx) = Me.TextBox5.Value
    
        Lob.Range.Sort key1:=Range(Lob & "[Date]"), order1:=xlAscending, Header:=xlYes
        Set Cell = Range(Lob & "[N°]").Find(Application.Max(Range(Lob & "[N°]")), , xlValues, xlWhole)
            If Not Cell Is Nothing _
            Then Lob.Range.Rows(1 + (Cell.Row - Lob.Range.Row)).Select
        Set Cell = Nothing
        
    Lob.Parent.Protect UserInterfaceOnly:=True ' Protéger la feuille à nouveau
    Unload Me
End Sub
 
Dernière édition:

halecs93

XLDnaute Impliqué
Bonjour du Terre-fort,
Le numéro suit bien la logique .
Vous ne pouvez pas avoir un tri sur la date et sur le n° d'ordre en même temps .

Tel que c'est conçu, la nouvelle saisie peut prendre un n° existant ...
Imaginez que vous supprimez la ligne 3,
si vous donnez le nombre de lignes existantes + 1 à votre numéro d'ordre pour une nouvelle saisie,
vous allez avoir les 2 dernières lignes avec le même n° d'ordre .

Vous pouvez contourner le pb en altérant le code de l'userform dans la CommandButton1_Click :
[Tableau1].Item(derniereLigne, 1) = Application.Max([Tableau1[N°]]) + 1

mais cela n'empêchera pas votre table d'être présentée
selon l'ordre de tri (colonne B = date ) qui suit dans le code:
ws.Range("B4:K" & derniereLigne).Sort key1:=ws.Range("B4"), _
order1:=xlAscending, Header:=xlYes


Personnellement, pour être plus "rigoureux" ,
j'aurai fait un n° d'ordre du type Stamp (Timbre chronologique) .
La clé serait du genre 202302101340-1 ( première saisie le 10 Février 2023 à 13:40 )
Logo apparent ;)
 

fanch55

XLDnaute Barbatruc
Merci, je pense en effet garder cette solution.
Numéroter séquentiellement des lignes susceptibles de changer constamment ne peut servir qu'à des fin de présentation, jamais pour des références comptables ni pour des études éventuelles de comparaison .

Mais si cela correspond à l'attendu,
vous pouvez rendre encore plus dynamique la formule en remplaçant le 3 par le n° de ligne de début de tableau ( ce qui vous permettra d'insérer éventuellement par la suite, des lignes avant ce tableau sans incidence sur les n°)
VB:
Sub Corrige()
    [Tableau1[N°]].ClearContents
    [Tableau1[N°]].FormulaLocal = "=LIGNE()-LIGNE(Tableau1[#En-têtes])"
End Sub
 

halecs93

XLDnaute Impliqué
Numéroter séquentiellement des lignes susceptibles de changer constamment ne peut servir qu'à des fin de présentation, jamais pour des références comptables ni pour des études éventuelles de comparaison .

Mais si cela correspond à l'attendu,
vous pouvez rendre encore plus dynamique la formule en remplaçant le 3 par le n° de ligne de début de tableau ( ce qui vous permettra d'insérer éventuellement par la suite, des lignes avant ce tableau sans incidence sur les n°)
VB:
Sub Corrige()
    [Tableau1[N°]].ClearContents
    [Tableau1[N°]].FormulaLocal = "=LIGNE()-LIGNE(Tableau1[#En-têtes])"
End Sub
Ha.... je vais essayer de comprendre tout ceci. Merci
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 319
Membres
103 177
dernier inscrit
grizly