OVH Cloud OVH Cloud

[VBA-Excel 2003] Incrémentation alphanumérique

17 réponses
Avatar
Péhemme
Bonjour(soir) à Tous,



J'ai un problème d'incrémentation alphabétique tordue.

J'ai une base de données qui s'alimente via des TextBox et Label placés sur
un UserForm.

Au moment de la saisie, un Label doit être rempli automatiquement en allant
chercher dans la BdD le n° précédent incrémenté de 1.



1°) Première partie à incrémenter (déjà tordue) : la série :

La difficulté est que le n° de départ (plus petit n°) étant AA-1001, l'incrémentation
se fait

a) numériquement de 1001 à 9999

b) puis alphabétiquement : de AA-9999 on passe à AB-1001, puis de AB-9999
on passe à AC-1001 (la limite théorique étant la série ZZ-1001 à ZZ-9999)

Si cela peut aider, on peut supprimer le tiret utilisé comme séparateur. Sa
présence a pour but d'obtenir une lecture plus facile du n° complet.



2°) Seconde partie : la lettre finale :

Elle doit s'incrémenter de K (plus petit caractère) à Z (le plus grand).
Cette incrémentation, bien que liée au n° de série, est indépendante de
celui-ci (une série quelconque peut, à titre d'exemple, ne posséder que 3
lettres finales distinctes (K, L ou M par exemple). Mais au minimum un seul
élément dans la série : K.

Le plus petit n° complet s'écrit donc AA-1001-K

Je n'ai pas encore traité ce dernier point, mais je me débrouillerai.



Ne sachant pas comment faire, j'ai solutionné le problème du n° de série :

a) en créant 4 colonnes dans ma BdD et 4 Label (dont 3 invisibles) sur
mon UserForm

b) en écrivant la macro suivante qui répond à mon problème mais qui me
semble « contorsionniste et bourrin ».



L'un d'entre vous sait-il si je peux, et dans la série « j'ai la plus
courte », incrémenter directement mes séries sans passer par la dichotomie
de son n°.

Merci d'avance de vos avis et commentaires.



La macro :

Private Sub UserForm_Initialize()

Dim x As Integer

Dim y As Integer

Dim z As Integer

Dim R As Long



If R = 65535 Then

MsgBox "Vous êtes à la fin de la page !"

GoTo Fin

Else

R = Sheets("Feuil1").Range("G65536").End(xlUp).Row

End If

'Une première ligne est déjà remplie à A, A, 1000 pour rentrer dans la
boucle

x = Range("G" & R).Value + 1

y = Asc(Range("Feuil1!F65536").End(xlUp).Value)

z = Asc(Range("Feuil1!E65536").End(xlUp).Value)



If x = 10000 Then

x = 1001

y = y + 1

If y = 91 Then

y = 65

z = z + 1

If z = 91 Then

GoTo Fin

End If

End If

End If



Label1.Visible = False

Label2.Visible = False

Label3.Visible = False



Label1 = Chr(z)

Label2 = Chr(y)

Label3 = x

Label4 = Label1 & Label2 & "-" & Label3

Exit Sub



Fin:

MsgBox "Vous êtes au maximum autorisé", vbCritical, "ATTENTION LIMITES
!"



End Sub



Bonne nuit

Michel

7 réponses

1 2
Avatar
Maude Este
Bonsour® (réponse via news.aioe.org)

"Péhemme" a écrit
mais pourquoi tu me fais un tirage aléatoire au lieu d'une incrémentation
"toute bête" (+1 à chaque fois, sauf aux sauts de pas spécifiés) ? Tu veux
vérifier si je suis ?... :-))



;o))) le tirage aléatoire ne concerne que la procédure de test

la macro incremente ne fait son action qu'une seule fois mais à chaque fois
quelle est exécutée

il serait alors trés simple de transformer cette macro en procédure et en lui
passant l'adresse en parametre

function Increment(Lacellule as range) as string
X=Lacellule
........
./.
.......
Increment= Chr(alpha1) & Chr(alpha2) & "-" & Format(nombre, "0000")
End Function

utilisation :
B2=Increment(A1)
Avatar
Péhemme
Bonjour Jacky

Merci à toi de jouer les transmetteurs.
Il faudra bien qu'un jour j'installe ce fameux bridge...

Tu peux dire à Denis :
"Ta macro (au cas par cas) fonctionne parfaitement bien.
Je l'ai juste adaptée à mes besoins.
Je suis effectivement un peu faiblard dans l'utilisation des fonctions de
chaîne (s'il n'y avait que là...).
J'ai là matière à les travailler.

Ah, au fait, Merci !
:-))
Michel"

Merci à toi aussi Jacky
Michel



"Jacky" a écrit dans le message de
news:4c667ec4$0$5400$
Bonjour Michel

Je te transmet une reponse de Denis sur Answers,
Debut copie
'------------------
(Comme la communication est impossible sur aioe.org
J'espère que quelqu'un aura la générosité de lui transmettre...

2 Procédures :

Incrémenter toute la colonne A
La dernière lettre K a été omise, faute d'information adéquate.

Adapter le nom de la feuille si besoin...

'-------------------------------------
Sub Incrémentation_Sur_Toute_La_Colonne()
Dim T As Variant, A As String, B As Long, R As String
Dim C As Range, DerLig As Long, ModCalcul As String

ModCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
With Worksheets("Feuil1")
'Valeur de la première cellule
.Range("A1") = "AA-1001"
'Dernière ligne de la feuille -1
DerLig = .Range("A:A").Rows.Count - 1
'Boucle sur chaque ligne de la feuille
For Each C In .Range("A1:A" & DerLig)
T = Split(C.Value, "-")
B = T(1)
If CLng(B) + 1 = 10000 Then
B = 1000
A = T(0)
If Asc(Right(A, 1)) = 90 Then
R = Chr(Asc(Left(A, 1)) + 1) & Chr(65) & "-1000"
Else
R = Left(A, 1) & Chr(Asc(Right(A, 1)) + 1) & "-1000"
End If
Else
R = T(0) & "-" & B + 1
End If
C.Offset(1) = R
Next
End With
Application.EnableEvents = True
Application.Calculation = ModCalcul
Application.ScreenUpdating = True
End Sub
'-------------------------------------

Une cellule à la fois, la ligne 1 est présumée être l'étiquette de colonne
'-------------------------------------
Sub Incrémentation_Une_Ligne_à_La_Fois()
Dim T As Variant, A As String, B As Long, R As String
Dim C As Range, DerLig As Long

With Worksheets("Feuil1")
With .Range("A" & .Range("A" & .Cells.Rows.Count).End(xlUp).Row)
If .Address = "$A$1" Then
If .Offset(1).Value = "" Then
.Offset(1).Value = "AA-1001"
Exit Sub
End If
Else
T = Split(.Value, "-")
B = T(1)
If CLng(B) + 1 = 10000 Then
B = 1000
A = T(0)
If Asc(Right(A, 1)) = 90 Then
R = Chr(Asc(Left(A, 1)) + 1) & Chr(65) & "-1000"
Else
R = Left(A, 1) & Chr(Asc(Right(A, 1)) + 1) & "-1000"
End If
Else
R = T(0) & "-" & B + 1
End If
.Offset(1).Value = R
End If
End With
End With
End Sub


--------------------------------------------------------------------------------

MichD

'-------------Fin copie----------------


--
Salutations
JJ


"Péhemme" a écrit dans le message de news:
4c65cc28$0$10196$
Bonjour(soir) à Tous,



J'ai un problème d'incrémentation alphabétique tordue.

J'ai une base de données qui s'alimente via des TextBox et Label placés
sur un UserForm.

Au moment de la saisie, un Label doit être rempli automatiquement en
allant chercher dans la BdD le n° précédent incrémenté de 1.



1°) Première partie à incrémenter (déjà tordue) : la série :

La difficulté est que le n° de départ (plus petit n°) étant AA-1001,
l'incrémentation se fait

a) numériquement de 1001 à 9999

b) puis alphabétiquement : de AA-9999 on passe à AB-1001, puis de
AB-9999 on passe à AC-1001 (la limite théorique étant la série ZZ-1001 à
ZZ-9999)

Si cela peut aider, on peut supprimer le tiret utilisé comme séparateur.
Sa présence a pour but d'obtenir une lecture plus facile du n° complet.



2°) Seconde partie : la lettre finale :

Elle doit s'incrémenter de K (plus petit caractère) à Z (le plus grand).
Cette incrémentation, bien que liée au n° de série, est indépendante de
celui-ci (une série quelconque peut, à titre d'exemple, ne posséder que 3
lettres finales distinctes (K, L ou M par exemple). Mais au minimum un
seul élément dans la série : K.

Le plus petit n° complet s'écrit donc AA-1001-K

Je n'ai pas encore traité ce dernier point, mais je me débrouillerai.



Ne sachant pas comment faire, j'ai solutionné le problème du n° de série
:

a) en créant 4 colonnes dans ma BdD et 4 Label (dont 3 invisibles) sur
mon UserForm

