Pour les pros : est-il possible de simplifier

  • Initiateur de la discussion Initiateur de la discussion Cougar
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Cougar

XLDnaute Impliqué
Bonsoir le forum,

Voici un code, dont plusieurs m'ont aidé à complèter, que je voudrais simplifier car il prend quelque temps pour faire la sélection des combobox et lorsque j'ajoute les informations fournies.

Est-ce possible ?

Voir le fichier joint.

Merci
 

Pièces jointes

Re : Pour les pros : est-il possible de simplifier

Bonjour,

Quelques points à améliorer:

1)Répétition de procédures identiques (cb1,cb2,cb3,cb4) en dehors des variables qu'elles utilisent. Tu devrais pouvoir les supprimer pour les remplacer par une procédure unique qui accepterait des parametres.

Code:
Private Sub cb(MyCombo As MSForms.ComboBox, MyRange As Range)

    Dim data As Collection, Lcb As Long, ccb As Range
    
    'Ces variables sont devenues locales, tu peux donc les supprimer
    'au niveau du module
    Dim thcb As New Collection, tablocb As Variant
    
    Do While thcb.Count > 0
        thcb.Remove 1
    Loop

    On Error Resume Next
    For Each ccb In MyRange.Cells
        thcb.Add ccb, CStr(ccb)
    Next ccb
    
    MyCombo.Clear
    
    For Lcb = 1 To thcb.Count
        MyCombo.AddItem thcb(Lcb)
    Next Lcb
    
    Set data = New Collection
      
    For Lcb = 1 To UBound(tablocb, 1)
        If tablocb(Lcb, 1) <> "" Then
            data.Add tablocb(Lcb, 1), CStr(tablocb(Lcb, 1))
        End If
    Next Lcb
    On Error GoTo 0
       
    For Lcb = 1 To data.Count
        MyCombo.AddItem data.Item(Lcb)
    Next Lcb
    
    Set data = Nothing
End Sub

Pour appeler cette procédure:

Code:
Call cb(ComboBox1, Range("Feuil1!b2:b24"))
Call cb(ComboBox2, Range("Feuil1!c2:c4001"))
Call cb(ComboBox3, Range("Feuil1!d2:d153"))
Call cb(ComboBox4, Range("Feuil1!a2:a5"))

2) tu utilise plusieurs fois le meme dossier dans differentes procedures, déclare une constante au niveau du module cela facilitera la maintenance.
Code:
Const Destination As String = "d:\Documents personnels\timbres\photos\"

Les modifications a apporter aux procedures sont mineures, par exemple pour CommandButton1_Click:

Code:
Sub CommandButton1_Click()
    Dim Fso As Scripting.FileSystemObject
    Dim Source As Variant, MaPhoto As Variant
    
    Source = Application.GetOpenFilename("Text Files (*.jpg), *.jpg")
    If Source = False Then Exit Sub
    
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Fso.CopyFile Source, Destination & Dir(Source), True

    ActiveCell.Value = Destination & Dir(Source)

    MaPhoto = ActiveCell.Offset(0, 0)
    Me.Image1.Picture = LoadPicture(MaPhoto)
    ActiveCell.Offset(0, 1).Select
End Sub

3)Tu peux simplifier la gestion des erreurs avant la validation comme ceci:
Code:
    Dim Msg As String
    If TextBox2.Value = "" Then Msg = "Quelle est la dénomination du timbre !"

    If ComboBox4.Value = "" Then Msg = "La dénomination est en dollar ou en cent ?"
    
    If TextBox3.Value = "" Then Msg = "Quelle est la date d'émission !"

    If TextBox4.Value = "" Then Msg = "Quelle est la description du timbre !"

    If Msg <> vbNullString Then
        MsgBox Msg, vbExclamation, "Erreur..."
        Exit Sub
    End If

4)Le code du bouton effacer:
Code:
Private Sub CmdEffacer_Click()
    Dim i As Integer
    For i = 1 To 10
        Me.Controls("TextBox" & i).Value = ""
    Next
    For i = 14 To 19
        Me.Controls("TextBox" & i).Value = ""
    Next
    For i = 1 To 4
        Me.Controls("ComboBox" & i).Clear
    Next
End Sub

5) CommandButton1_Click et CommandButton2_Click. Meme remarque qu'en 1). Ces deux procedures se ressemble bigrement, essaye de mettre ton controle image en parametre d'une seule procedure qui sera appelée par tes boutons:

Code:
Sub CommandButton2_Click()
    ProcedureUnique Me.Image2
End Sub
Sub CommandButton1_Click()
    ProcedureUnique Me.Image1
End Sub
Sub ProcedureUnique(MyImage As MSForms.Image)
    'Instructions
End Sub

C'est tout pour ce soir !! Bon tests et bonnes chance.

Tirex28/
 
Re : Pour les pros : est-il possible de simplifier

Bonne nuit Tirex28,

Merci beaucoup pour ta simplification. Cela me permettra aussi de modifier un autre userform qui lui ressemble beaucoup. J'espère qu'il sera aussi rapide dans le traitement des données.

Cougar
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour