IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Procédure trop longue


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    amateur
    Inscrit en
    Décembre 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 1
    Par défaut Procédure trop longue
    Bonjour tout le monde,

    J'ai dans un userform plusieurs case à cocher et en fonction de ça, une valeur est renvoyée dans telle ou telle cellule d'un tableau. Or il ne marque procédure trop longue.
    Comme puis je simplifier tout ça. voici une partie du code
    merci de votre aide
    Cordialement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    Private Sub CommandButton2_Click()
     
    'chaine A
            'Dépal
                '6h 13h
    If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox1 = True Then
    Range("c6:d6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("c6") = TextBox1.Value
    End If
    If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox2 = True Then
    Range("e6:f6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("E6") = TextBox1.Value
    End If
    If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox3 = True Then
    Range("g6:h6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("G6") = TextBox1.Value
    End If
    If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox4 = True Then
    Range("i6:j6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("I6") = TextBox1.Value
    End If
    If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox5 = True Then
    Range("k6:l6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("K6") = TextBox1.Value
    End If
            'Dépal
                '13h 20h
    If OptionButton109 And OptionButton154 And OptionButton158 And CheckBox1 = True Then
    Range("c6:d6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("d6") = TextBox1.Value
    End If
    If OptionButton109 And OptionButton154 And OptionButton158 And CheckBox2 = True Then
    Range("e6:f6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("f6") = TextBox1.Value
    End If
    If OptionButton109 And OptionButton154 And OptionButton158 And CheckBox3 = True Then
    Range("g6:h6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("h6") = TextBox1.Value
    End If
    If OptionButton109 And OptionButton154 And OptionButton158 And CheckBox4 = True Then
    Range("i6:j6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("j6") = TextBox1.Value
    End If
    If OptionButton109 And OptionButton154 And OptionButton158 And CheckBox5 = True Then
    Range("k6:l6").MergeCells = False ' Ne plus fusionner
    Sheets("Feuil1").Range("l6") = TextBox1.Value
    End If
            'Dépal
                'journée
    If OptionButton123 And OptionButton154 And OptionButton158 And CheckBox1 = True Then
    Range("c6:d6").MergeCells = True ' Fusionner des cellules
    Range("c6").HorizontalAlignment = xlCenter
    Sheets("Feuil1").Range("c6") = TextBox1.Value
    End If
    If OptionButton123 And OptionButton154 And OptionButton158 And CheckBox2 = True Then
    Range("e6:f6").MergeCells = True ' Fusionner des cellules
    Range("e6").HorizontalAlignment = xlCenter
    Sheets("Feuil1").Range("E6") = TextBox1.Value
    End If
    If OptionButton123 And OptionButton154 And OptionButton158 And CheckBox3 = True Then
    Range("g6:h6").MergeCells = True ' Fusionner des cellules
    Range("g6").HorizontalAlignment = xlCenter
    Sheets("Feuil1").Range("g6") = TextBox1.Value
    End If
    If OptionButton123 And OptionButton154 And OptionButton158 And CheckBox4 = True Then
    Range("i6:j6").MergeCells = True ' Fusionner des cellules
    Range("i6").HorizontalAlignment = xlCenter
    Sheets("Feuil1").Range("i6") = TextBox1.Value
    End If
    If OptionButton123 And OptionButton154 And OptionButton158 And CheckBox5 = True Then
    Range("k6:l6").MergeCells = True ' Fusionner des cellules
    Range("k6").HorizontalAlignment = xlCenter
    Sheets("Feuil1").Range("k6") = TextBox1.Value
    End If

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Vous pourriez décomposer ce code en 3 procédures dans le module de votre Userform.

    Exemple :

    Le bouton CommandButton2 ferait appel aux procédures Chaine_A_Depal_6h13h, Chaine_A_Depal_13h20h, Chaine_A_Depal_Journee. Chacune des procédures contiendrait le code qui lui revient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
    Private Sub CommandButton2_Click()
     
            Chaine_A_Depal_6h13h
          ' Chaine_A_Depal_13h20h
          ' Chaine_A_Depal_Journee
     
    End Sub
     
    Sub Chaine_A_Depal_6h13h()
     
    'chaine A
            'Dépal
                '6h 13h
     
            If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox1 = True Then
            Range("c6:d6").MergeCells = False ' Ne plus fusionner
            Sheets("Feuil1").Range("c6") = TextBox1.Value
            End If
            If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox2 = True Then
            Range("e6:f6").MergeCells = False ' Ne plus fusionner
            Sheets("Feuil1").Range("E6") = TextBox1.Value
            End If
            If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox3 = True Then
            Range("g6:h6").MergeCells = False ' Ne plus fusionner
            Sheets("Feuil1").Range("G6") = TextBox1.Value
            End If
            If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox4 = True Then
            Range("i6:j6").MergeCells = False ' Ne plus fusionner
            Sheets("Feuil1").Range("I6") = TextBox1.Value
            End If
            If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox5 = True Then
            Range("k6:l6").MergeCells = False ' Ne plus fusionner
            Sheets("Feuil1").Range("K6") = TextBox1.Value
            End If
     
    End Sub
    Cordialement.
    Dernière modification par AlainTech ; 26/01/2017 à 16h51. Motif: Suppression de la citation inutile

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    J'aimerais quant à moi, avant toute autre chose, que tu me traduises en langage naturel ce que tu veux exprimer par (par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox1 = True then
    En appelant ton attention sur le fait que si les 3 boutons d'option sont dans le même groupe, cette condition ne pourra en aucun cas être vérifiée !

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je pense que tes procédures sont longues car étant la conséquence d'un userform qui n'utilise pas les bon contrôles ou utilise des contrôles avec les mauvais outils.
    par exemple, tes checkbox pourraient être remplacées par un jeu d'optionbutton dans un unique frame ou (mieux encore) par un listbox

    suivant ce qui a été choisi, il suffirait d'interroger la "position" du choix fait (le .listindex du listbox) qui servirait de "numero" de décalage par rapport à la cellule C6

    de même, tes autres jeux de contrôles pour les autres paramètres pourraient être simplifiés, par également une listbox, ou en utilisant leur "Tag" pour stocker une repère permettant de calculer la position de plage à affecter dans ta feuille

    ainsi, en repensant à l'organisation de tes contrôles, tu pourrais probablement aboutir à une procédure qui ne dépasserait pas les 30 lignes de codes et se contenterait simplement d'interroger les valeurs choisies dans tes listbox et les Tag des optionbutton ayant la valeur True

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour

    tes procédures sont peut etre longues tout simplment parce qu'elles le sont c'est tout



    quand je regarde ton code il y a des choses qui suatent au yeux tout de suite

    tu a 3 conditions principales que je décompose comme suit tu constatera que j'ai dimer un array en début de macro, se sont tes address de cellules qui elles reste inchangé pour les 3 conditions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [ Dim add, conditions
        add = Array("-", "c6:d6", "e6:f6", "g6:h6", "i6:j6", "k6:l6")
        If OptionButton108 = True And OptionButton154 = True And OptionButton158 = True Then conditions = 1
        If OptionButton109 = True And OptionButton154 = True And OptionButton158 = True Then conditions = 2
        If OptionButton123 = True And OptionButton154 = True And OptionButton158 = True Then conditions = 3
    ces trois conditions détermineront si on Merge ou ou pas les cells


    ensuite pour ces trois conditions tu en a 5 autre (subconditions ) basées sur les checkboxs qui elle sont identique aussi pour les 3 conditions parent (checkbox de 1 a 5
    ces 5 sous conditions détermine quelle est la plage a modifier et si c'est la cellule 1 ou 2 de cette plage qui reçoit le textbox

    cette sous conditions des checkbox je la décompose comme suit dans une boucle for...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For i = 1 To 5
    If Me.Controls("CheckBox" & i) = True Then
    Range(add(i)).MergeCells = IIf(conditions < 3, False, True)
     Set cel = IIf(conditions <> 2, Range(add(i)).Cells(1), Range(add(i)).Cells(2))
      cel = TextBox1.Value
    'le petit plus de la condition 3
    If Condition = 3 Then Range(add(i)).Cells(1).HorizontalAlignment = xlCenter
    Next
    donc cette boucle par "i" determine quelle plage a merger par 'add(i)' et la conditions (si c'est plus petit que 3 c'est true sinon c'est false
    par la conditions on détermine aussi si c'est la cellule1 ou 2 de la plage (add(i) qui va recevoir le textbox
    et on a joute a la fin la petite modif unique pour la conditions 3 pour le xlcenter


    conclusion ces deux code remplacent tout ton code
    voila donc la macro évènementielle en entier ,j'ai cru comprendre que cela concernait le sheets ("feuil1")meme si tu ne le precise pas a chaque fois que tu modifie dans ton code de base je l'ai donc englobé dans un (with/end with)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Private Sub CommandButton2_Click()
        Dim add, conditions
        add = Array("-", "c6:d6", "e6:f6", "g6:h6", "i6:j6", "k6:l6")
        If OptionButton108 = True And OptionButton154 = True And OptionButton158 = True Then conditions = 1
        If OptionButton109 = True And OptionButton154 = True And OptionButton158 = True Then conditions = 2
        If OptionButton123 = True And OptionButton154 = True And OptionButton158 = True Then conditions = 3
        With Sheets("Feuil1")
            For i = 1 To 5
                If Me.Controls("CheckBox" & i) = True Then
                   . Range(add(i)).MergeCells = IIf(conditions < 3, False, True)
                    Set cel = IIf(conditions <> 2, .Range(add(i)).Cells(1), .Range(add(i)).Cells(2))
                    cel = TextBox1.Value
                    'le petit plus de la condition 3
                    If Conditions = 3 Then .Range(add(i)).Cells(1).HorizontalAlignment = xlCenter
                Next
            End With
     
    end sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Je répète donc (je l'ai déjà dit)
    si (exemple) Les 3 boutons d'option concernés ne sont pas dans des groupes séparés, cette condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If OptionButton108 = True And OptionButton154 = True And OptionButton158 = True Then conditions = 1
    ne sera JAMAIS vérifiée et ne risquera JAMAIS de l'être !
    Il n'y a d'ailleurs aucune différence entre cette ligne "corrigée" et la ligne originelle, qui était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If OptionButton108 And OptionButton154 And OptionButton158 And CheckBox3 = True Then
    les deux codes veulent dire rigoureusement la MEME CHOSE et aboutissent au MEME résultat (impossibilité si les 3 boutons d'option appartiennent au même groupe).
    Je vais maintenant sortir de cette curieuse discussion.

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re

    et bien soit on dégroupe en groupant par a 1 chaque fois dans l'activate de l'USF
    et comme l'action finale unload l'USF on peut les mettre tous a false au départ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub UserForm_Activate()
    For Each ctrl In Me.Controls
    If TypeName(ctrl) = "OptionButton" Then ctrl.GroupName = ctrl.Name: ctrl.Value = False
    Next
    End Sub
    voila rien de bien compliqué

    mais il est vrai que l'on aurait pu utiliser plutôt des checkboxs histoire de pouvoir changer d'avis en cours de route avec l'USF affiché
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. [XL-2007] Procédure trop longue
    Par presser dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 08/06/2009, 18h52
  2. Une procédure trop longue
    Par lola06 dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 14h02
  3. [Vba access 97] Procédure trop longue
    Par saufffy dans le forum Access
    Réponses: 6
    Dernier message: 26/02/2007, 10h40
  4. [ASE] Procèdure trop longue
    Par Benjamin78 dans le forum Sybase
    Réponses: 2
    Dernier message: 11/04/2006, 10h01
  5. [ASE][T-SQL]Procédure trop longue
    Par Benjamin78 dans le forum Sybase
    Réponses: 5
    Dernier message: 21/03/2006, 12h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo