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 :

rapidité sumif a revoir


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut rapidité sumif a revoir
    Bonjour à toutes et tous,
    Peut-être quelqu'un pouura me donner un tuyau pour accelerer cette procédure :
    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
    Private Sub Worksheet_Activate()
    Dim x As Integer, y As Range, z As Integer, lg As Integer, nblg As Integer
    Dim result As Double
    '--------------------------------------------------------------------------
    lg = Worksheets("saisies").Range("d1001").End(xlUp).Row 'feuille des saises
     
    With Worksheets("VENTILATION") 'feuille pour recapitulation
    nblg = .Range("a" & Rows.Count).End(xlUp).Row
    For x = 2 To nblg
    .Range("A" & x, "B" & x).Select
    If Selection.MergeCells = False Then 'si la cellule n'est pas fusionnée
        Set y = Worksheets("saisies").Range("e2:e" & lg)
        .Range("B" & x).Select
        For z = 2 To nblg
        result = Application.SumIf(y, .Range("a" & z), Worksheets("saisies").Range("o2:o" & lg))
        .Range("b" & z) = result
        Next z
    Else
        Set y = Worksheets("saisies").Range("n2:n" & lg)
        For z = 2 To nblg
        result = Application.SumIf(y, .Range("a" & z), Worksheets("saisies").Range("o2:o" & lg))
        .Range("c" & z) = result
     
        Next z
    End If
    Next x
    End With
    End Sub
    le programme repasse toutes les cellules en revue de la feuille "ventilation" et donc met du temps
    la feuille "ventilation" en copie


    Merci de vos réponses
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  2. #2
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    bonjour ouskel'n'or,

    Avec un peu de retard (cause repas), je m'explique :

    Si la cellule n'est pas une cellule fusionnée, je demande de faire une addition conditionnelle (la cellule "a" doit correspondre à la cellule "e" de la feuille "saisies") sinon le calcul se fait (pour les cellules fusionnées) en "c" avec les critères de la cellule "n" de la feuille "saisies" (je ne peux pas mettre cette feuille en fichier joint car confidentielle). Ma procédure marche mais malgré que le calcul se fasse instantanément, le programme repasse en revue chaque cellule "b" de la feuille "ventilation" (je ne sais pas pourquoi) et donc perd du temps.

    J'espère avoir été plus clair et merci encore

    merci de ta réponse
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Si dans une boucle une condition est remplie et que cette seule condition te satisfait, tu peux sortir de la boucle avec Exit for.
    Est-ce de ça dont tu parles ?

    PS - Pour ma réponse précédente, j'ai dit une c...e J'ai cru que les deux lignes n'en formaient qu'une

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je viens de "re" regarder ce que tu as mis et ma solution serait tout autre
    Intro de la formule Sumif dans la colonne .Range("b" & z) et, si besoin est, copie sur place des seules valeurs.
    Se résume à :
    - Une formule dans une cellule se copie sur une plage de cellules (une seule ligne de code)
    - Une copie sur place des valeurs issues de la formule (tient sur deux lignes de code)
    Résultat : Pas de boucle, trois lignes de code. Pas de délai d'exécution.
    Besoin d'un coup de main pour le faire ?

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    RE OUSKEL,

    J'ai raccourci un peu mon code et enlevé les IF qui ne sont pas vraiment utiles (si on fait attention nom de rubrique <> nom activité), pour le reste, je n'ai pas tout compris alors si tu me propose un coup de main..... merci d'avance, le code raccourci :
    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
    Private Sub Worksheet_Activate()
    Dim x As Integer, y As Range, z As Integer, lg As Integer, nblg As Integer
    '--------------------------------------------------------------------------
    lg = Worksheets("saisies").Range("d1001").End(xlUp).Row
    With Worksheets("VENTILATION")
    nblg = .Range("a" & Rows.Count).End(xlUp).Row
    For x = 2 To nblg
        Set y = Worksheets("saisies").Range("n2:n" & lg)
        For z = 2 To nblg
        .Range("c" & z) = Application.SumIf(y, .Range("a" & z), Worksheets("saisies").Range("o2:o" & lg))
        Next z
     
        Set y = Worksheets("saisies").Range("e2:e" & lg)
        For z = 2 To nblg
        .Range("b" & z) = Application.SumIf(y, .Range("a" & z), Worksheets("saisies").Range("o2:o" & lg))
        Next z
     
     
    Next x
    End With
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Ce que je suggère ? De faire un test dans Excel.
    Ecris, dans Excel (non dans VBA) la formule qui va bien dans la cellules "C2" et recopie-la jusqu'en ligne nblg
    Tu as en colonne C le résultat que tu désires.
    Tu ne veux que les valeurs sans les formules ?
    Tu copies ta colonne et tu la colles avec Collage spécial -> Valeurs seules.
    Tu as le principe

    Si tu veux bien tester.

    Le code ?
    Pour la copie de la formule, le code de copie enregistré en faisant ne va pas.
    Il est avantageusement remplacé par une simple copie de la cellule contenant la formule sur la plage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("C2").copy Range("C3:C" & nblg)
    Simplement, comme o2 et lg sont fixes (adresses absolues) remplace Range("o2:o" & lg)) par Range("o$2:o$" & lg)) dans ta formule écrite dans Excel.
    Enfin, tu adaptes...

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

Discussions similaires

  1. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  2. [rapidité du code] Mise a jour a partir d'un TQuery.
    Par goethe dans le forum Bases de données
    Réponses: 4
    Dernier message: 27/10/2004, 09h01
  3. Rapidité de compilation C# Vs C++
    Par Melchisedec dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 12/08/2003, 13h05
  4. NMHTTP prob de rapidité
    Par Goldocrack dans le forum C++Builder
    Réponses: 7
    Dernier message: 06/08/2003, 00h12
  5. Rapidite enregistrement
    Par mika dans le forum Débuter
    Réponses: 9
    Dernier message: 25/04/2003, 15h15

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