b) en écrivant la macro suivante qui répond à mon problème mais qui me
semble « contorsionniste et bourrin ».



L'un d'entre vous sait-il si je peux, et dans la série « j'ai la plus
courte », incrémenter directement mes séries sans passer par la
dichotomie de son n°.

Merci d'avance de vos avis et commentaires.



La macro :

Private Sub UserForm_Initialize()

Dim x As Integer

Dim y As Integer

Dim z As Integer

Dim R As Long



If R = 65535 Then

MsgBox "Vous êtes à la fin de la page !"

GoTo Fin

Else

R = Sheets("Feuil1").Range("G65536").End(xlUp).Row

End If

'Une première ligne est déjà remplie à A, A, 1000 pour rentrer dans la
boucle

x = Range("G" & R).Value + 1

y = Asc(Range("Feuil1!F65536").End(xlUp).Value)

z = Asc(Range("Feuil1!E65536").End(xlUp).Value)



If x = 10000 Then

x = 1001

y = y + 1

If y = 91 Then

y = 65

z = z + 1

If z = 91 Then

GoTo Fin

End If

End If

End If



Label1.Visible = False

Label2.Visible = False

Label3.Visible = False



Label1 = Chr(z)

Label2 = Chr(y)

Label3 = x

Label4 = Label1 & Label2 & "-" & Label3

Exit Sub



Fin:

MsgBox "Vous êtes au maximum autorisé", vbCritical, "ATTENTION LIMITES
!"



End Sub



Bonne nuit

Michel





Avatar
Jacky
Re..
Tu peux dire à Denis :


S'il ne peut pas émettre sur aioe.org, il peut néanmoins lire les news.
Donc, pas besoin de lui transmettre ;o))

--
Bon we
Jacky


"Péhemme" a écrit dans le message de news: 4c669cf7$0$5390$
Bonjour Jacky

Merci à toi de jouer les transmetteurs.
Il faudra bien qu'un jour j'installe ce fameux bridge...

Tu peux dire à Denis :
"Ta macro (au cas par cas) fonctionne parfaitement bien.
Je l'ai juste adaptée à mes besoins.
Je suis effectivement un peu faiblard dans l'utilisation des fonctions de chaîne (s'il n'y avait que là...).
J'ai là matière à les travailler.

Ah, au fait, Merci !
:-))
Michel"

Merci à toi aussi Jacky
Michel



"Jacky" a écrit dans le message de news:4c667ec4$0$5400$
Bonjour Michel

Je te transmet une reponse de Denis sur Answers,
Debut copie
'------------------
(Comme la communication est impossible sur aioe.org
J'espère que quelqu'un aura la générosité de lui transmettre...

2 Procédures :

Incrémenter toute la colonne A
La dernière lettre K a été omise, faute d'information adéquate.

Adapter le nom de la feuille si besoin...

'-------------------------------------
Sub Incrémentation_Sur_Toute_La_Colonne()
Dim T As Variant, A As String, B As Long, R As String
Dim C As Range, DerLig As Long, ModCalcul As String

ModCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
With Worksheets("Feuil1")
'Valeur de la première cellule
.Range("A1") = "AA-1001"
'Dernière ligne de la feuille -1
DerLig = .Range("A:A").Rows.Count - 1
'Boucle sur chaque ligne de la feuille
For Each C In .Range("A1:A" & DerLig)
T = Split(C.Value, "-")
B = T(1)
If CLng(B) + 1 = 10000 Then
B = 1000
A = T(0)
If Asc(Right(A, 1)) = 90 Then
R = Chr(Asc(Left(A, 1)) + 1) & Chr(65) & "-1000"
Else
R = Left(A, 1) & Chr(Asc(Right(A, 1)) + 1) & "-1000"
End If
Else
R = T(0) & "-" & B + 1
End If
C.Offset(1) = R
Next
End With
Application.EnableEvents = True
Application.Calculation = ModCalcul
Application.ScreenUpdating = True
End Sub
'-------------------------------------

Une cellule à la fois, la ligne 1 est présumée être l'étiquette de colonne
'-------------------------------------
Sub Incrémentation_Une_Ligne_à_La_Fois()
Dim T As Variant, A As String, B As Long, R As String
Dim C As Range, DerLig As Long

With Worksheets("Feuil1")
With .Range("A" & .Range("A" & .Cells.Rows.Count).End(xlUp).Row)
If .Address = "$A$1" Then
If .Offset(1).Value = "" Then
.Offset(1).Value = "AA-1001"
Exit Sub
End If
Else
T = Split(.Value, "-")
B = T(1)
If CLng(B) + 1 = 10000 Then
B = 1000
A = T(0)
If Asc(Right(A, 1)) = 90 Then
R = Chr(Asc(Left(A, 1)) + 1) & Chr(65) & "-1000"
Else
R = Left(A, 1) & Chr(Asc(Right(A, 1)) + 1) & "-1000"
End If
Else
R = T(0) & "-" & B + 1
End If
.Offset(1).Value = R
End If
End With
End With
End Sub


--------------------------------------------------------------------------------

MichD

'-------------Fin copie----------------


--
Salutations
JJ


"Péhemme" a écrit dans le message de news: 4c65cc28$0$10196$
Bonjour(soir) à Tous,



J'ai un problème d'incrémentation alphabétique tordue.

J'ai une base de données qui s'alimente via des TextBox et Label placés sur un UserForm.

Au moment de la saisie, un Label doit être rempli automatiquement en allant chercher dans la BdD le n°
précédent incrémenté de 1.



1°) Première partie à incrémenter (déjà tordue) : la série :

