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 :

optimisation d'une procedure


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut optimisation d'une procedure
    bonsoir à tous

    ci dessous la procedure que je cherche à optimise
    si vous avez besoin d'info suplementaire

    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
     
     
    'la plage de la feuille Sheets(UserForm3.ComboBox1.Text) commence toujours à la colonne G et ce finit à la colonne Z
    'les donnes sont de type numerique entier
     If UserForm3.CheckBox7.Value = True Then
        Dim premcol As Long
        Dim dercol As Long
        Dim dercolnonvide As Long
        Dim F9affichx As Long
     
     
        For indexfiltre9ligne = 2 To Sheets(UserForm3.ComboBox1.Text).UsedRange.Rows.Count 'derniere ligne  non vide
          F9affichx = ""
         If Sheets(UserForm3.ComboBox1.Text).Range("a" & indexfiltre9ligne).Value = Sheets("résultat").Range("A" & INDEXCOURSEFILTREligne).Value Then 'compare les 2 index des 2 feuiLle
     
            indexcompareegale = indexcompareegale + 1 'incremente des que index du UserForm3.ComboBox1.Text a ete egale Sheets("résultat").Range("A" & INDEXCOURSEFILTREligne).Value
            dercolnonvide = Sheets(UserForm3.ComboBox1.Text).Range("a" & indexfiltre9ligne).End(xlToRight).Column 'derniere colonne
     
     
            'test si les 2 textbox sont vides alors on prend la totalite de la plage  soit premcol=7 et dercolnonvide
            If UserForm3.TextBox20.Value = 0 And UserForm3.TextBox19.Value = 0 Then
     
               F9affichx = UserForm3.ComboBox1.Text 'affiche le nom de la feuil selectionner par le combobox
               dercol = dercolnonvide
               premcol = 7
     
               For indexfiltre9 = premcol To dercol
                        If Sheets(UserForm3.ComboBox1.Text).Cells(indexfiltre9ligne, indexfiltre9) = Res(combinaisonN°, InK) Then chxeliminer = chxeliminer + 1 'compare la valeur de la cellulede la plage avec celle obtenue par Res(combinaisonN°, InK)
                           F9affichx = F9affichx & "-" & (Sheets(UserForm3.ComboBox1.Text).Cells(indexfiltre9ligne, indexfiltre9)) 'affichage des valeurs trouver dans les cellules de la plage
               Next indexfiltre9
     
           'test si le text20  >0 et que textbox19 egale à 0 permet de prendre  LEs x derniere cellules de la plage
            ElseIf UserForm3.TextBox20.Value > 0 And UserForm3.TextBox19.Value = 0 Then
                   dercol = dercolnonvide
                   premcol = dercolnonvide - Val(UserForm3.TextBox20.Value)
     
     
             For indexfiltre9 = premcol To dercol
                        If Sheets(UserForm3.ComboBox1.Text).Cells(indexfiltre9ligne, indexfiltre9) = Res(combinaisonN°, InK) Then chxeliminer = chxeliminer + 1 'compare la valeur de la cellulede la plage avec celle obtenue par Res(combinaisonN°, InK)
                           F9affichx = F9affichx & "-" & (Sheets(UserForm3.ComboBox1.Text).Cells(indexfiltre9ligne, indexfiltre9)) 'affichage des valeurs trouver dans les cellules de la plage
            Next indexfiltre9
     
     
     
     
            'test si les textbox bornage sont tous >0
            ElseIf UserForm3.TextBox19.Value > 0 And UserForm3.TextBox20.Value > 0 Then
                   dercol = dercolnonvide - Val(UserForm3.TextBox20.Value) 'determine a postion de la derniere cellue de la plage
                   premcol = Val(UserForm3.TextBox19.Value) 'determine la position du premier cellule ou colonne de la plage
     
             For indexfiltre9 = premcol To dercol
                        If Sheets(UserForm3.ComboBox1.Text).Cells(indexfiltre9ligne, indexfiltre9) = Res(combinaisonN°, InK) Then chxeliminer = chxeliminer + 1 ''compare la valeur de la cellulede la plage avec celle obtenue par Res(combinaisonN°, InK)
                           F9affichx = F9affichx & "-" & (Sheets(UserForm3.ComboBox1.Text).Cells(indexfiltre9ligne, indexfiltre9)) 'affichage des valeurs trouver dans les cellules de la plage
            Next indexfiltre9
     
     
     
     
            ElseIf UserForm3.TextBox19.Value > 0 And UserForm3.TextBox20.Value = 0 Then
                   dercol = dercolnonvide
                   premcol = Val(UserForm3.TextBox19.Value) 'determine la position du premier cellule ou colonne de la plage
     
             For indexfiltre9 = premcol To dercol
                        If Sheets(UserForm3.ComboBox1.Text).Cells(indexfiltre9ligne, indexfiltre9) = Res(combinaisonN°, InK) Then chxeliminer = chxeliminer + 1 'compare la valeur de la cellulede la plage avec celle obtenue par Res(combinaisonN°, InK)
                           F9affichx = F9affichx & "-" & (Sheets(UserForm3.ComboBox1.Text).Cells(indexfiltre9ligne, indexfiltre9)) 'affichage des valeurs trouver dans les cellules de la plage
             Next indexfiltre9
     
            End If
     
    End If
        Next indexfiltre9ligne
     
      End If

    merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    514
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 514
    Par défaut
    Bonsoir,

    Tu utilise quatre fois la même boucle, tu devrais en faire une procédure séparée et l'appeler dans ta procédure principale.

    A l'intérieur de cette même boucle l'appel de la fonction Res se fait toujours avec les mêmes paramètres, autant l'appeler avant de rentrer dans la boucle et stocker le resultat dans une variable.

    D'autre part, l'utilisation de With augmente la lisibilité de l'ensemble.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub UneSub(premcol As Long, dercol As Long) '+ autres parametres si necessaire
        Dim Resultat As typeApproprie
        Resultat = Res(combinaisonN°, InK)
     
        With Sheets(UserForm3.ComboBox1.Text)
            For indexfiltre9 = premcol To dercol
                'compare la valeur de la cellulede la plage avec celle obtenue par Res(combinaisonN°, InK)
                If .Cells(indexfiltre9ligne, indexfiltre9) = Resultat Then chxeliminer = chxeliminer + 1
                'affichage des valeurs trouver dans les cellules de la plage
                F9affichx = F9affichx & "-" & (.Cells(indexfiltre9ligne, indexfiltre9))
            Next indexfiltre9
        End With
    End Sub
    Cordialement,

    Tirex28/

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut
    bonjour à tous ,

    merci tirex28 de ta réponse
    effectivement j'ai un code qui se repète.
    j'y avais pensé mais j'avais du mal à la concrètiser.

    j'ai remplace les qql elements

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub filtre9chxeliminer(premcol As Long, dercol As Long) '+ autres parametres si necessaire
        Dim Resultat As String
        Resultat = Res(combinaisonN°, InK)
     
        With Sheets(UserForm3.ComboBox1.Text)
            For indexfiltre9 = premcol To dercol
                'compare la valeur de la cellulede la plage avec celle obtenue par Res(combinaisonN°, InK)
                If .Cells(indexfiltre9ligne, indexfiltre9) = Resultat Then chxeliminer = chxeliminer + 1
                'affichage des valeurs trouver dans les cellules de la plage
                F9affichx = F9affichx & "-" & (.Cells(indexfiltre9ligne, indexfiltre9))
            Next indexfiltre9
        End With
    End Sub

    j'appelle donc ma procedure filtre9chxeliminer




    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
    
    If UserForm3.CheckBox7.Value = True Then
        Dim premcol As Long
        Dim dercol As Long
        Dim dercolnonvide As Long
        
        
       dercol = 0
       dercolnonvide = 0
       F9affichx = ""
       'f9chx = ""
        
        For indexfiltre9ligne = 2 To Sheets(UserForm3.ComboBox1.Text).UsedRange.Rows.Count 'derniere ligne du prono non vide
          
            
         'If indexcompareegale = 0 And Sheets(UserForm3.ComboBox1.Text).Range("a" & indexfiltre9ligne).Value = Sheets("résultat").Range("A" & INDEXCOURSEFILTREligne).Value Then 'compare le index
            
                
         If Sheets(UserForm3.ComboBox1.Text).Range("a" & indexfiltre9ligne).Value = Sheets("résultat").Range("A" & INDEXCOURSEFILTREligne).Value Then 'compare le index
           'Sheets(UserForm3.ComboBox1.Text).Select
            dercolnonvide = Sheets(UserForm3.ComboBox1.Text).Range("a" & indexfiltre9ligne).End(xlToRight).Column 'derniere colonne non vide du prono
            
            
            'test si les 3 textbox sont vides alors on prend la totalite des chx du pronostique selectionner
            If UserForm3.TextBox20.Value = 0 And UserForm3.TextBox19.Value = 0 Then
               
               F9affichx = UserForm3.ComboBox1.Text 'affiche le nom de la feuil selectionner par le combobox donc le prono
               dercol = dercolnonvide
               premcol = 7
                call filtre9chxeliminer
    .......




    mais à l'execution j'ai l'erreur "Argument non falcutatif"

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 502
    Par défaut
    salut bon ok j'ai trouver


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Call filtre9chxeliminer(premcol, dercol)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Optimisation d'une durée de procedure vba excel
    Par jords dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/04/2013, 13h15
  2. [Toutes versions] Optimisation de la rapidité d'une procedure
    Par AlphaScorpi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/07/2012, 12h00
  3. Optimiser le temps d'une procedure
    Par madmax-mad dans le forum PL/SQL
    Réponses: 12
    Dernier message: 25/02/2010, 10h38
  4. Réponses: 3
    Dernier message: 18/08/2006, 09h30
  5. Réponses: 17
    Dernier message: 03/12/2004, 11h17

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