XL 2013 Répétition de code

RENAUDcyrille

XLDnaute Nouveau
bonjour tous
J'ai des lignes de code que je doit répéter plus de 25 fois, et cela est un peu gavant car dès que je veux faire une modif dans mon code il faut le faire 25 fois.
j'ai cherché un peu partout ici et sur d'autre site mais je ne trouve pas comment faire pour réduire ces lignes répétitives. D'où mon appel à l'aide.

Voici le topo.
J'ai plusieurs groupe d'objet répétitif comme suivant :
- chaque groupe est composé d'une optionbutton qui sont indicés ex : groupe TA, j'ai optionbuttonTA1, groupe AD j'ai otionbuttonAD ... soit des groupes XX avec OptBXX1
- dans chaque groupe j'ai 2 commandbutton qui sont indicés ex ; groupe TA, j'ai commandbuttonTA11 et commandbuttonTA10, groupe AD j'ai commandbuttonAD11 et commanduttonAD10... soit des groupes XX avec des CdBXX11 et CdBXX10
- pour chaque groupe si on clique sur les CdBXX11 ont déplace de 10 points OpBXX1 vers la gauche et vers la droite pour le CdBXX10.

Voici mon code pour un groupe :
Private Sub CommandButtonTA10_Click()
If OptionButtonTA1.Left > 315 Then
OptionButtonTA1.Left = OptionButtonTA1.Left
Else
OptionButtonTA1.Left = OptionButtonTA1.Left + 10
End If
End Sub

Private Sub CommandButtonTA11_Click()
If OptionButtonTA1.Left < 10 Then
OptionButtonTA1.Left = OptionButtonTA1.Left
Else
OptionButtonTA1.Left = OptionButtonTA1.Left - 10
End If

End Sub


il y a t il possibilité via module ou module de classe de n'écrire qu'une seule fois ce code pour tous les groupes.
Pour l'instant j'ai copier 25 fois ce code en changeant les indices des OpB et CdB à chaque fois mais c'est lourd ;)

Dans l'attente de votre retour.

Si vous avez besoin de plus d'info je me tiens à votre dispo.
PS je travaille sur Excel2019 mais cela doit être compatible avec les VBA des Excels précédents car je ne serais pas le seul à utilisé le programme.
Merci
salutations
Cyrille
 
Solution
Bonjour RENAUDcyrille, Bernard,

Je vois qu'il n'y a aucun fichier joint alors j'en ai créé deux.

Le 1er fichier avec les boutons dans la feuille de calcul et ce code dans le module de classe :
VB:
Public WithEvents CB As MsForms.CommandButton

Private Sub CB_Click()
Dim OB As Object
Set OB = Feuil1.OLEObjects("OptionButton" & Left(Right(CB.Name, 4), 3))
If Right(CB.Name, 2) = "10" And OB.Left <= 315 Then OB.Left = OB.Left + 10
If Right(CB.Name, 2) = "11" And OB.Left >= 10 Then OB.Left = OB.Left - 10
End Sub
La classe est initialisée dans la Workbook_Open.

Le second fichier avec les boutons dans un UserForm et ce code dans le module de classe :
VB:
Public WithEvents CB As MsForms.CommandButton

Private Sub CB_Click()
Dim...

patricktoulon

XLDnaute Barbatruc
re
bonsoir
c'est des events jumelés qu'il faut faire
vite fait comme ca
ps je classe dans le userform
libre a vous de le faire dans un module classe
démonstration d'un exemple de procédé
VB:
Public WithEvents bouton As msforms.CommandButton
Public WithEvents opt As msforms.OptionButton

Dim maclasse() As New UserForm1

Private Sub bouton_Click() 'evenement global bouton
    opt.Value = Not opt.Value    'ici opt est bien reconnu comme etant l'optionbutton jumelé a son commandbutton
End Sub

Private Sub UserForm_Activate()
    For i = 1 To 10
        ReDim Preserve maclasse(1 To i)
        With maclasse(i)
            Set .bouton = Me.Controls("CommandButton" & i)    'integration dans la classe du bouton
            Set .opt = Me.Controls("OptionButton" & i)    'integration (dans la meme intance de la classe du bouton)  l'optionbutton
        End With
    Next
End Sub

comme vous le voyez chaque bouton reconnai son optionbutton avec le même events click pour tous
demo4.gif
 

patricktoulon

XLDnaute Barbatruc
Bonsoir patricktoulon,
moi je ne crée qu'une seule classe.
A+
tu délire job75;)

