• Initiateur de la discussion Initiateur de la discussion degap05
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

degap05

XLDnaute Impliqué
Bonjour,

Dans le classeur joint, j'envoie un format à une cellule : 2009-
Comment numéroter à côté du "-", en commençant par 2009-25 par exemple et en ajoutant 1.

Le code cité dans la macro fonctionne sans 2009-

Merci de votre aide.

J'ai posé une question similaire et j'ai eu une réponse de pierrejean, mais j'aimerais une solution plus simple.

Merci pour votre aide.
 

Pièces jointes

Re : Numérotation

Une solution que je serais tenté de faire est la suivante. Tu peux chnager A1 pour ce que tu veux. Si j'utilise ce genre de code je le met en A500 ou quelque chose du genre pour que ce ne soit pas visible.

Code:
Private Sub CommandButton1_Click()
Dim cellvalue As String
Dim derlig, num1 As Long
Dim C As Range, Plage As Range
cellvalue = Range("A1").Value + 1
[A1].Value = cellvalue
  Application.ScreenUpdating = True
With Sheets("Ordonnancier")
        derlig = .Range("G65500").End(xlUp).Row + 1
        .Cells(derlig, 7).Value = Year(Date) & "-" & Range("A1").Value
                
        
        'num1 = .Cells(derlig - 1, 7).value
        '.Cells(derlig, 7).value = num1 + 1
  End With
  
  
  End Sub

Si tu veux commencer avec 25, inscris 24 en A1 et ça additionnera 1 à chaque clique sur ton bouton.
 
Re : Numérotation

Bonjour le forum 🙂,
Si tu veux une solution très très simple, en passant par le format personnalisé "2009-"#, tu mets le nombre que tu veux dans la cellule (25 par exemple) et tu tires vers le bas ou vers la droite, et hop-la...
Fichier exemple joint.
Bonne journée 😎
 

Pièces jointes

Re : Numérotation

Bonjour le forum 🙂,
Si tu veux une solution très très simple, en passant par le format personnalisé "2009-"#, tu mets le nombre que tu veux dans la cellule (25 par exemple) et tu tires vers le bas ou vers la droite, et hop-la...
Fichier exemple joint.
Bonne journée 😎

Bonjour JNP,

C'est exactement ce que je fais actuellement. Mais connais-tu la solution pour que le changement d'année se fasse seul ? Ce fichier est destiné à être utilisé par plusieurs utilisateurs sans connaissance particulière, donc si je ne suis plus là ?

A+
 
Re : Numérotation

Une solution que je serais tenté de faire est la suivante. Tu peux chnager A1 pour ce que tu veux. Si j'utilise ce genre de code je le met en A500 ou quelque chose du genre pour que ce ne soit pas visible.

Code:
Private Sub CommandButton1_Click()
Dim cellvalue As String
Dim derlig, num1 As Long
Dim C As Range, Plage As Range
cellvalue = Range("A1").Value + 1
[A1].Value = cellvalue
  Application.ScreenUpdating = True
With Sheets("Ordonnancier")
        derlig = .Range("G65500").End(xlUp).Row + 1
        .Cells(derlig, 7).Value = Year(Date) & "-" & Range("A1").Value
                
        
        'num1 = .Cells(derlig - 1, 7).value
        '.Cells(derlig, 7).value = num1 + 1
  End With
  
  
  End Sub

Si tu veux commencer avec 25, inscris 24 en A1 et ça additionnera 1 à chaque clique sur ton bouton.

Bonjour kllmoon,

Ta solution est bien. Puisque tu récupères la valeur "A1", pourrais-tu récupérer la valeur de la cellule en colonne G, ligne -1 ?

A+
 
Re : Numérotation

Bonjour,

Peux-tu préciser la condition qui ferait qu'il faut passer de 2009 à 2010 ?
Tu donnes un exemple de 2009-25, donc ce ne peuvent être être des mois.

abcd

Bonjour abcd,

Il s'agit d'un ordonnancier qui enregistre les mouvements de médicaments. Le changement se fera au passage d'une nouvelle année. Le nombre de départ sera celui de l'ordonnancier "papier" actuel.
Au 31/12/2009, le nombre sera peut-être: 2009-25360 et le 01/01/2010, il sera: 2010-25361. C'est pour cela que le format de cellule personnalisé ne me semble pas adapté. En effet il faudrait que je change ce format "manuellement". Est-ce que je me trompe ?

A+
 
Re : Numérotation

Re

En A1 : la valeur de départ, par exemple 2009-25
En A2 : =ANNEE(AUJOURDHUI())&"-"&DROITE(A1;NBCAR(A1)-5)+1

En étirant cette formule vers le bas, elle s'incrémente tant pour l'année que pour le nombre à droite.
Cette formule peu-être nommée, par exemple "incrementation".
Un exemple en pièce jointe.

abcd
 

Pièces jointes

Re : Numérotation

Re

En A1 : la valeur de départ, par exemple 2009-25
En A2 : =ANNEE(AUJOURDHUI())&"-"&DROITE(A1;NBCAR(A1)-5)+1

