VBA : Mofifier le caption d'un Commandbutton par macro

Bonjour à tous,

Pour mon premier post sur votre forum, je tiens d'abord à vous remercier pour les TRÈS nombreuses fois où vous m'avez tiré d'affaire. Le nombre de sujets traités m'a permis de trouver des solutions à chaque fois sans jamais avoir besoin de faire directement appel à vous.

Mais cette fois je suis coincé. J'ai trouvé des sujets similaires mais les solutions n'ont jamais marché, voire, font planter excel.

Voici mon problème.

Je suis enseignant d'EPS et j'ai créé un fichier pour inscrire mes élèves dans les différentes activités de l'établissement. Pour ce faire, j'utilise un Userform, nommé "Userform1" (cf. userform1.jpg).

Une fois que c'est fait, l'élève sélectionné va directement se placer dans les différents onglets, selon les activités choisies (cf. onglets.jpg).

Tout fonctionne au mieux dans mon établissement.

Mais je souhaiterais partager ce fichier aux autres établissements et ils doivent pouvoir changer les noms des activités selon leurs besoin.

J'ai donc créé un bouton dans un onglet (cf. Bouton.jpg), qui, quand je l'actionne m'ouvre un second userform appelé "User_Acté".

Lorsqu'on change le nom de l'activité et que l'on valide, ma macro modifie :

  • le nom de l'onglet,
  • le titre de la feuille,
  • remplace dans toutes les autres macros l'ancien nom par le nouveau,
  • et il ne me reste plus qu'à modifier le caption du bouton sur le Userform1.

Ex : si on change l'activité "bb" par "twirling-bâton" , je voudrais que le bouton du userform1 (commandbutton4) se change en "Inscrire en Twirling-bâton".

J'espère avoir été clair.

Je vous joints également l'image de la macro que j'utilise avec le bouton "valider" en précisant que je ne suis qu'un novice sous VBA et qu'elle ne respecte sûrement pas les règles de mise en forme basique. J'aurais préféré vous joindre le fichier mais il contient beaucoup de données sensibles que je ne peux me permettre de diffuser sur internet.

Un grand merci à vous.

Cousin-Hub

macro onglets userform1 bouton

bonjour

mon avis de moi perso uniquement : tu as fait une usine à gaz

tant mieux si elle fonctionne

mais tu galères déjà et tu galèreras si tu veux en modifier une virgule

tout ceci se fait très bien, et reste modifiable avec un SGBD (Access, OOO...)

je pense pouvoir le faire en 2 heures, pas joli mais fonctionnel

note qu'avec Excel, il faut éviter VBA, complexe, capricieux et peu stable dans le temps.

quant à offrir un programme VBA, je n'ose pas te dire que c'est un cadeau empoisonné

courage si tu restes sur VBA.

amitiés excelliennes

Bonjour et bienvenue sur le forum

Tu devrais joindre ton fichier pour qu'on puisse te proposer quelque chose.

Bye !

Bonjour Cousin-Hub,

si au moment de l'exécution le UserForm1 est déjà chargé,

UserForm1.CommandButton4.Caption = "twirling-bâton"

Bonjour à vous,

Tout d'abord, merci pour vos réponses.

tout ceci se fait très bien, et reste modifiable avec un SGBD (Access, OOO...)

Tu as sûrement raison mais je n'ai jamais utilisé de tels softs.

Tu devrais joindre ton fichier pour qu'on puisse te proposer quelque chose.

J'aimerais bien mais ce sont des données éèves et c'est extrêmement sensible. Si je galère vraiment trop j'en ferai un exemple sans.

si au moment de l'exécution le UserForm1 est déjà chargé,

Code : Tout sélectionner

UserForm1.CommandButton4.Caption = "twirling-bâton"

Je teste dès que possible et vous tiens au courant.

En tout cas merci pour vos réponses.

Cousin-Hub

J'aimerais bien mais ce sont des données éèves et c'est extrêmement sensible.

Il te suffit de remplacer le premier nom de la liste par "Nom 1" et de tirer vers le bas, comme une formule...

Et tout tes noms seront anonymes.

Bye !

Bonjour à tous,

... Il te suffit de remplacer le premier nom de la liste par "Nom 1" et de tirer vers le bas, comme une formule...

Et tout tes noms seront anonymes. ...

Sur une copie ... bien sûr.

ric

Bonjour à tous,

UserForm1.CommandButton4.Caption = "twirling-bâton"

J'ai essayé cette ligne de code, a priori, sauf erreur de ma part, ça ne fonctionne pas. Il me parle d'une erreur "d'automation" je crois.

Je vous joints un fichier que j'ai simplifié au maximum : une seule activité, beaucoup moins de boutons, pour faire un focus sur le problème évoqué.

Par contre pour que l'une des macros fonctionne il a fallu que j'active la référence suivante dans les options VBA :

Microsoft Visual Basic For Application Extensibility 5.3. Si ce n'est pas le cas sur vos versions, je ne suis pas sûr que cela fonctionne.

Merci du coup de main.

Cousin-Hub

28cahier-as-auto.xlsm (160.65 Ko)

Bonjour Cousin-Hub,

Lorsqu'on change le nom de l'activité et que l'on valide, ma macro modifie :

  • le nom de l'onglet,
  • le titre de la feuille,
  • remplace dans toutes les autres macros l'ancien nom par le nouveau,
  • et il ne me reste plus qu'à modifier le caption du bouton sur le Userform1.

Quel sont les activités ?

et sur quel onglet les changements (nom, titre, ect..) se font ?

Bonjour SABV,

Pour simplifier le fichier j'ai supprimer toutes les activités autres que le basket (bb).

En cliquant sur le bouton "changer d'activité", j'ai mon userform "user_acté" qui apparaît.

