3 votes

renommer le nom du bouton du contrôle (propriété name) dans excel vba

J'ai utilisé un code vba pour ajouter une nouvelle ligne avec un bouton de contrôle dans la colonne A.

Le code fonctionne bien mais il y a un petit problème.

J'essaie de changer la propriété du nom du bouton pendant la copie mais je ne sais pas comment faire ?

Par exemple, je suis en train de copier un bouton avec le nom "validate", quand il sera copié dans la ligne suivante, je veux changer la propriété Name (pas le texte du bouton) du bouton en "validate1".

Pouvez-vous me dire comment faire ?

Dim Lr As Integer
Dim newLr As Integer
Dim lim, rng, sht, btn As String

Lr = Range("B" & Rows.Count).End(xlUp).Row 'Searching last row in column A
newLr = Lr + 1
lim = "B" & newLr & ":" + "D" & newLr
rng = "A" & newLr
Rows(Lr).Copy
Rows(newLr).Insert
'Range(lim).ClearContents
sht = ActiveSheet.Name
btn = "validate" & newLr
    Application.ScreenUpdating = False
    Sheets(sht).Shapes("validate").Copy
    Sheets(sht).Activate
    Sheets(sht).Range(rng).Select
    Sheets(sht).Paste
    Sheets(sht).Shapes("validate").Select
    Selection.Characters.Text = btn
    Application.ScreenUpdating = True

Lien image : https://ibb.co/c0rFfv

1voto

Mertinc Points 656

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

1voto

Shai Rado Points 28722

Il n'y a pas besoin d'utiliser Sheets(sht).Activate y Sheets(sht).Range(rng).Select cela ne fait que ralentir l'exécution de votre code, utilisez plutôt des noms de domaine complets. Shapes y Worksheets comme le code ci-dessous :

With Sheets(sht)
    .Shapes("validate").Copy
    .Paste
    .Shapes(.Shapes.Count).Name = btn    
End With

0voto

Romcel Geluz Points 563

Après la ligne Selection.Characters.Text = btn , ajouter Selection.Name = btn .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X