En étirant cette formule vers le bas, elle s'incrémente tant pour l'année que pour le nombre à droite.
Cette formule peu-être nommée, par exemple "incrementation".
Un exemple en pièce jointe.

abcd

Merci abcd, même si je ne vois pas bien comment m'en servir avec ma macro qui envoi les données sur la ligne.
De plus j'évite les formules dans les cellules (la bande des "coupeur/colleur/effaceur" frappe souvent dans mon boulot...........)

A+
 
Re : Numérotation

Re 🙂
De plus j'évite les formules dans les cellules (la bande des "coupeur/colleur/effaceur" frappe souvent dans mon boulot...........)
Si tu en es là, café à l'arsenic pour tes collègues et tu n'aura plus besoin de te prendre la tête 😀!!!
Sinon, en admettant que ton compteur soit en colonne A (à adapter)
Code:
Cells(Range("A65536").End(xlUp).Row + 1, 1) = _
    Year(Now) & "-" & CInt(Right(Range("A65536").End(xlUp), _
    Len(Range("A65536").End(xlUp)) - 5) + 1)
Bonne journée 😎
 
Re : Numérotation

Bonjour,

ci-joint une variante :

Sub Test() 'Si la macro doit fontionner sur une feuille vierge
Set MaCell = ActiveSheet.Range("G65536").End(xlUp).Offset(1, 0)
If MaCell.Row = 2 Then
MaCell.Value = Year(Date) & "-25"
Else
MaCell.Value = Year(Date) & "-" & Split(MaCell.Offset(-1, 0), "-")(1) + 1
End If
End Sub

Sub Test2() 'La premiere cellule est saisie manuellement
With ActiveSheet.Range("G65536").End(xlUp).Offset(1, 0)
.Value = Year(Date) & "-" & Split(.Offset(-1, 0), "-")(1) + 1
End With
End Sub
 

Pièces jointes

Re : Numérotation

Bonjour à tous
J'arrive peut-être un peu tard, mais je livre malgré tout. D'abord, je comprends parfaitement degap05 :
(...) j'évite les formules dans les cellules (la bande des "coupeur/colleur/effaceur" frappe souvent dans mon boulot...........) (...)
Hélas !​
J'évite aussi les formules contenant Year(Now) qui ont la fâcheuse tendance à provoquer des catastrophes au moindre recalcul (l'année suivante par exemple). En outre, lorsqu'on utilise quelques dizaines de milliers de lignes, les formules alourdissent considérablement les classeurs, et ne favorisent pas la rapidité de réaction.
Je propose donc une solution programmée que j'ai essayé de rendre assez souple. Le code est en deux parties ; la première :
Code:
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim oRef As Range
    Set oRef = Range([COLOR="Sienna"][B]"$B$2"[/B][/COLOR]) [COLOR="SeaGreen"]'Référence de la première cellule pouvant contenir un n° d'ordre[/COLOR]
    If IsEmpty(Target.Cells(1, 1)) And Not Intersect(Range(Cells(oRef.Row, oRef.Column), Cells(Rows.Count, oRef.Column)), Target.Cells(1, 1)) Is Nothing Then
        Cancel = True
        Target.Cells(1, 1).Value = [COLOR="Sienna"][B]NOrdreContinu5[/B][/COLOR](oRef.Address, "" & Year(Now()) & "-")
    End If
End Sub
est à placer dans le module de feuille de la feuille à traiter. Dans l'exemple donné ici, les n° d'ordre seront engendrés dans la colonne B à partir de la deuxième ligne. Si l'on souhaite placer les n° d'ordre dans, par exemple, la colonne G à partir de la cinquième ligne, on remplacera "$B$2" par "$G$5". On peut évidemment placer un code similaire dans d'autres feuilles du classeur. Cette procédure appelle la deuxième partie du code, qui est une fonction :
Code:
Option Explicit

Function [COLOR="Sienna"][B]NOrdreContinu5[/B][/COLOR](oCel, oPat)
Dim oDat(), u As String, i As Long
    If VarType(Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell))) >= vbArray Then
        oDat = Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell))
    Else
        oDat = Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell).Offset(0, 1))
        ReDim Preserve oDat(1 To UBound(oDat, 1), 1 To 1)
    End If
    u = oPat & "0"
    For i = 1 To UBound(oDat, 1)
        If Not IsEmpty(oDat(i, 1)) Then
            If (CLng(Right$(u, Len(u) - Len(oPat))) < CLng(Right$(oDat(i, 1), Len(oDat(i, 1)) - Len(oPat)))) Then u = oDat(i, 1)
        End If
    Next i
    [COLOR="Sienna"][B]NOrdreContinu5[/B][/COLOR] = oPat & Right$("0000" & CLng(Right$(u, Len(u) - Len(oPat))) + 1, 5)