je te cite

VB:
Dim CB() As New Classe1

Private Sub CommandButton1_Click()
Dim c As Control, n%
For Each c In UserForm1.Controls
    If TypeName(c) = "CommandButton" Then
        ReDim Preserve CB(n)
        Set CB(n).CB = c 'initialise la classe'faux!!!! initialise une instance de la classe il y en a (n)
        n = n + 1
    End If
Next
UserForm1.Show
End Sub

mais tu jumelle pas
donc dans l'event de substitution tu es obligé de tricoter pour choper son jumeau
 

RENAUDcyrille

XLDnaute Nouveau
bonsoir.
Merci pour votre aide, vos code m'ont permis en plus de mieux comprendre les module de classe (en espérant que je n'ai pas compris de travers.

Merci job 75 pour ton autre solutions, mais j'ai mis en place la solution de Dranreb.

Ce sujet peut être clos, car on part sur des discutions annexes ;)
 

patricktoulon

XLDnaute Barbatruc
Ma solution n'employait qu'un seul module de classe.
nos 3 methodes n'en utilise qu'un mais tout les trois créons des instances de la classe

toi Dranreb tu les instancie dans un object collection tandis que job et moi dans un tableau

il serait impossible de faire autrement sauf créer autant d'event que de controls a classer
ce qui serait absolument ridicule vous en conviendrez :D :D :D :D

@job75 fait un msgbox cb.count a la fin du initialise ;)
et toi @Dranreb fait un msgbox ClnCBnGDOBn .count;)
 

RENAUDcyrille

XLDnaute Nouveau
Bonjour RENAUDcyrille, Bernard,

Je vois qu'il n'y a aucun fichier joint alors j'en ai créé deux.

Je n'ai pas mis mon fichier car il y a déjà plusieurs userforms, plusieurs modules et feuilles excels. J'avais peur que vous vous y perdiez ;)
je code en autoditacte sans avoir pris de cours et en recopiant des bouts de code que j'ai compris à force ;) (ex je ne sait pas trop comment conserver une variable d'une procédure pour être utilisée par une autre procédure donc je passe par une feuilles excel que je nome "Temp";)
Et les modules et modules de classe commencent à attirer mon attention pour éviter des répétitions.

Maintenant si tu veux le fichier pour l'examiner pas de soucis je te le posterais mais vous y trouverez moultes répétitions et des choses certainement pas conventionnelles ;)
sur ce Bon WE à tous et Merci pour votre aide

PS : Cyrille suffit RENAUDcyrille c'est long ;)
et votre discution de fin, beh je suis perdu ;)
 

patricktoulon

XLDnaute Barbatruc
dim maclasse() as new Laclasse <--- ca c'est le dimensionnement du tableau d'instance du module classe à 0
public withevents bouton as msforms.commandbutton <--- ca c'est l'event de substitution


private sub userform_initialise()
redim preserve maclasse(1 to 3)je dim le tableau d'instance a 3


'j'instancie la 1 et son event pilotera celui du commandbutton1
set maclasse(1).bouton=commandbuton1

'j'instancie la 1 et son event pilotera celui du commandbutton2
set maclasse(2).bouton=commandbuton2
etc.....
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
ex je ne sait pas trop comment conserver une variable d'une procédure pour être utilisée par une autre procédure
Il suffit qu'elle soit déclarée en tête du module avant toute procédure, pour qu'elle soit connue de toutes celles de celui ci, et conservée. Employez le mot Private ou Public plutôt que Dim. Avec Private elle n'est pas connue en dehors du module. Avec Public, si. Dans un module de classe, Public lui confère un statut de propriété, tout comme il confère un statut de méthode à une procédure.
 

RENAUDcyrille

XLDnaute Nouveau
Il suffit qu'elle soit déclarée en tête du module avant toute procédure, pour qu'elle soit connue de toutes celles de celui ci, et conservée. Employez le mot Private ou Public plutôt que Dim. Avec Private elle n'est pas connue en dehors du module. Avec Public, si. Dans un module de classe, Public lui confère un statut de propriété, tout il confère un statut de méthode à une procédure.
Merci pour cette info. je vais essaye de la mettre en pratique ;)

edit : cool cette info, je refléchirais différement sur mes prochains codes. Merci
 

Discussions similaires

Réponses
21
Affichages
329

Statistiques des forums

Discussions
312 380
Messages
2 087 815
Membres
103 666
dernier inscrit
gjoanou