La difficulté est que le n° de départ (plus petit n°) étant AA-1001, l'incrémentation se fait

a) numériquement de 1001 à 9999

b) puis alphabétiquement : de AA-9999 on passe à AB-1001, puis de AB-9999 on passe à AC-1001 (la limite
théorique étant la série ZZ-1001 à ZZ-9999)

Si cela peut aider, on peut supprimer le tiret utilisé comme séparateur. Sa présence a pour but d'obtenir
une lecture plus facile du n° complet.



2°) Seconde partie : la lettre finale :

Elle doit s'incrémenter de K (plus petit caractère) à Z (le plus grand). Cette incrémentation, bien que
liée au n° de série, est indépendante de celui-ci (une série quelconque peut, à titre d'exemple, ne
posséder que 3 lettres finales distinctes (K, L ou M par exemple). Mais au minimum un seul élément dans la
série : K.

Le plus petit n° complet s'écrit donc AA-1001-K

Je n'ai pas encore traité ce dernier point, mais je me débrouillerai.



Ne sachant pas comment faire, j'ai solutionné le problème du n° de série :

a) en créant 4 colonnes dans ma BdD et 4 Label (dont 3 invisibles) sur mon UserForm

b) en écrivant la macro suivante qui répond à mon problème mais qui me semble « contorsionniste et
bourrin ».



L'un d'entre vous sait-il si je peux, et dans la série « j'ai la plus courte », incrémenter directement
mes séries sans passer par la dichotomie de son n°.

Merci d'avance de vos avis et commentaires.



La macro :

Private Sub UserForm_Initialize()

Dim x As Integer

Dim y As Integer

Dim z As Integer

Dim R As Long



If R = 65535 Then

MsgBox "Vous êtes à la fin de la page !"

GoTo Fin

Else

R = Sheets("Feuil1").Range("G65536").End(xlUp).Row

End If

'Une première ligne est déjà remplie à A, A, 1000 pour rentrer dans la boucle

x = Range("G" & R).Value + 1

y = Asc(Range("Feuil1!F65536").End(xlUp).Value)

z = Asc(Range("Feuil1!E65536").End(xlUp).Value)



If x = 10000 Then

x = 1001

y = y + 1

If y = 91 Then

y = 65

z = z + 1

If z = 91 Then

GoTo Fin

End If

End If

End If



Label1.Visible = False

Label2.Visible = False

Label3.Visible = False



Label1 = Chr(z)

Label2 = Chr(y)

Label3 = x

Label4 = Label1 & Label2 & "-" & Label3

Exit Sub



Fin:

MsgBox "Vous êtes au maximum autorisé", vbCritical, "ATTENTION LIMITES !"



End Sub



Bonne nuit

Michel








Avatar
Modeste
Bonsour®

a écrit
S'il ne peut pas émettre sur aioe.org, il peut néanmoins lire les news.
Donc, pas besoin de lui transmettre ;o))