End Function
à placer dans un module standard.​
Utilisation :Les deux parties du code étant installées, un double-clic dans une cellule provoquera la création d'un n° d'ordre si le double-clic a été effectué dans la zone prévue pour eux. Dans l'exemple donné ici : dans la colonne B à partir de la deuxième ligne. La règle d'engendrement est la suivante :
  • Si la feuille est vierge, le premier code engendré est, actuellement,
    2009-00001
  • Si la zone des numéros d'ordre en comporte déjà, le n° d'ordre engendré sera
    2009-nnnnn
    nnnnn est l'entier immédiatement supérieur au plus grand de ceux déjà présent dans la zone.
  • La procédure n'oblige pas à créer un nouveau n° d'ordre dans la première cellule vide suivant le précédent n° d'ordre : on peut parfaitement créer ces n° en B7, B2250, B21, ... C'est pourquoi les n° sont formatés sur cinq chiffres : le classement en sera facilité.
Si l'on ne veut pas de ce formatage, on utilisera la fonction NOrdreContinu au lieu de NOrdreContinu5 :
Code:
Function [B][COLOR="Sienna"]NOrdreContinu[/COLOR][/B](oCel, oPat)
Dim oDat(), u As String, i As Long
    If VarType(Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell))) >= vbArray Then
        oDat = Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell))
    Else
        oDat = Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell).Offset(0, 1))
        ReDim Preserve oDat(1 To UBound(oDat, 1), 1 To 1)
    End If
    u = oPat & "0"
    For i = 1 To UBound(oDat, 1)
        If Not IsEmpty(oDat(i, 1)) Then
            If (CLng(Right$(u, Len(u) - Len(oPat))) < CLng(Right$(oDat(i, 1), Len(oDat(i, 1)) - Len(oPat)))) Then u = oDat(i, 1)
        End If
    Next i
    [B][COLOR="Sienna"]NOrdreContinu [/COLOR][/B]= oPat & CStr(CLng(Right$(u, Len(u) - Len(oPat))) + 1)
End Function
On obtiendra alors
2009-1
2009-2
...
2009-9
2009-10
2009-11
...
Pas commode à trier...​
Variantes :
Ce qui précède fourni une incrémentation continue d'année en année (le dernier n° d'ordre de l'année 2008 étant, par exemple, 2008-5237, le premier de 2009 sera 2008-5238. Je donne ci-dessous des fonctions qui reprennent la numérotation à 1 à chaque changement d'année.
Code:
Function [B][COLOR="Sienna"]NOrdre5[/COLOR][/B](oCel, oPat)
Dim oDat, u As String, i As Long
    If VarType(Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell))) >= vbArray Then
        oDat = Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell))
    Else
        oDat = Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell).Offset(0, 1))
        ReDim Preserve oDat(1 To UBound(oDat, 1), 1 To 1)
    End If
    u = oPat & "0"
    For i = 1 To UBound(oDat, 1)
        If Not IsEmpty(oDat(i, 1)) Then
            If (oPat = Left$(oDat(i, 1), Len(oPat))) And (CLng(Right$(u, Len(u) - Len(oPat))) < CLng(Right$(oDat(i, 1), Len(oDat(i, 1)) - Len(oPat)))) Then u = oDat(i, 1)
        End If
    Next i
    [B][COLOR="Sienna"]NOrdre5[/COLOR][/B] = oPat & Right$("0000" & CLng(Right$(u, Len(u) - Len(oPat))) + 1, 5)
End Function
donnera 2009-00001 après 2008-5237.
Code:
Function [B][COLOR="Sienna"]NOrdre[/COLOR][/B](oCel, oPat)
Dim oDat(), u As String, i As Long
    If VarType(Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell))) >= vbArray Then
        oDat = Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell))
    Else
        oDat = Range(Range(oCel), Range(oCel).SpecialCells(xlLastCell).Offset(0, 1))
        ReDim Preserve oDat(1 To UBound(oDat, 1), 1 To 1)
    End If
    u = oPat & "0"
    For i = 1 To UBound(oDat, 1)
        If Not IsEmpty(oDat(i, 1)) Then
            If (oPat = Left$(oDat(i, 1), Len(oPat))) And (CLng(Right$(u, Len(u) - Len(oPat))) < CLng(Right$(oDat(i, 1), Len(oDat(i, 1)) - Len(oPat)))) Then u = oDat(i, 1)
        End If
    Next i
    [B][COLOR="Sienna"]NOrdre[/COLOR][/B] = oPat & CStr(CLng(Right$(u, Len(u) - Len(oPat))) + 1)
End Function
donnera 2009-1 après 2008-5237.
Voilà.​
ROGER2327
 
Re : Numérotation

Bonjour kllmoon,

Ta solution est bien. Puisque tu récupères la valeur "A1", pourrais-tu récupérer la valeur de la cellule en colonne G, ligne -1 ?

A+

Oui, et si tu mettais la date dans une autre cellule, tu n'aurais plus à jongler avec le changement de date ou la lourdeur des calculs. Bref, tu peux remplacer A1 par une cellule de ton choix et mettre la date aujourd'hui dans une autre cellule. Ensuite, ta macro copierais ces deux données dans ta nouvelle ligne.

j'avous que la solution proposée par Roger semble bien structurée
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
6
Affichages
348
Réponses
5
Affichages
302
Réponses
5
Affichages
249
Retour