Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

reduire cette macro plus simplement

18 réponses
Avatar
magic-dd
bonsoir =E0 tous

dans le but d'alleger et d'ameliorer mon programme de compte, j'ai un
userform avec 12 label correspondant aux mois de l'ann=E9e.

comment peut on simplifier cela car dans chaque label nous retrouvons
ce code commun qui est

FormSaisie.Caption =3D "Mois de " & ActiveSheet.Name
TextBox1 =3D ActiveSheet.Name
titre =3D ActiveSheet.Name
FormSaisie.SoldeEpargne.Value =3D CStr(ActiveSheet.Range("T301")) +
" =80"
FormSaisie.SoldeEnzo.Value =3D CStr(ActiveSheet.Range("T307")) + "
=80"
FormSaisie.SoldeManon.Value =3D CStr(ActiveSheet.Range("T313")) + "
=80"
valide_soldes
COLORIE
Call plus

voici donc un bout de code pour 2 labels

Private Sub Label2_Click()
Sheets("FEVRIER").Select
FormSaisie.Caption =3D "Mois de " & ActiveSheet.Name
TextBox1 =3D ActiveSheet.Name
titre =3D ActiveSheet.Name
FormSaisie.SoldeEpargne.Value =3D CStr(ActiveSheet.Range("T301")) +
" =80"
FormSaisie.SoldeEnzo.Value =3D CStr(ActiveSheet.Range("T307")) + "
=80"
FormSaisie.SoldeManon.Value =3D CStr(ActiveSheet.Range("T313")) + "
=80"
valide_soldes
COLORIE
Call plus
End Sub

Private Sub Label3_Click()
Sheets("AVRIL").Select
FormSaisie.Caption =3D "Mois de " & ActiveSheet.Name
TextBox1 =3D ActiveSheet.Name
titre =3D ActiveSheet.Name
FormSaisie.SoldeEpargne.Value =3D CStr(ActiveSheet.Range("T301")) +
" =80"
FormSaisie.SoldeEnzo.Value =3D CStr(ActiveSheet.Range("T307")) + "
=80"
FormSaisie.SoldeManon.Value =3D CStr(ActiveSheet.Range("T313")) + "
=80"
valide_soldes
COLORIE
Call plus
End Sub

merci pour l'aide

10 réponses

1 2
Avatar
magic-dd
bonsoir

je réédite ma réponse car a priori elle n'a pas été prise en comp te

donc, le code est place dans le module du formulaire qui se nomme
FormSaisie

le nom de mes objets

SoldeEpargne, SoldeEnzo, SoldeManon sont des textbox dans mon
FormSaisie et reprennent des valeurs dans la page du mois concerné

en ce qui concerne le
TextBox1 = .Name
titre = .Name

le textbox1 me donne le nom de ma feuille sur mon FormSaisie

l'autre est peut être de trop, je te l'accorde

pour le signe € je n'ai trouvé que cette solution.

donc pour mieux te rendre compte de ce que j'ai fais, comme un
débutant, je t'envoie le fichier "matrice".

http://cjoint.com/?cjv1eDrQj4

merci de ton aide car elle est très enrichissante.

merci


Si tu ne prends pas le temps de dire où tu écris ton code
a) module du formulaire ou dans un module standard
b) les noms de tes objets représente quoi ?
il est plus hasardeux d'écrire du code ...

With ActiveSheet
    Caption = "Mois de " & .Name
    TextBox1 = .Name
    titre = .Name
    SoldeEpargne.Value = .Range("T301") & " €"
    SoldeEnzo.Value = .Range("T307") & " € "
    SoldeManon.Value = .Range("T313") & " € "
End With

Pourquoi utiliser 2 variables pour la même chose ?
TextBox1 = .Name
    titre = .Name

Le fait d'ajouter le symbole "€" ceci signifie que si tu dois
récupérer la valeur des contrôles pour des opérations
mathématiques, tu devras te défaire de ces symboles.

"magic-dd" a écrit dans le message de groupe de d iscussion :

bonsoir à tous

dans le but d'alleger et d'ameliorer mon programme de compte, j'ai un
userform avec 12 label correspondant aux mois de l'année.

comment peut on simplifier cela car dans chaque label nous retrouvons
ce code commun qui est

 FormSaisie.Caption = "Mois de " & ActiveSheet.Name
    TextBox1 = ActiveSheet.Name
    titre = ActiveSheet.Name
    FormSaisie.SoldeEpargne.Value = CStr(ActiveSheet.Range("T301")) +
