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 :

[VB] avec Excel : calculs vraiment lent


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut [VB] avec Excel : calculs vraiment lent
    Allo, c'est encore moi. Je dois calculer l'accéleration et la force G avec des données déjà inscrites dans une feuille excel. Tout marche bien sauf que c'est vraiment lent. Je trouve cela long avec 500 données alors ne n'imagine pas avec le maximum de la mémoire de ma boite noire (31500 données).

    Pouvez-vous me dire ce qui ne va pas?

    Voici un morceau de mon code où j'écrit directement dans les cellules:

    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
    For CellN = 4 To (Colonne.Rows.Count + 4)
     
    RawDATA = XLWorkbook.Sheets("Data").Range("B" & CellN).Value
     
    If IsNumeric(RawDATA) = False Then
    PartNb = Val(RawDATA)
    'Créer une nouvelle série mais j'ai pas fini cette partie là
    Else
     
    'PulseDATA = 5 * Val(RawDATA)
    XLWorkbook.Sheets("Data").Range("H" & CellN).Value = 5 * XLWorkbook.Sheets("Data").Range("D" & CellN).Value
     
    'ForceDATA = (((PulseDATA / 10) - 500) * 8) / 1000
    XLWorkbook.Sheets("Data").Range("L" & CellN).Value = (((XLWorkbook.Sheets("Data").Range("H" & CellN).Value / 10) - 500) * 8) / 1000
     
    'AccelDATA = 9.805 * ForceDATA
    XLWorkbook.Sheets("Data").Range("P" & CellN).Value = 9.805 * XLWorkbook.Sheets("Data").Range("L" & CellN).Value
     
    End If
     
    Next
    [/code]

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Salut,

    Comme ça, à froid, je te conseillerais tout d'abord d'éviter les manipulation de données dans ta feuille au maximum.
    Dans ton code, tu affectes une valeur à une cellule, et tu vas lire la valeur de cette même cellule pour l'utiliser dans le calcul à la ligne suivante.
    Utilise plutôt une variable pour placer cette valeur, et utilises la variable pour le calcul. Ca t'allège le code d'une affection à partir de données sur la feuille, ça ne peut qu'être bénéfique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PulseDATA = 5 * Val(RawDATA)
    ForceDATA = (((PulseDATA / 10) - 500) * 8) / 1000
    AccelDATA = 9.805 * ForceDATA
     
    XLWorkbook.Sheets("Data").Range("H" & CellN).Value = PulseDATA 
    XLWorkbook.Sheets("Data").Range("L" & CellN).Value = ForceDATA 
    XLWorkbook.Sheets("Data").Range("P" & CellN).Value = AccelDATA
    Ensuite, je crois me souvenir que la fonction Cells est plus rapide que la fonction Range.

    Dernièrement, si tu travailles avec l'éditeur VBA d'excel, ferme-le! J'ai remarqué que sur certaines macro, ça faisait gagner un temps non négligeable.

    Et au cas où tu ne l'aurais pas fait, désactive le rafraichissement de l'écran.

    Vu que ce ne sont pas des manipulations trop compliquées, ta macro devrait tout de même être assez rapide...

    [edit]correction d'un Cell en Cells
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut
    Comment je fait pour désactiver le rafraîchissement ? Est-ce la fonction visible = False ?

    Et à vrai dire, je n'est pas vraiment fait de macro dans Excel lui-même, je fait tout à partir d'un exécutable (.exe), programmer avec VB 6.0 . Est-ce que cela peut jouer sur la vitesse de calcul?

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Citation Envoyé par SimonBrodeur
    Comment je fait pour désactiver le rafraîchissement ? Est-ce la fonction visible = False ?

    Et à vrai dire, je n'est pas vraiment fait de macro dans Excel lui-même, je fait tout à partir d'un exécutable (.exe), programmer avec VB 6.0 . Est-ce que cela peut jouer sur la vitesse de calcul?
    Depuis Excel VBA, c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating=false
    mais depuis une appli VB6, je ne sais pas comment le mettre en oeuvre... Déjà, est-ce utile? As-tu le visuel sur le fichier excel?
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut
    Je peut utiliser cette commande comme tu le fait dans une macro sauf que moi j'affiche la feuille (visible = true) quand tout les calculs sont terminer.

  6. #6
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Quelquesoit le but but à atteindre, afin d 'optimiser le code
    il est préférable de travailler sur des tableaux
    puis réaffecter celui-ci à la feuille Xcel.

  7. #7
    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 peut utiliser cette commande comme tu le fait dans une macro sauf que moi j'affiche la feuille (visible = true) quand tout les calculs sont terminer.
    Pour mettre à jour l'affichage, puisque tu as fais
    Application.ScreenUpdating=false
    ... avant les calculs, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating=true
    ...après
    En l'occurence, comme tu ne sélectionnes pas les cellules, je ne pense pas que cela ait beaucoup d'incidence sur la lenteur de ta routine.
    Par contre, utilise plutôt Cells que Range
    Pour une cellule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(NoLigne,NoCol). value = TaVariable
    Pour une plage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(NoLigne,NoCol),Cells(NoLigne2,NoCol2)).(Ce que tu veux)
    Enfin, je pense aussi qu'un tableau déclaré irait plus vite pour faire ce que tu fais.

    A toutes fins utiles

    A+

  8. #8
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 131
    Par défaut
    Citation Envoyé par ouskel'n'or
    En l'occurence, comme tu ne sélectionnes pas les cellules, je ne pense pas que cela ait beaucoup d'incidence sur la lenteur de ta routine.
    Faire une Selection est une énormité - encore heureux qu'il n'en fasse pas - c'est tout juste bon pour les macros automatiques
    sinon, à partir du moment que l'on écrit dans la feuille, il y a perte de temps d'où l'intérêt de copier tout le résultat en une seule opération.

    L'autre perte de temps importante est liée au recalcul de la feuille et le screenupdating ne résoud pas le problème
    => il est donc parfois judicieux de forcer le calcul en manuel avant copie des données puis après la dernière copie restaurer le calcul automatique
    ainsi la feuille ne sera recalculée qu'une seule fois.

  9. #9
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut
    Je n'est pas beaucoup d'expérience et je n'ai jamais travaillé avec des tableau "virtuel". Toutefois, j'ai un nombre assez grand de données et le tableau devrait être lui aussi assez grand (9 x 31500). Est-ce que VB pourra le supporter ? Si oui, après que j'ai tout calculer, il me suffit juste de copier le tableau vers excel et tout se fait en une opération ?

  10. #10
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Par défaut
    je vois que les autres (pros VBA) ne sont pas en ligne.

    Da,s l'aide e, ligne :

    1) Array semble ne pas avoir de difficultés à gérer 9, 31500
    2) jettes un coup d'oeil dans l'aide en ligne d'excel à la rubrique Utilisation de tableaux dans Visual Basic : tu y trouveras, je pense, ta réponse en ce qui concerne tant l'alimentation d'un array à partir d'excel que l'alimentation de feuilles à partir d'un array.

    Je pense que tu t'orientes vers la bonne solution (cacul dans un tableau puis envoi vers Excel me parait plus agile)

  11. #11
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut
    J'ai enfin réussi avec un tableau virutel est cela est quasi instantané, merci pour l'aide...

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 21/02/2017, 20h48
  2. Calculer une dispersion avec excel
    Par ANTMA dans le forum Excel
    Réponses: 6
    Dernier message: 10/02/2008, 03h22
  3. [Formule] Calcul Heures AVEC EXCEL
    Par JLDEB dans le forum Excel
    Réponses: 2
    Dernier message: 16/04/2007, 17h08
  4. Aide sur le calcul matricielle avec Excel
    Par tpcforever dans le forum Excel
    Réponses: 1
    Dernier message: 22/03/2007, 21h33
  5. [VBA-Excel] Calcul d'une formule avec une inconnue
    Par micwiss dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/10/2006, 16h04

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