en désespoir de cause
c'est toujours possible de là :

http://groups.google.fr/group/microsoft.public.fr.excel/topics?lnk=srg&hl=fr
Avatar
Péhemme
Dis-moi mon garçon ?!
Tu sais que ce n'est pas si mal ta proposition ?
:-))

Mille mercis, cela fonctionne parfaitement bien
Amitiés
Michel


"Maude Este" a écrit dans le message de
news:i460o9$gqt$
Bonsour® (réponse via news.aioe.org)

"Péhemme" a écrit
mais pourquoi tu me fais un tirage aléatoire au lieu d'une incrémentation
"toute bête" (+1 à chaque fois, sauf aux sauts de pas spécifiés) ? Tu
veux vérifier si je suis ?... :-))



;o))) le tirage aléatoire ne concerne que la procédure de test

la macro incremente ne fait son action qu'une seule fois mais à chaque
fois
quelle est exécutée

il serait alors trés simple de transformer cette macro en procédure et en
lui
passant l'adresse en parametre

function Increment(Lacellule as range) as string
X=Lacellule
........
./.
.......
Increment= Chr(alpha1) & Chr(alpha2) & "-" & Format(nombre, "0000")
End Function

utilisation :
B2=Increment(A1)


Avatar
Péhemme
Eh bien, si Denis peut me lire, je n'ai qu'une chose à lui dire : Merci
;-)
Michel

"Jacky" a écrit dans le message de
news:4c66bd3f$0$5431$
Re..
Tu peux dire à Denis :


S'il ne peut pas émettre sur aioe.org, il peut néanmoins lire les news.
Donc, pas besoin de lui transmettre ;o))

--
Bon we
Jacky


"Péhemme" a écrit dans le message de news:
4c669cf7$0$5390$
Bonjour Jacky

Merci à toi de jouer les transmetteurs.
Il faudra bien qu'un jour j'installe ce fameux bridge...

Tu peux dire à Denis :
"Ta macro (au cas par cas) fonctionne parfaitement bien.
Je l'ai juste adaptée à mes besoins.
Je suis effectivement un peu faiblard dans l'utilisation des fonctions de
chaîne (s'il n'y avait que là...).
J'ai là matière à les travailler.

Ah, au fait, Merci !
:-))
Michel"

Merci à toi aussi Jacky
Michel



"Jacky" a écrit dans le message de
news:4c667ec4$0$5400$
Bonjour Michel

Je te transmet une reponse de Denis sur Answers,
Debut copie
'------------------
(Comme la communication est impossible sur aioe.org
J'espère que quelqu'un aura la générosité de lui transmettre...

2 Procédures :

Incrémenter toute la colonne A
La dernière lettre K a été omise, faute d'information adéquate.

Adapter le nom de la feuille si besoin...

'-------------------------------------
Sub Incrémentation_Sur_Toute_La_Colonne()
Dim T As Variant, A As String, B As Long, R As String
Dim C As Range, DerLig As Long, ModCalcul As String

ModCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
With Worksheets("Feuil1")
'Valeur de la première cellule
.Range("A1") = "AA-1001"
'Dernière ligne de la feuille -1
DerLig = .Range("A:A").Rows.Count - 1
'Boucle sur chaque ligne de la feuille
For Each C In .Range("A1:A" & DerLig)
T = Split(C.Value, "-")
B = T(1)
If CLng(B) + 1 = 10000 Then
B = 1000
A = T(0)
If Asc(Right(A, 1)) = 90 Then
R = Chr(Asc(Left(A, 1)) + 1) & Chr(65) & "-1000"
Else
R = Left(A, 1) & Chr(Asc(Right(A, 1)) + 1) & "-1000"
End If
Else
R = T(0) & "-" & B + 1
End If
C.Offset(1) = R
Next
End With
Application.EnableEvents = True
Application.Calculation = ModCalcul
Application.ScreenUpdating = True
End Sub
'-------------------------------------

Une cellule à la fois, la ligne 1 est présumée être l'étiquette de
colonne
'-------------------------------------
Sub Incrémentation_Une_Ligne_à_La_Fois()
Dim T As Variant, A As String, B As Long, R As String
Dim C As Range, DerLig As Long

With Worksheets("Feuil1")
With .Range("A" & .Range("A" & .Cells.Rows.Count).End(xlUp).Row)
If .Address = "$A$1" Then
If .Offset(1).Value = "" Then
.Offset(1).Value = "AA-1001"
Exit Sub
End If
Else
T = Split(.Value, "-")
B = T(1)
If CLng(B) + 1 = 10000 Then
B = 1000
A = T(0)
If Asc(Right(A, 1)) = 90 Then
R = Chr(Asc(Left(A, 1)) + 1) & Chr(65) & "-1000"
Else
R = Left(A, 1) & Chr(Asc(Right(A, 1)) + 1) & "-1000"
End If
Else
R = T(0) & "-" & B + 1
End If
.Offset(1).Value = R
End If
End With
End With
End Sub


--------------------------------------------------------------------------------

MichD

'-------------Fin copie----------------


--
Salutations
JJ


"Péhemme" a écrit dans le message de news:
4c65cc28$0$10196$
Bonjour(soir) à Tous,



J'ai un problème d'incrémentation alphabétique tordue.

J'ai une base de données qui s'alimente via des TextBox et Label placés
sur un UserForm.

Au moment de la saisie, un Label doit être rempli automatiquement en
allant chercher dans la BdD le n° précédent incrémenté de 1.



1°) Première partie à incrémenter (déjà tordue) : la série :

