Simplification de code

cathodique

XLDnaute Barbatruc
Bonjour,

Suite à une discussion Boisgontier m'avait donné une solution. Je l'en remercie aussi d'avoir mis mon fichier sur son site.
http://boisgontierjacques.free.fr/fichiers/Formulaire/FormComboboxCascadeListBox.xls
Maintenant ma question est la suivante, comment simplifier le code. En effet, les données des différents objets (combobox) sont extraites d'une même source (plage de la feuille). Cette plage a été mise dans un tableau.
Dim f est déclaré en global, désigne la feuille, mais pourquoi étant obligé de faire un set f= sheets("notre_feuille") et il en va de même pour la dernière ligne non vide et le tableau.
Dlg est la dernière ligne de ma même feuille et Tbl représente la même plage de la même feuille.
Autrement, peut-on mettre les lignes de code signalées avec astérisques (***) en commun aux différentes procédures?
VB:
Dim f
Private Sub UserForm_Initialize()
    Set f = Sheets("BD")                                            
    Set MonDico = CreateObject("Scripting.Dictionary")
    Dlg = f.Range("A" & Rows.Count).End(xlUp).Row        '***
    Tbl = f.Range("A2:J" & Dlg).Value                           '***
    For i = LBound(Tbl) To UBound(Tbl)
       If Tbl(i, 3) <> "" Then MonDico(Tbl(i, 3)) = Tbl(i, 3)
    Next i
    Me.Cb1.List = MonDico.items
End Sub
Private Sub Cb1_Change()
    Set MonDico = CreateObject("Scripting.Dictionary")
    Dlg = f.Range("A" & Rows.Count).End(xlUp).Row        '***
    Tbl = f.Range("A2:J" & Dlg).Value                           '***
    For i = LBound(Tbl) To UBound(Tbl)
      If Tbl(i, 3) = Me.Cb1 Then MonDico(Tbl(i, 4)) = Tbl(i, 4)
    Next i
    Me.Cb2.List = MonDico.items
    Me.Cb2.ListIndex = -1
End Sub

Private Sub Cb2_Change()
    Set MonDico = CreateObject("Scripting.Dictionary")
    Dlg = f.Range("A" & Rows.Count).End(xlUp).Row        '***
    Tbl = f.Range("A2:J" & Dlg).Value                           '***
    Me.ListBox1.Clear
    j = 0
    For i = LBound(Tbl) To UBound(Tbl)
      If Tbl(i, 3) = Me.Cb1 And Me.Cb2 = Tbl(i, 4) Then
        Me.ListBox1.AddItem
        For k = 0 To 1
          Me.ListBox1.List(j, k) = Tbl(i, k + 1)
        Next k
        For k = 4 To 8
          Me.ListBox1.List(j, k - 2) = Tbl(i, k + 1)
        Next k
        j = j + 1
      End If
   Next i
End Sub
Private Sub ListBox1_Click()
  Dim lig, k
  lig = Me.ListBox1.ListIndex
  For k = 1 To 7
    Me("t" & k) = Me.ListBox1.List(lig, k - 1)
  Next k
End Sub
En vous remerciant. Bonne journée à tous.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Simplification de code

Bonjour.
Bien sûr que vous pouvez mettre d'autres variables globales. Mais déclarez les avec un type explicite c'est mieux.
Et pour des ComboBox liées, je rappelle que j'ai un module de classe qui s'occupe de toute la gestion de leur changement.
Et comme cet objet à besoin de connaître la plage pour travailler, il la garde à votre disposition en permanence en tant que propriété PlgTablo, et désormais il a aussi une propriété Lignes, de type ListRows, utilisable si un tableau Excel est concerné.
 

laetitia90

XLDnaute Barbatruc
Re : Simplification de code

bonjour cathodique :) Dranreb:)

en passant par un "tablo" & reutilisation des memes variables

Code:
Option Explicit
Dim t(), tx, i As Long, x As Long, z As Byte, m As Object
Private Sub UserForm_Initialize()
 t = Feuil1.Range("a2:j" & Feuil1.Cells(Rows.Count, 1).End(3).Row)
 Set m = CreateObject("Scripting.Dictionary")
 For i = 1 To UBound(t): m(t(i, 3)) = "": Next i
 Cb1.List = m.keys
 End Sub
Private Sub Cb1_Change()
 Cb2.Clear
 Set m = CreateObject("Scripting.Dictionary")
 For i = 1 To UBound(t)
 If t(i, 3) = Cb1 Then m(t(i, 4)) = ""
 Next i
 Cb2.List = m.keys
End Sub
Private Sub Cb2_Change()
ReDim tx(1 To UBound(t), 1 To 10)
For i = 1 To UBound(t)
If t(i, 3) = Cb1 And Cb2 = t(i, 4) Then
x = x + 1
For z = 1 To 10
tx(x, z) = t(i, z)
Next z: End If: Next i
ListBox1.Clear
ListBox1.List = tx
End Sub
Private Sub ListBox1_Click()
For z = 1 To 8
If z = 2 Then z = 3
Me("T" & z) = ListBox1.List(ListBox1.ListIndex, z - 1)
Next z
End Sub
 

cathodique

XLDnaute Barbatruc
Re : Simplification de code

Bonjour Laetitia, Dranreb, le forrum,