" €"
    FormSaisie.SoldeEnzo.Value = CStr(ActiveSheet.Range("T307")) + "
€"
    FormSaisie.SoldeManon.Value = CStr(ActiveSheet.Range("T313")) + "
€"
    valide_soldes
    COLORIE
    Call plus

voici donc un bout de code pour 2 labels

Private Sub Label2_Click()
    Sheets("FEVRIER").Select
    FormSaisie.Caption = "Mois de " & ActiveSheet.Name
    TextBox1 = ActiveSheet.Name
    titre = ActiveSheet.Name
    FormSaisie.SoldeEpargne.Value = CStr(ActiveSheet.Range("T301")) +
" €"
    FormSaisie.SoldeEnzo.Value = CStr(ActiveSheet.Range("T307")) + "
€"
    FormSaisie.SoldeManon.Value = CStr(ActiveSheet.Range("T313")) + "
€"
    valide_soldes
    COLORIE
    Call plus
End Sub

Private Sub Label3_Click()
    Sheets("AVRIL").Select
    FormSaisie.Caption = "Mois de " & ActiveSheet.Name
    TextBox1 = ActiveSheet.Name
    titre = ActiveSheet.Name
    FormSaisie.SoldeEpargne.Value = CStr(ActiveSheet.Range("T301")) +
" €"
    FormSaisie.SoldeEnzo.Value = CStr(ActiveSheet.Range("T307")) + "
€"
    FormSaisie.SoldeManon.Value = CStr(ActiveSheet.Range("T313")) + "
€"
    valide_soldes
    COLORIE
    Call plus
End Sub

merci pour l'aide


Avatar
michdenis
Je t'ai fait un fichier exemple avec module de classe

http://cjoint.com/?ckpkxamccS

Le code dans le formulaire est plus court.. ;-))




"magic-dd" a écrit dans le message de groupe de discussion :

bonsoir

je réédite ma réponse car a priori elle n'a pas été prise en compte

donc, le code est place dans le module du formulaire qui se nomme
FormSaisie

le nom de mes objets

SoldeEpargne, SoldeEnzo, SoldeManon sont des textbox dans mon
FormSaisie et reprennent des valeurs dans la page du mois concerné

en ce qui concerne le
TextBox1 = .Name
titre = .Name

le textbox1 me donne le nom de ma feuille sur mon FormSaisie

l'autre est peut être de trop, je te l'accorde

pour le signe € je n'ai trouvé que cette solution.

donc pour mieux te rendre compte de ce que j'ai fais, comme un
débutant, je t'envoie le fichier "matrice".

http://cjoint.com/?cjv1eDrQj4

merci de ton aide car elle est très enrichissante.

merci


Si tu ne prends pas le temps de dire où tu écris ton code
a) module du formulaire ou dans un module standard
b) les noms de tes objets représente quoi ?
il est plus hasardeux d'écrire du code ...

With ActiveSheet
Caption = "Mois de " & .Name
TextBox1 = .Name
titre = .Name
SoldeEpargne.Value = .Range("T301") & " €"
SoldeEnzo.Value = .Range("T307") & " € "
SoldeManon.Value = .Range("T313") & " € "
End With

Pourquoi utiliser 2 variables pour la même chose ?
TextBox1 = .Name
titre = .Name

Le fait d'ajouter le symbole "€" ceci signifie que si tu dois
récupérer la valeur des contrôles pour des opérations
mathématiques, tu devras te défaire de ces symboles.

"magic-dd" a écrit dans le message de groupe de discussion :

bonsoir à tous

dans le but d'alleger et d'ameliorer mon programme de compte, j'ai un
userform avec 12 label correspondant aux mois de l'année.

comment peut on simplifier cela car dans chaque label nous retrouvons
ce code commun qui est

FormSaisie.Caption = "Mois de " & ActiveSheet.Name
TextBox1 = ActiveSheet.Name
titre = ActiveSheet.Name
FormSaisie.SoldeEpargne.Value = CStr(ActiveSheet.Range("T301")) +
" €"
FormSaisie.SoldeEnzo.Value = CStr(ActiveSheet.Range("T307")) + "
€"
FormSaisie.SoldeManon.Value = CStr(ActiveSheet.Range("T313")) + "
€"
valide_soldes
COLORIE
Call plus

voici donc un bout de code pour 2 labels

Private Sub Label2_Click()
Sheets("FEVRIER").Select
FormSaisie.Caption = "Mois de " & ActiveSheet.Name
TextBox1 = ActiveSheet.Name
titre = ActiveSheet.Name
FormSaisie.SoldeEpargne.Value = CStr(ActiveSheet.Range("T301")) +
" €"
FormSaisie.SoldeEnzo.Value = CStr(ActiveSheet.Range("T307")) + "
€"
FormSaisie.SoldeManon.Value = CStr(ActiveSheet.Range("T313")) + "
€"
valide_soldes
COLORIE
Call plus
End Sub

Private Sub Label3_Click()
Sheets("AVRIL").Select
FormSaisie.Caption = "Mois de " & ActiveSheet.Name
TextBox1 = ActiveSheet.Name
titre = ActiveSheet.Name
FormSaisie.SoldeEpargne.Value = CStr(ActiveSheet.Range("T301")) +
" €"
FormSaisie.SoldeEnzo.Value = CStr(ActiveSheet.Range("T307")) + "
€"
FormSaisie.SoldeManon.Value = CStr(ActiveSheet.Range("T313")) + "
€"
valide_soldes
COLORIE
Call plus
End Sub

merci pour l'aide


Avatar
magic-dd
merci michdenis

mais comment dois je faire
je copie tous les codes dans divers modules

bref je m'en vais battre le record de la brasse coulée.

merci de ton aide


On 8 fév, 15:11, "michdenis" wrote:
Je t'ai fait un fichier exemple avec module de classe

http://cjoint.com/?ckpkxamccS

Le code dans le formulaire est plus court.. ;-))



Avatar
michdenis
A) D'abord tes contrôles étiquettes ont tous un nom de cette forme :
Label_1, Label_2 ...
B ) Le module "Étiquettes" n'est pas un module standard... en conséquence,
tu dois ajouter à ton projet un module de classe
Barre des menus / insertion / module de classe et tu lui donne le même
nom que dans la projet que je t'ai donné.
C ) Pour le reste, tu peux te contenter de copier le code de chaque module
dans un module équivalent dans ton programme.
D ) L'important est de tenter de comprendre comme cela fonctionne.
En résumé :
Le module de classe "Étiquettes", c'est une ""nouvelle classe objet"
Cette classe objet n'a qu'un événement de défini : celui à savoir ce
qui se passe lorsque l'on clique sur un contrôle "Étiquette"
Dans le module Standard, la variable TLabel() représente un tableau (array)
qui va contenir tous les labels de ton projet qui appartient à cette classe.
Pour ce faire, cela se fait à l'aide de la procédure "Initialisation_Classe_TLabel"
Le tableau Tlabel() contiendra 12 objets chacun représentant à la fois un
contrôle "label" de ton formulaire ainsi que le code contenu dans le module
"Étiquette". Chaque instance de l'objet "étiquette est indépendant et sera en
mémoire le temps que ton formulaire demeurera charger en mémoire.
E ) Et pour finir, quand tu cliques sur un de tes étiquettes qui est devenu une
instance de la classe étiquette, le code du module de classe "étiquette"
s'exécute. De là , il appelle la procédure
"General_Label(F As FormSaisie, Mois As String)" en passant à cette procédure
2 paramètres : 1) le formulaire dont il provient et 2 ) le mois qu'il représente.

Voilà. Si c'est la première fois que tu touches au module de classe...
ça peut paraître difficile d'accès... mais je t'ai donné un aperçu de ce
que c'était en tentant de simplifier les explications.

Maintenant, à ton tour de t'amuser ! ;-)



"magic-dd" a écrit dans le message de groupe de discussion :

merci michdenis

mais comment dois je faire
je copie tous les codes dans divers modules

bref je m'en vais battre le record de la brasse coulée.

merci de ton aide


On 8 fév, 15:11, "michdenis" wrote:
Je t'ai fait un fichier exemple avec module de classe

http://cjoint.com/?ckpkxamccS

Le code dans le formulaire est plus court.. ;-))



Avatar
magic-dd
WAOUH !!!!

quelles explications mais c'est la premier fois que je vois cela

j'ai bien copié le module de classe, inserer un nouveau module et
copier le code de ton formsaisie dans le mien mais rien y fait

ca genere des erreurs

bref, la m......

j'ai supprimé tous les codes Private Sub Label1 à12_Click()

voici donc ma matrice modifiée mais pas opérationelle

au fait qu'en penses tu de ce programme de comptes bancaires?

qu'est ce que ca doit etre agreable d'etre bon, n'est ce pas?


On 8 fév, 20:22, "michdenis" wrote:
A) D'abord tes contrôles étiquettes ont tous un nom de cette forme :
    Label_1, Label_2 ...
