XL 2021 Enregistrer les modifications faites par VBA sur un Userform

mojales

XLDnaute Nouveau
Bonjour à tous,

Je cherche une solution afin de faire une modification permanente d'un Userform, plus particulièrement des propriérés d'un Userform.
Je m'explique :
Dans mon programme j'ai plusieurs Userform, chacun possède plusieurs buttonCommand.
Avec un module de classe, j'ouvre une macro a chaque click qui permet de changer le caption et/ou le backcolor.

Par contre, je ne sais pas comment faire pour enregistrer ces modifications lors de la réouverture du fichier.
A chaque nouvelle ouverture du fichier, les modifications sont perdues et le Userform s'initialise comme à l'origine.

Je vous ai joint une partie du fichier pour comprendre ma demande.

Merci à vous.

Mojales
 

Pièces jointes

  • Nouveau Feuille de calcul Microsoft Excel (3).xlsm
    33.1 KB · Affichages: 13
Solution
Bonjour @mojales :), @patricktoulon ;),

Une solution possible qui utilise une feuille "très cachée" pour stocker la couleur de fond, la couleur du texte et le caption des commanbuttons de l'userform "Userform1".
Le code est relativement simple, concis et je pense assez compréhensible.

Module de classe "classe1" :
  • on stocke le nom du contrôle sur lequel on a cliqué
  • on lance l'userform "Statuts"

Userform "Statuts" :
  • suivant l'option choisie, on applique les nouvelles couleurs ou le nouveau texte au commandbutton sur lequel on a cliqué
  • et on sauvegarde les couleurs appliquées ou le nouveau caption du bouton sur lequel on a cliqué sur la feuille cachée "userform"...

patricktoulon

XLDnaute Barbatruc
re
Bonjour
tu a 2 solutions
la 1ère peut même se décomposer en plusieurs subsolutions()
elle consiste à la base a mémoriser dans une feuille prévue a cet effet les properties que tu veux mémoriser

la seconde
consiste en une fonction dans un module standard et appelée à la fermeture de l'usf
de modifier en dur les propriété en passant pas la collection vbcomponents
plus précisément le vbcomponent("nom du userform").designer
bien entendu un delay imposé pour temps de fermeture est requis

voila voila ;)
si tu adopte une de ces solutions dis le moi et je te filerais un coup de pied heu... de main pardon
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @mojales :), @patricktoulon ;),

Une solution possible qui utilise une feuille "très cachée" pour stocker la couleur de fond, la couleur du texte et le caption des commanbuttons de l'userform "Userform1".
Le code est relativement simple, concis et je pense assez compréhensible.

Module de classe "classe1" :
  • on stocke le nom du contrôle sur lequel on a cliqué
  • on lance l'userform "Statuts"

Userform "Statuts" :
  • suivant l'option choisie, on applique les nouvelles couleurs ou le nouveau texte au commandbutton sur lequel on a cliqué
  • et on sauvegarde les couleurs appliquées ou le nouveau caption du bouton sur lequel on a cliqué sur la feuille cachée "userform"

Userform "Userform1" :
Dans la procédure UserForm_Initialize, on applique les couleurs et textes précédemment sauvegardées. Quand l'information est manquante on ne fait rien, ce qui revient à appliquer les couleurs et textes mis à la création du Userform1.

La feuille qui contient les données des couleurs et captions s'appelle "userform".
Elle a la propriété "xlSheetVeryHidden". Pour faire apparaitre cette feuille :
  • ouvrir l'éditeur VBA
  • dans la fenêtre VBAProject, sélectionner la feuille de nom (Userform)
  • dans la fenêtre "Propriétés" (si elle n'apparait pas, appuyer sur la touche de fonction F4)
  • Passez l'option "Visible" de "xlSheetVeryHidden" à "1 - xlSheetVisible"

nota : une fois Userform1 refermé, on peut modifier les couleurs simplement en modifiant les couleurs du fond et du texte des cellules H1 à H4sur la feuille de calcul cachée "userform". Au prochain lancement de Userform1, les nouvelles couleurs seront appliquées.
 

Pièces jointes

  • mojales- Modif Userform- v1.xlsm
    37.9 KB · Affichages: 14
Dernière édition:

mojales

XLDnaute Nouveau
Salut @mapomme et @patricktoulon,

D'abord merci à tous les deux pour vos réponses Ultra rapides.

J'ai opté pour la solution de @mapomme, j'avoue que le fichier en pièces jointe m'a beaucoup aidé.

Le fichier original que je créé contient quatres "Userform" avec plusieurs "ButtonCommand".

J'ai donc encore bricolé mon code :
  • Création de quatres feuilles, une par Userform pour stocker les données ("Caption", "BackColor" et "Forecolor").
  • Création d'une variable qui stocke le nom de l"Userform" qui contient le bouton sur lequel on a cliqué afin de stocker les données dans la feuille qui correspond à l"Userform". (j'ai utilisé la fonction .parent)
