Générer une clé primaire : Max(Tableau)
Bonsoir,
Je cherche à générer en dernière ligne une Clé primaire tel que nouvelle clé = max(ancienne clé) +1
Exemple :
Colonne A
S00064
S00110
S00109
S00099
S00080
S00070
S00111
Je joint un fichier exemple sur lequel j'arrive à générer la nouvelle clé avec des formules.
J'ai essayé d'adapter mon raisonnement sur VBA mais je n'arrive pas à récupérer la valeur maximum de mes anciennes clés dans ma variable Max. J'utilise un tableau pour récupérer toutes les valeurs des anciennes clés, est-ce une solution viable?
Ci-après le code :
Sub Test()
Dim Derln, i, Max As Integer
Derln = Range("A" & Rows.Count).End(xlUp).Row
Dim My_Tab()
ReDim My_Tab(Derln)
For i = 0 To Derln
My_Tab(i) = Val(Right(Range("A" & i + 1), 5))
If i = 0 Then
Else
If My_Tab(i) > My_Tab(i - 1) Then
Max = My_Tab(i)
Else
Max = My_Tab(i - 1) + 1
End If
End If
Next
'Range("A" & Derln + 1) = Max
If Len(Max) = 3 Then
Range("A" & Derln + 1).Value = "S00" & Max
If Len(Max) = 2 Then
Range("A" & Derln + 1).Value = "S000" & Max
If Len(Max) = 1 Then
Range("A" & Derln + 1).Value = "S0000" & Max
End If
End If
End If
End Sub
Je sais que le passage ..
If My_Tab(i) > My_Tab(i - 1) Then
Max = My_Tab(i)
Else
Max = My_Tab(i - 1)
End If
.. n'est pas bon car il ne compare que 2 valeurs et non l'ensemble de mon tableau... mais là je bloque.
A vous lire
Bonjour,
Une proposition !?
Cdlt.
Public Sub PrimaryKey()
Dim lastRow As Long, a, b() As Long, i As Long
With ActiveSheet
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
a = .Cells(2, 1).Resize(lastRow - 1)
ReDim b(1 To UBound(a))
For i = LBound(a) To UBound(a)
b(i) = Mid(a(i, 1), 2, Len(a(i, 1)))
Next i
.Cells(2, 2).Value = Format(Application.Max(b) + 1, """S""00000")
End With
End Sub
Bonjour,
Ce code fonctionne parfaitement! Je me suis appuyé sur ce dernier pour ajuster le mien (que je comprends mieux), ce qui donne :
Sub Test()
Dim derln, i As Integer, a() As Integer
With ActiveSheet
derln = .Range("A" & Rows.Count).End(xlUp).Row
ReDim a(derln)
For i = 0 To derln
a(i) = Val(Right(.Range("A" & i + 1), 5))
Next
.Range("A" & derln + 1) = Format(Application.Max(a()) + 1, """S""00000")
End With
End Sub
Le sujet est clos mais j'aimerais approfondir :
Y-a-t'il un intérêt à utiliser .Cells plutôt que .Range ou est ce une question d'habitude?
Je ne comprend pas l'utilisation de votre variable a. Quelle information renvoie-t-elle?
Quoi qu'il en soit merci pour votre aide!
Bien à vous.