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 :

Formule tableau et temps de calcul long


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 52
    Par défaut Formule tableau et temps de calcul long
    Bonjour à tous,

    J'ai un gros tableau de données sur 12 colonnes 33543 lignes. J'ai rajouté une colonne grâce à une macro VBA qui compte le nombre d'apparitions d'un critère (avec les formules SI et NB.SI.ENS).

    Voici le code de la macro :

    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
     
    Sub ecrire_colonne_pannes()
        Dim Wk As Worksheet
        Dim j As Long
     
        Set Wk = Workbooks("BTU.xlsx").Worksheets("Défauts+CTRL (Parcs)")
     
        Wk.Range("M1").Value = "nb pannes"
     
        j = Application.WorksheetFunction.CountA(Wk.Range("D:D"))
     
        With Wk.Range("M2:M" & j)
            .FormulaR1C1 = _
            "=IF(COUNTIFS(C4,RC[-9],C8,""MONPAN*"")>3,""D"",IF(COUNTIFS(C4,RC[-9],C8,""MONPAN*"")=3,""C"",IF(COUNTIFS(C4,RC[-9],C8,""MONPAN*"")=2,""B"",IF(COUNTIFS(C4,RC[-9],C8,""MONPAN*"")=1,""A""))))"
            .Value = .Value
        End With
    End Sub
    La macro marche, ma colonne est bien créée, mais en revanche le calcul est très long (5% au bout d'une minute...). N'existe-t-il pas un moyen pour accélérer ceci, par exemple procéder au calculs en mémoire avec un array puis transposer cet array sur la colonne correspondante ?

    Merci d'avance

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tu pourrais commencer par passer ta feuille en calcul manuel au début de la macro et ne la remettre en calcul automatique qu'à la fin.
    Lis ceci :
    https://msdn.microsoft.com/fr-fr/lib.../ff841201.aspx
    https://msdn.microsoft.com/fr-fr/lib.../ff834658.aspx

    Ou ceci :
    https://docs.microsoft.com/fr-fr/off...on.calculation
    https://docs.microsoft.com/fr-fr/off....xlcalculation

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 52
    Par défaut
    Merci pour la solution, mais ça n'aide pas trop. La colonne n'est plus calculée, même avec F9.

    N'existe-t-il aucun moyen de faire le calcul dans un tableau en mémoire puis transposer ce tableau après la dernière colonne de mon tableau de données ?
    D'autre part avec cette méthode par VBA, je n'arrive plus à lire la formule quand je clique sur la cellule.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Employé administratif
    Inscrit en
    Mars 2018
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Employé administratif

    Informations forums :
    Inscription : Mars 2018
    Messages : 116
    Par défaut
    Bonjour,

    Est-ce que ceci peut aider ?

    Avant tes "dim"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    Avant ton "end sub"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = True
    Désolé si ça n'aide en rien, j'essaye juste d'apporter ma pierre à l'édifice en fonction de mes (maigres) connaissances.

    Bien à vous,

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2016
    Messages : 52
    Par défaut
    Merci beaucoup pour vos reponses, ça me donne déjà des pistes a creuser. Le screen updating n'a pas d'effet, j'essaie de regarder du coté des xlCalculationManual.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    tu utilises 4 fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NB.SI.ENS($D:$D;D2;$H:$H;"MONPAN*")
    Formule matricielle gourmande.
    L'optimisation la plus simple là dessus c'est de ressortir la partie utilisée plusieurs fois dans une colonne dédiée, qu'elle ne soit évaluée qu'une seule fois. Et d'utiliser le résultat plusieurs fois.

    C'était pour info car ta formule peut se simplifier puisqu'il y a une progression logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CAR(64+MIN(4;NB.SI.ENS($D:$D;D3;$H:$H;"MONPAN*")))
    En plus tu la mets sur toute la colonne $D:$D...
    Il faut soit mettre tes données sous forme de tableau structuré, soit définir un nom dynamique (fait une recherche, les exemples ne manquent pas) pour ne l'appliquer qu'à la plage nécessaire, et non sur 1 millions de lignes.
    eric

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/03/2018, 18h29
  2. le programme "ne répond pas" durant un temps de calcul long
    Par ewaca dans le forum Windows Forms
    Réponses: 7
    Dernier message: 28/03/2014, 17h57
  3. Temps de calcul & méthode accès tableau
    Par lulafitt dans le forum C++
    Réponses: 4
    Dernier message: 18/09/2012, 16h34
  4. [DB2] Temps de calcul via une vue trop long
    Par nathou38400 dans le forum DB2
    Réponses: 2
    Dernier message: 09/05/2011, 11h18
  5. temps de calculs extremement long !!
    Par salseropom dans le forum C++
    Réponses: 9
    Dernier message: 19/01/2005, 20h12

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