Merci beaucoup. Désolé, si je réponds en retard, moins de temps libre.

@Dranreb, Ton fichier de combosLiés en ma possession. Il faut que je m'y mette aux fonctions et aux modules de classe car je ne les maitrise pas du tout. Merci.

@Laetitia, merci pour ton code que je testerai un peu plus tard. Je reviendrai pour rendre compte.


Encore merci et bonne journée.
 

cathodique

XLDnaute Barbatruc
Re : Simplification de code

Bonsoir,

Comme convenu, je reviens au rapport.

@Laetitia, ça plante au niveau du code de la listBox (ligne avec ***), code erreur voir image Erreur ListBox.JPG
VB:
Private Sub ListBox1_Click()
For z = 1 To 8
If z = 2 Then z = 3
Me("T" & z) = ListBox1.List(ListBox1.ListIndex, z - 1) '***
Next z
End Sub

@Dranreb, en fin de compte je n'ai pas le fichier dont tu parlais. J'ai effectué des recherches et je n'ai pas trouvé ton fichier. Par contre, j'ai trouvé plusieurs fichiers dans lesquels tu avais intégré tes comboliées. Pourrais-tu me joindre le lien de ton dernier fichier.

Merci beaucoup à vous deux. Bonne soirée.
 

Dranreb

XLDnaute Barbatruc
Re : Simplification de code

Ben je joins le fichier d'où je tire toujours les module de service nécessaires aux classeurs joints des demandeurs.
Il n'y a besoin que des modules standard de service MSujetCBx et Utilit, et des modules de classe ComboBoxLiées, ComboBoxMmbr et TableIndex. Touts les évènements, propriétés et méthodes sont expliqués dans le module ComboBoxLiées, pour ce qui est de leur mise en œuvre.
 

Pièces jointes

  • CbxLiéesSsDico.xlsm
    186.6 KB · Affichages: 39
  • CbxLiéesSsDico.xlsm
    186.6 KB · Affichages: 33
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Simplification de code

Attention, ta réponse étant venue bien vite, je signale que j'avais joint par erreur un vieux CBxLiéesSsDico.xls. Désormais c'est bien un .xlsm

N’hésite pas à me demander tout éclaircissement quant à l'utilisation de tout ça. C'est mon bébé et j'ai envie de le défendre.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Re : Simplification de code

Re Dranreb,

Merci beaucoup, j'apprécie ta gentillesse. Comme je l'avais précisé dans mes précédents posts. Je dois me mettre aux fonctions (apprendre à combiner des fonctions avec des procédures) les modules de classe.

J'aime bien comprendre le déroulement des procédures. j'utilise beaucoup le pas à pas. J'ai beaucoup de temps à comprendre les arrays (et je fais encore beaucoup d'erreurs).

Je te comprends, et et je vais faire de mon mieux pour te faire un retour.

Encore une question par rapport au code de Leatitia, que fait le x=x+1 (***)?
VB:
Private Sub Cb2_Change()
ReDim tx(1 To UBound(t), 1 To 10)
For i = 1 To UBound(t)
If t(i, 3) = Cb1 And Cb2 = t(i, 4) Then
x = x + 1  '(***)
For z = 1 To 10
tx(x, z) = t(i, z)
Next z: End If: Next i
ListBox1.Clear
ListBox1.List = tx
End Sub

Merci beaucoup. Bonne soirée.
 

Dranreb

XLDnaute Barbatruc
Re : Simplification de code

Ben ça ajoute 1 à la variable x.
Elle ne semble pas déclarée, encore qu'elle pourrait être globale, donc c'est sans doute un Variant, à Empty au départ, ce qui autorise je pense à lui ajouter 1. Je ne sais pas, moi je déclare tout, et ce genre de variable: As Long.

Mais vous voyez, ce code s'écrirait comme ça avec un ComboBoxLiées :
VB:
Private Sub CL_Résultat(Lignes() As Long)
Dim Tx(), N As Long, L As Long, C As Long
ReDim Tx(1 To UBound(Lignes), 1 To 10)
For N = 1 To UBound(Lignes)
   L = Lignes(N)
   For C = 1 To 10
      Tx(N, C) = t(L, C) ' t étant supposé global
      Next C, L
ListBox1.List = Tx
End Sub
Plus besoin de vérifier si les lignes correspondent aux ComboBox, la table Lignes ne contient justement que les numéros des lignes qui y correspondent. Résultat est un évènement de l'objet ComboBoxLiées. Il est précédé du décret d'un autre évènement, Change, qui aura déjà indiqué s'il y a des lignes et si donc Résultat allait suivre.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Re : Simplification de code

Re,

Ben ça ajoute 1 à la variable x
ça c'était une évidence. En fait, je n'ai pas compris à quoi ça sert. ça incrémente la variable x pour alimenter la listbox. Comme tu dis, c'est un variant IsEmpty au départ.

Je te remercie beaucoup pour tes explications. Je ne code que pour le plaisir et quand j'en ai le temps.
J'espère parvenir à bien exploiter ton fichier.

Encore merci.
 

Discussions similaires

Réponses
3
Affichages
608

Statistiques des forums

Discussions
312 777
Messages
2 092 029
Membres
105 154
dernier inscrit
lorfeluche