B ) Le module "Étiquettes" n'est pas un module standard... en conséqu ence,
     tu dois ajouter à ton projet un module de classe
      Barre des menus / insertion / module de classe et tu lui donn e le même
      nom que dans la projet que je t'ai donné.
C ) Pour le reste, tu peux te contenter de copier le code de chaque modul e
     dans un module équivalent dans ton programme.
D ) L'important est de tenter de comprendre comme cela fonctionne.
    En résumé :
    Le module de classe "Étiquettes", c'est une ""nouvelle classe o bjet"
    Cette classe objet n'a qu'un événement de défini : celui à savoir ce
    qui se passe lorsque l'on clique sur un contrôle "Étiquette"
    Dans le module Standard, la variable TLabel() représente un tab leau (array)
    qui va contenir tous les labels de  ton projet qui appartient à cette classe.
    Pour ce faire, cela se fait à l'aide de la procédure "Initial isation_Classe_TLabel"
    Le tableau Tlabel() contiendra 12 objets chacun représentant à la fois un
    contrôle "label" de ton formulaire ainsi que le code contenu da ns le module
    "Étiquette". Chaque instance de l'objet "étiquette est indé pendant et sera en
     mémoire le temps que ton formulaire demeurera charger en m émoire.
E ) Et pour finir, quand tu cliques sur un de tes étiquettes qui est de venu une
     instance de la classe étiquette, le code du module de classe "étiquette"
     s'exécute. De là , il appelle la procédure
      "General_Label(F As FormSaisie, Mois As String)" en passant à cette procédure
      2 paramètres : 1) le formulaire dont il provient et 2 ) le mois qu'il représente.

Voilà.  Si c'est la première fois que tu touches au module de class e...
ça peut paraître difficile d'accès... mais je t'ai donné un aper çu de ce
que c'était en tentant de simplifier les explications.

Maintenant, à ton tour de t'amuser !  ;-)



Avatar
michdenis
Assure-toi d'avoir les mêmes noms pour tes contrôles "Label"
comme mentionnés dans mon message précédent. Tu dois
définir la propriété "Name" de ton module de classe du même
nom que celui de l'exemple... et conserve le même nom pour
les variables.

Si ça cloche... tu dis où .



"magic-dd" a écrit dans le message de groupe de discussion :

WAOUH !!!!

quelles explications mais c'est la premier fois que je vois cela

j'ai bien copié le module de classe, inserer un nouveau module et
copier le code de ton formsaisie dans le mien mais rien y fait

ca genere des erreurs

bref, la m......

j'ai supprimé tous les codes Private Sub Label1 à12_Click()

voici donc ma matrice modifiée mais pas opérationelle

au fait qu'en penses tu de ce programme de comptes bancaires?

qu'est ce que ca doit etre agreable d'etre bon, n'est ce pas?


On 8 fév, 20:22, "michdenis" wrote:
A) D'abord tes contrôles étiquettes ont tous un nom de cette forme :
Label_1, Label_2 ...
B ) Le module "Étiquettes" n'est pas un module standard... en conséquence,
tu dois ajouter à ton projet un module de classe
Barre des menus / insertion / module de classe et tu lui donne le même
nom que dans la projet que je t'ai donné.
C ) Pour le reste, tu peux te contenter de copier le code de chaque module
dans un module équivalent dans ton programme.
D ) L'important est de tenter de comprendre comme cela fonctionne.
En résumé :
Le module de classe "Étiquettes", c'est une ""nouvelle classe objet"
Cette classe objet n'a qu'un événement de défini : celui à savoir ce
qui se passe lorsque l'on clique sur un contrôle "Étiquette"
Dans le module Standard, la variable TLabel() représente un tableau (array)
qui va contenir tous les labels de ton projet qui appartient à cette classe.
Pour ce faire, cela se fait à l'aide de la procédure "Initialisation_Classe_TLabel"
Le tableau Tlabel() contiendra 12 objets chacun représentant à la fois un
contrôle "label" de ton formulaire ainsi que le code contenu dans le module
"Étiquette". Chaque instance de l'objet "étiquette est indépendant et sera en
mémoire le temps que ton formulaire demeurera charger en mémoire.
E ) Et pour finir, quand tu cliques sur un de tes étiquettes qui est devenu une
instance de la classe étiquette, le code du module de classe "étiquette"
s'exécute. De là , il appelle la procédure
"General_Label(F As FormSaisie, Mois As String)" en passant à cette procédure
2 paramètres : 1) le formulaire dont il provient et 2 ) le mois qu'il représente.