En rentrant le nom de la nouvelle activité ("hand" par exemple) et en validant, l'onglet "bb" devient "hand", le titre de la feuille devient "Suivi de présence en hand" et toutes les macros contenant "bb" deviennent "hand".

Ne reste plus que le caption du commandbutton4 sur le userform1 que je veux changer en "inscrire en Hand"

Bonjour,

Lorsqu'on change le nom de l'activité et que l'on valide, ma macro modifie :

  • le nom de l'onglet,
  • le titre de la feuille,
  • remplace dans toutes les autres macros l'ancien nom par le nouveau,
Tu devrais travailler avec le CodeName au lieu du nom de l'onglet.

Il est invariable contrairement au nom, et tu n'auras plus de changement à faire dans le code.

Ca fera toujours un peu moins de gaz dans ton usine

Dans le projet tu as :

Feuil28(bb) Feuil28 est son CodeName

Sheets("bb").Cells(Rows.Count, 1)

devient

Feuil28.Cells(Rows.Count, 1)

et ne change plus.

Tu n'étais pas sur un autre forum avec ce pseudo il y a quelques mois (années ?) ?

eric

re.,

pouvez-vous me dire à quoi sert ce code,

    
    For Each VBComp In Wb.VBProject.VBComponents
        For i = 1 To VBComp.CodeModule.CountOfLines
            Cible = VBComp.CodeModule.Lines(i, 1)
            Cible = Replace(Cible, Ancien, Nouveau)
            VBComp.CodeModule.ReplaceLine i, Cible
        Next i
    Next VBComp
    

Ca fera toujours un peu moins de gaz dans ton usine

Dans le projet tu as :

Feuil28(bb) Feuil28 est son CodeName

Code : Tout sélectionner

Sheets("bb").Cells(Rows.Count, 1)

devient

Code : Tout sélectionner

Feuil28.Cells(Rows.Count, 1)

Effectivement l'idée est intéressante ! Je testerai.

Merci.

A j'oubliai :

Tu n'étais pas sur un autre forum avec ce pseudo il y a quelques mois (années ?) ?

C'est la 1ère fois que je suis sur un forum excel mais j'ai ce pseudo depuis des années, notamment il y a quelques années sur des jeux vidéos

Bonjour, Salut à tous !

Essaie cet ajout dans ta boucle :

    For Each VBComp In Wb.VBProject.VBComponents
        '...
        If VBComp.Name = "UserForm1" Then
            For Each Ctl In VBComp.Designer.Controls
                If TypeOf Ctl Is MSForms.CommandButton Then _
                 Ctl.Caption = Replace(Ctl.Caption, Ancien, Nouveau)
            Next Ctl
        End If
    Next VBComp

Il faut évidemment que la mention sur le libellé du bouton soit identique au nom de feuille !

Ajouter Dim Ctl As Control dans tes déclarations.

L'exécution me produit une erreur 9... Il semble cependant que cette dernière soit due à la ligne qui suit :

    Sheets("cahier AS").Range("A2").Value = TextBox1.Value

Feuille non présente dans le classeur...

En tout cas le libellé du bouton se modifie.

Cordialement.

Bonjour MFerrand,

Effectivement, lorsque j'ai voulu simplifier mon fichier pour le poster, je l'ai peut-être un peu trop simplifié... J'ai supprimé l'onglet "cahier d'AS" alors qu'une ligne de code en faisait encore mention.

Essaie cet ajout dans ta boucle :

Code : Tout sélectionner

For Each VBComp In Wb.VBProject.VBComponents

'...

If VBComp.Name = "UserForm1" Then

For Each Ctl In VBComp.Designer.Controls

If TypeOf Ctl Is MSForms.CommandButton Then _

Ctl.Caption = Replace(Ctl.Caption, Ancien, Nouveau)

Next Ctl

End If

Next VBComp

Il faut évidemment que la mention sur le libellé du bouton soit identique au nom de feuille !

Ajouter Dim Ctl As Control dans tes déclarations.

J'ai essayé ton ajout mais ça ne marche pas il plante sur

For Each VBComp In Wb.VBProject.VBComponents

Mais je ne suis pas sûr d'avoir mis la déclaration où il fallait.

Pourrais-tu me renvoyer le fichier avec le code entré ? STP ?

Bonjour,

Je n'ai pas gardé de fichier...

Cette ligne qui initialise ta boucle existait déjà dans ton code ! Je n'ai pas touché à ton code préexistant, juste introduit une condition dans ta boucle pour détecter lorsque le VBComp traité est UserForm1, et lorsque c'est le cas, boucler sur les contrôles pour modifier le Caption du bouton concernée.

La déclaration de la variable Ctl est à faire avec les autres, je ne crois pas que cela puisse provoquer une erreur de toute façon.

Vois ce que tu as pu modifier au fil des manipulations, ou part d'une version ou tu n'as pas cette erreur.

Cordialement.

Re-Bonjour,

Un grand merci à toi MFerrand, j'ai réussi à intégrer ton code et ça fonctionne (presque) parfaitement.

J'ai même réussi en réintégrant d'autres variables "nouveau" et "ancien" à conserver la mention "Inscrire en ..." avec seulement le nom de l'activité qui change.

Par contre ce que je n'explique pas c'est que ça marche parfaitement, puis, quand j'ouvre l'userform1 pour vérifier si le caption de mon bouton est correct et que je réessaie, ça plante une fois, puis ça remarche.

Y-a-t'il quelque chose à activer dans mon code ?

Je vous joints à nouveau le fichier.

36cahier-as-auto.xlsm (164.32 Ko)
Rechercher des sujets similaires à "vba mofifier caption commandbutton macro"