Bref, ca ne s'arrête jamais. Fichier en constante amélioration.

Encore merci pour vos réponses à tous les deux.

P.S : @patricktoulon, j'avais déjà lu plusieurs réponses sur différents forum sur la fonction vbcomponent("nom du userform").designer mais je n'ai jamais réussi à la faire fonctionner.

A bientôt pour de nouvelles Macro.

Mojales
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @patricktoulon :),

Alors là, chapeau bas !
1693238076265.png
Et Patrick devient youtuber. Patrick nous offrait ses codes et maintenant il ajoute l'image et le son! 👏
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ah mon @patricktoulon, quelle belle démo ! Merci ! Je crois que j'ai compris 😎 .

Cependant j'ai 2 petites remarques:
  • En enlevant le On Error grâce à l'instruction modifiée If bt.Tag > 56 Then btTag = 1 et pas 0 qui te fait planter après 56 clicks sur bt.BackColor = ThisWorkbook.Colors(bt.Tag)) apparaît une erreur (couverte par le On Error) lorsqu'on quitte sans avoir modifié les couleurs.
    Il a fallu que je rajoute cette instruction en Activate() : TabColors(i) = Me.Controls("Image" & i).Tag
    C'est un détail.

  • Cependant, ce qui me pose question c'est cette attente que tu dis nécessaire et dont je pense qu'elle est questionnable.
    J'ai fait un version (ci-dessous):
    - avec OnTime -> quelle que soit la durée, ça fonctionne
    - avec Call direct (sans attente) -> ça fonctionne
    - avec boucle attente UserForm.Visible (UserForm complètement disparu) -> ça ne fonctionne pas

    J'ai l'impression que pour modifier le UserForm à l'Unload, il faut qu'il soit encore là, ce qui pose la question du OnTime mais l'appel à MemoAttente() est quand même synchrone dans le QueryClose().
 

Pièces jointes

  • exemple userform memo couleur modif.xlsm
    34.4 KB · Affichages: 2
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ok, le lancement du module de SaveUserForm est fait en OnTime dans le UserForm, donc l'Unload est fait quand il se lance.
S'il faut un OnTime, d'ailleurs tu peux le faire uniquement à ce niveau. Inutile d'en refaire un ensuite. C'est ce que j'ai fait dans cette version.

Il est vrai que je n'ai pas besoin de tempo sur mon PC, mais je me demande si c'est nécessaire sur un PC plus lent car même si le OnTime est sans tempo, je ne crois pas qu'il se déclencherait si le processus de Unload n'était pas terminé. A vérifier !
 

Pièces jointes

  • exemple userform memo couleur modif.xlsm
    34.5 KB · Affichages: 9
Dernière édition:

Dudu2

XLDnaute Barbatruc
Ok, pour le UserForm.Visible, j'avais retiré mes posts (tu les as captés au vols avant leur suppression) car je sais très bien que toute référence à une propriété du UserForm a pour effet de le Loader et d'exécuter la fonction UserForm_Initialize().

Ce qui me questionne toujours c'est ce besoin de temporisation sur le déclenchement asynchrone par OnTime Now de la fonction d'enregistrement des éléments du UserForm.
Dans le post #11, j'ai posé cette hypothèse:
même si le OnTime est sans tempo, je ne crois pas qu'il se déclencherait si le processus de Unload n'était pas terminé. A vérifier !
Ce serait bien que nos amis lecteurs et toi-même (si tu as un PC lent) essaient le fichier du post #11.
D'ailleurs moi-même, j'ai un vieux Laptop de 12 ans d'age sur lequel je vais faire le test.
 

Dudu2

XLDnaute Barbatruc
C'est sûr qu'à l'Unload d'un UserForm, Excel fait des tas de trucs pour dégager tout le contexte.
Même si ça prend 2 minutes, la question que je pose est de savoir si Excel lancerait une fonction OnTime Now avant que ce boulot de 2 minutes soit terminé.
Perso je ne le crois pas mais je n'en suis évidemment pas sûr à 100% d'où l'idée d'essayer.
Y a pas de quoi en faire un plat.
 

Dudu2

XLDnaute Barbatruc
Et pour rebondir sur la temporisation, je croyais que le Application.OnTime Now ne fonctionnait qu'en multiples de secondes.
Avec ton:
VB:
Application.OnTime Now + 0.000005, "memo" ' pour une seconde il faut 0.00001
il semble que tu vises la 1/2 seconde. Est-ce possible ?
 

Discussions similaires

Statistiques des forums

Discussions
314 716
Messages
2 112 155
Membres
111 446
dernier inscrit
arkeo