Voilà. Si c'est la première fois que tu touches au module de classe...
ça peut paraître difficile d'accès... mais je t'ai donné un aperçu de ce
que c'était en tentant de simplifier les explications.

Maintenant, à ton tour de t'amuser ! ;-)



Avatar
magic-dd
OK, vu

tes labels etaient nommés Label_1 et moi Label1

l'underscore etait de trop

bref

la panne se situe ici

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As
Integer)
Set TLabel() = Nothing
End Sub


erreur de compilation
impossible d'affecter à un tableau


sinon ce coup ci je mets le lien cjoint avec mon fichier modifié

merci encore de t'interesser à mon pb

http://cjoint.com/?ckv6gMDfFK



On 8 fév, 21:24, "michdenis" wrote:
Assure-toi d'avoir les mêmes noms pour tes contrôles "Label"
comme mentionnés dans mon message précédent. Tu dois
définir la propriété "Name" de ton module de classe du même
nom que celui de l'exemple... et conserve le même nom pour
les variables.

Si ça cloche... tu dis où .



Avatar
michdenis
Sous Excel 2003 et Excel 2007, cette ligne de code de cause aucune problème.
Sous les différentes versions d'excel de 97 et 2007, il y a des nuances lorsque
vient le temps de "jouer" avec des variables "tableau".

Le but de cette ligne de code est de "vider" l'espace mémoire occupé par
les différentes instances de l'objet contenu dans le tableau TLabel. En principe
cet espace mnémonique se vide d'elle même à la fermeture du formulaire. En
conséquence, elle n'est pas obligatoire. Les grands gurus s'interrogent et
nourrissent un différend quant à la disparition des variables.

Tu pourrais passer à la place cette commande Erase TLabel.
si ta version refuse, Tu peux éliminer toute la petite sub et ce n'est pas
problématique.


"magic-dd" a écrit dans le message de groupe de discussion :

OK, vu

tes labels etaient nommés Label_1 et moi Label1

l'underscore etait de trop

bref

la panne se situe ici

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As
Integer)
Set TLabel() = Nothing
End Sub


erreur de compilation
impossible d'affecter à un tableau


sinon ce coup ci je mets le lien cjoint avec mon fichier modifié

merci encore de t'interesser à mon pb

http://cjoint.com/?ckv6gMDfFK



On 8 fév, 21:24, "michdenis" wrote:
Assure-toi d'avoir les mêmes noms pour tes contrôles "Label"
comme mentionnés dans mon message précédent. Tu dois
définir la propriété "Name" de ton module de classe du même
nom que celui de l'exemple... et conserve le même nom pour
les variables.

Si ça cloche... tu dis où .



Avatar
magic-dd
bonsoir michedenis

donc suite de l'histoire

j'ai mis en place le module de classe, renommé mes labels avec un _

bon ça fonctionne, super

sauf que eh oui il y a un mais

pour les mois de fevrier, aout et decembre quand je clique sur
l'etiquette , je n'ai pas le solde en jaune comme pour les autres,
etrange puisque ce sont les seuls mois qui on un accent ( février,
décembre) et un circonflexe en août.


autre chose, quand je veux utiliser un autre formulaire, ca plante,
c'est le formulaire opefix

et la aussi ca plante sur les mois de fev, aout et déc.

je te joins mon fichier modifié avec tes exemples

merci d'y jeter un oeil, je vais regarder de mon coté pour enlever les
accents

http://cjoint.com/?clvXtgEiUC
Avatar
michdenis
Dans ton classeur original, le nom de tes feuilles n'avait pas d'accent.
Est-ce que tu as adapté le nom des feuilles dans tes formules le cas échéant ?



"magic-dd" a écrit dans le message de groupe de discussion :

bonsoir michedenis

donc suite de l'histoire

j'ai mis en place le module de classe, renommé mes labels avec un _

bon ça fonctionne, super

sauf que eh oui il y a un mais

pour les mois de fevrier, aout et decembre quand je clique sur
l'etiquette , je n'ai pas le solde en jaune comme pour les autres,
etrange puisque ce sont les seuls mois qui on un accent ( février,
décembre) et un circonflexe en août.


autre chose, quand je veux utiliser un autre formulaire, ca plante,
c'est le formulaire opefix

et la aussi ca plante sur les mois de fev, aout et déc.

je te joins mon fichier modifié avec tes exemples

merci d'y jeter un oeil, je vais regarder de mon coté pour enlever les
accents

http://cjoint.com/?clvXtgEiUC
1 2