La difficulté est que le n° de départ (plus petit n°) étant AA-1001,
l'incrémentation se fait

a) numériquement de 1001 à 9999

b) puis alphabétiquement : de AA-9999 on passe à AB-1001, puis de
AB-9999 on passe à AC-1001 (la limite théorique étant la série ZZ-1001
à ZZ-9999)

Si cela peut aider, on peut supprimer le tiret utilisé comme
séparateur. Sa présence a pour but d'obtenir une lecture plus facile du
n° complet.



2°) Seconde partie : la lettre finale :

Elle doit s'incrémenter de K (plus petit caractère) à Z (le plus
grand). Cette incrémentation, bien que liée au n° de série, est
indépendante de celui-ci (une série quelconque peut, à titre d'exemple,
ne posséder que 3 lettres finales distinctes (K, L ou M par exemple).
Mais au minimum un seul élément dans la série : K.

Le plus petit n° complet s'écrit donc AA-1001-K

Je n'ai pas encore traité ce dernier point, mais je me débrouillerai.



Ne sachant pas comment faire, j'ai solutionné le problème du n° de
série :

a) en créant 4 colonnes dans ma BdD et 4 Label (dont 3 invisibles)
sur mon UserForm

b) en écrivant la macro suivante qui répond à mon problème mais qui
me semble « contorsionniste et bourrin ».



L'un d'entre vous sait-il si je peux, et dans la série « j'ai la plus
courte », incrémenter directement mes séries sans passer par la
dichotomie de son n°.

Merci d'avance de vos avis et commentaires.



La macro :

Private Sub UserForm_Initialize()

Dim x As Integer

Dim y As Integer

Dim z As Integer

Dim R As Long



If R = 65535 Then

MsgBox "Vous êtes à la fin de la page !"

GoTo Fin

Else

R = Sheets("Feuil1").Range("G65536").End(xlUp).Row

End If

'Une première ligne est déjà remplie à A, A, 1000 pour rentrer dans la
boucle

x = Range("G" & R).Value + 1

y = Asc(Range("Feuil1!F65536").End(xlUp).Value)

z = Asc(Range("Feuil1!E65536").End(xlUp).Value)



If x = 10000 Then

x = 1001

y = y + 1

If y = 91 Then

y = 65

z = z + 1

If z = 91 Then

GoTo Fin

End If

End If

End If



Label1.Visible = False

Label2.Visible = False

Label3.Visible = False



Label1 = Chr(z)

Label2 = Chr(y)

Label3 = x

Label4 = Label1 & Label2 & "-" & Label3

Exit Sub



Fin:

MsgBox "Vous êtes au maximum autorisé", vbCritical, "ATTENTION
LIMITES !"



End Sub



Bonne nuit

Michel












Avatar
Péhemme
Merci Denis.
J'ai adapté ta proposition (une ligne à la fois) et cela fonctionne à
merveille.
Bien amicalement
Michel



"michdenis" a écrit dans le message de
news:i49dlu$g9i$

Bonjour

2 Procédures :

Incrémenter toute la colonne A
La dernière lettre K a été omise, faute d'information adéquate.

Adapter le nom de la feuille si besoin...

Sub Incrémentation_Sur_Toute_La_Colonne()
Dim T As Variant, A As String, B As Long, R As String
Dim C As Range, DerLig As Long, ModCalcul As String

