Après avoir collé la forme, il suffit d'écrire le code ci-dessous.
Sheets(sht).Shapes(.Shapes.Count).Name = btn
Parce que lorsque vous ajoutez une nouvelle forme, elle a l'indice le plus élevé. Donc si vous trouvez la forme la plus indexée en .Shapes.Count
vous pouvez alors le renommer facilement.
Et quelques autres recommandations basées sur les meilleures pratiques de VBA :
1 - Toujours utiliser l'option explicite
Parce que si vous l'utilisiez, vous verriez que votre "lim,rng,sht"
n'ont pas été définies. Commas = ",'
ne sont pas suffisants pour définir toutes vos variables. Vous devez les déclarer séparément, une par une. Ainsi, au lieu de Dim lim, rng, sht, btn As String
utilice Dim lim as String, rng as String, sht as String, btn As String
2 - Travailler avec un long terme au lieu d'un nombre entier
Parce qu'Excel pourrait avoir besoin de votre Integer en Long pour exécuter le code dans les nouvelles versions d'Excel. Vous pouvez simplement l'éviter au début en définissant vos variables comme Long au lieu de Integer.
3 - Feuille de travail "Ne jamais supposer
Ne vous fiez pas à ActiveWorkbook ou ActiveSheet car ils peuvent être modifiés. par l'utilisateur.
La meilleure pratique consiste à toujours identifier la feuille de calcul à laquelle votre code fait référence :
Donc, dans votre exemple :
Dim wb as Workbook, ws as Worksheet
Set wb = ThisWorkbook
Set ws = wb.Sheet("Sheet1")
Lr = ws.Range("B" & Rows.Count).End(xlUp).Row
Ce type d'approche ne vous induira jamais en erreur.
4 - Évitez d'utiliser Select ou Activate
.Select() est lent
.Select() est indiscipliné
.Select() déclenchera les listeners
5 - Utilisez des noms de variables descriptifs
Les noms descriptifs et la structure de votre code contribuent à rendre les commentaires inutiles.
Votre code serait donc beaucoup plus clair et efficace de cette manière :
Option Explicit
Application.ScreenUpdating = False
'It's better to switch off properties from starting of your macro
Dim wb as Workbook, ws as Worksheet
Dim Lr As Long
Dim newLr As Long
Dim sht as String, btn As String
Dim lim as Range, rng as Range 'Using these ones directly as a Range is better idea.
Set wb = ThisWorkbook
Set ws = wb.Sheets("Sheet1")
Lr = ws.Range("B" & Rows.Count).End(xlUp).Row 'Searching last row in column A
'==> if you would like to count rows in A, then change your code. Now it's looking for "B".
newLr = Lr + 1
set lim = ws.Range("B" & newLr & ":" + "D" & newLr)
set rng = ws.Range("A" & newLr)
ws.Rows(Lr).Copy
ws.Rows(newLr).Insert
'Range(lim).ClearContents
sht = ws.Name
btn = "vaalidate" & newLr
With Sheets(sht)
.Shapes("validate").Copy
.rng.Paste
.Shapes(.Shapes.Count).Name = btn
End With
Application.ScreenUpdating = True