ModCalcul = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.EnableEvents = False
With Worksheets("Feuil1")
'Valeur de la première cellule
.Range("A1") = "AA-1001"
'Dernière ligne de la feuille -1
DerLig = .Range("A:A").Rows.Count - 1
'Boucle sur chaque ligne de la feuille
For Each C In .Range("A1:A" & DerLig)
T = Split(C.Value, "-")
B = T(1)
If CLng(B) + 1 = 10000 Then
B = 1000
A = T(0)
If Asc(Right(A, 1)) = 90 Then
R = Chr(Asc(Left(A, 1)) + 1) & Chr(65) & "-1000"
Else
R = Left(A, 1) & Chr(Asc(Right(A, 1)) + 1) & "-1000"
End If
Else
R = T(0) & "-" & B + 1
End If
C.Offset(1) = R
Next
End With
Application.EnableEvents = True
Application.Calculation = ModCalcul
Application.ScreenUpdating = True
End Sub


Une cellule à la fois, la ligne 1 est présumée être l'étiquette de colonne

Sub Incrémentation_Une_Ligne_à_La_Fois()
Dim T As Variant, A As String, B As Long, R As String
Dim C As Range, DerLig As Long

With Worksheets("Feuil1")
With .Range("A" & .Range("A" & .Cells.Rows.Count).End(xlUp).Row)
If .Address = "$A$1" Then
If .Offset(1).Value = "" Then
.Offset(1).Value = "AA-1001"
Exit Sub
End If
Else
T = Split(.Value, "-")
B = T(1)
If CLng(B) + 1 = 10000 Then
B = 1000
A = T(0)
If Asc(Right(A, 1)) = 90 Then
R = Chr(Asc(Left(A, 1)) + 1) & Chr(65) & "-1000"
Else
R = Left(A, 1) & Chr(Asc(Right(A, 1)) + 1) & "-1000"
End If
Else
R = T(0) & "-" & B + 1
End If
.Offset(1).Value = R
End If
End With
End With
End Sub

--
MichD
--------------------------------------------


"Péhemme" a écrit dans le message de groupe de discussion :
4c667599$0$5428$
Mon cher Maude (ou ma chère Gilbert) :-)),

Tu vois effectivement que je continue de "m'accrocher" et ce, sans changer
de sexe, mais pourquoi tu me fais un tirage aléatoire au lieu d'une
incrémentation "toute bête" (+1 à chaque fois, sauf aux sauts de pas
spécifiés) ? Tu veux vérifier si je suis ?... :-))

Merci de ton aide, je regarde si je peux adapter ta réponse.

Bien amicalement
Michel



"Maude Este" a écrit dans le message de
news:i45j3t$fts$
Bonsour®

"Péhemme" a écrit
1°) Première partie à incrémenter (déjà tordue) : la série :

La difficulté est que le n° de départ (plus petit n°) étant AA-1001,
l'incrémentation se fait

a) numériquement de 1001 à 9999

b) puis alphabétiquement : de AA-9999 on passe à AB-1001, puis de
AB-9999 on passe à AC-1001 (la limite théorique étant la série ZZ-1001 à
ZZ-9999)




Sub test()
MsgBox "Ctrl-Pause pour interrompre ce test", vbExclamation, "Michel On
s'accroche !!!"
[A1] = Chr(65 + Rnd() * 26) & Chr(65 + Rnd() * 26) & "-" & Format(Rnd() *
10 ^ 4, "0000")
For i = 1 To 20000
increment
DoEvents
Next
End Sub

Sub increment()
x = [A1]
alpha1 = Asc(UCase(Left(x, 1)))
alpha2 = Asc(UCase(Mid(x, 2, 1)))
nombre = CInt(Right(x, 4))
'-----incrementation numerique
nombre = nombre + 1
'-----incrementation 2éme lettre
If nombre > 9999 Then
alpha2 = alpha2 + 1
nombre = 0
End If
'-----incrementation 1ére lettre
If alpha2 > Asc("Z") Then
alpha2 = 65
alpha1 = alpha1 + 1
End If
'----- limite capacité
If alpha1 > Asc("Z") Then
MsgBox "limite capacité atteinte AA-9999"
Exit Sub
End If
'-----
[A1] = Chr(alpha1) & Chr(alpha2) & "-" & Format(nombre, "0000")
End Sub






1 2