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 :

Optimiser echange de valeur entre Worksheet.


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Par défaut Optimiser echange de valeur entre Worksheet.
    Bonjour,

    Je lis un tableau en base de données et je dois repercuter les inofmrations entre 3 sheets.

    WS1 contient tous les records
    WS2 contient les records de type BUG
    WS3 contient les records de type REQUEST


    WS1 = WS2 union WS3 union (le reste)

    J'ai une seule boucle qui va remplir systematiquement WS1 et qui remplira eventuellement soit WS2 et WS3:

    Voila le code


    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
     
      While Not rst.EOF
     
        ''On met à jour ALL
        For i = 0 To rst.Fields.Count - 1 Step 1
         Sheets("ALL").Cells(Row, i + 1).Value = rst(i).Value
        Next
     
        ''On MAJ BUG
        If (rst("Active/Inactive").Value = "Active" And rst("type").Value = "BUG") Then
            For i = 0 To rst.Fields.Count - 1 Step 1
                Sheets("ACTIVE BUG 2").Cells(RowBUG, i + 1).Value = rst(i).Value
                ''On met à jour avec les champs custo
                Sheets("ACTIVE BUG 2").Range("Q" & RowBUG & ":" & "T" & RowBUG).Value = Sheets("ALL").Range("Q" & Row & ":" & "T" & Row).Value
            Next
            RowBUG = RowBUG + 1
        End If
     
        ''On MAJ ENH
        If (rst("Active/Inactive").Value = "Active" And rst("type").Value = "ENH") Then
            For i = 0 To rst.Fields.Count - 1 Step 1
                Sheets("ACTIVE ENH 2").Cells(RowENH, i + 1).Value = rst(i).Value
                ''On met à jour avec les champs custo
                Sheets("ACTIVE ENH 2").Range("Q" & RowENH & ":" & "T" & RowENH).Value = Sheets("ALL").Range("Q" & Row & ":" & "T" & Row).Value
            Next
            RowENH = RowENH + 1
        End If
     
        Row = Row + 1
        rst.MoveNext
      Wend

    Le problème c'est la lenteur : le fait de basculer entre WS1 et WS2 ainsi qu'entre WS1 et WS3 bouffe beaucoup de temps.

    Comment faire pour enregistrer les resultats dans une WS temporaire sans avoir à basculer sans cesse. Une fois la boucle fini , il me suffirait d'envaoyer vers WS2 et WS3.


    Comment faire?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Par défaut
    Tu peux déjà diminuer le nombre de boucles (IF et FOR), stocker les valeurs du rst dans des variables, et éviter d'utiliser comme variables des noms déjà utilisés par VBA comme "Row".
    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
    While Not rst.EOF
        activ = rst("Active/Inactive")
        typ = rst("type")
     
        For i = 0 To rst.Fields.Count - 1 Step 1
            ''On met à jour ALL
            Sheets("ALL").Cells(RowAll, i + 1).Value = rst(i).Value
     
            If activ = "Active" Then
                ''On MAJ BUG
                If typ = "BUG" Then
                    Sheets("ACTIVE BUG 2").Cells(RowBUG, i + 1).Value = Sheets("ALL").Cells(RowAll, i + 1).Value
                    ''On met à jour avec les champs custo
                    Sheets("ACTIVE BUG 2").Range("Q" & RowBUG & ":" & "T" & RowBUG).Value = Sheets("ALL").Range("Q" & RowAll & ":" & "T" & RowAll).Value
                    RowBUG = RowBUG + 1
                ElseIf typ = "ENH" Then
                    Sheets("ACTIVE ENH 2").Cells(RowENH, i + 1).Value = Sheets("ALL").Cells(RowAll, i + 1).Value
                    ''On met à jour avec les champs custo
                    Sheets("ACTIVE ENH 2").Range("Q" & RowENH & ":" & "T" & RowENH).Value = Sheets("ALL").Range("Q" & RowAll & ":" & "T" & RowAll).Value
                    RowENH = RowENH + 1
                End If
            End If
            RowAll = RowAll + 1
        Next i
        rst.MoveNext
    Wend

  3. #3
    Membre confirmé Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Par défaut Petite question
    Bonjour,

    J’aurais une question, j'ai regardé le code un peu vite mais il me semble que tu active les feuilles pour faire tes opérations à chaque fois?

    Je me suis peut-être trompé?

    Paloma

  4. #4
    Membre éprouvé Avatar de zebulon2212
    Inscrit en
    Juin 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2006
    Messages : 77
    Par défaut
    ce probleme est resolu dans la FAQ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    tu met ca au debut de ton code et tu le remet à true a la fin

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Par défaut
    Citation Envoyé par Paloma
    Bonjour,

    J’aurais une question, j'ai regardé le code un peu vite mais il me semble que tu active les feuilles pour faire tes opérations à chaque fois?

    Je me suis peut-être trompé?

    Paloma

    Je ne les active pas mais VBA le fait explicitement provoquant d'HORRIBLES LENTEURS!

  6. #6
    Membre éprouvé Avatar de zebulon2212
    Inscrit en
    Juin 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2006
    Messages : 77
    Par défaut
    d'ou le Application.ScreenUpdating = False
    qui permet de ne pas rafraichir l'affichage et donc permettre un gain de tps ENORME (environ 2/3 gagné voir plus)

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2005
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 193
    Par défaut
    Citation Envoyé par zebulon2212
    d'ou le Application.ScreenUpdating = False
    qui permet de ne pas rafraichir l'affichage et donc permettre un gain de tps ENORME (environ 2/3 gagné voir plus)

    Enorme est un euphemisme...
    Je passe de 297 sec à 28 sec...
    En tout cas merci ENORMEMENT Zebulon...
    Le genre de ligne de code qui change une vie

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

Discussions similaires

  1. [AC-2007] Echange de valeurs entre requête et formulaire (graphique)
    Par Shouhai dans le forum Access
    Réponses: 5
    Dernier message: 31/03/2015, 14h42
  2. Echanger les valeurs entre deux select
    Par otmaneo01 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/03/2015, 11h13
  3. Echange de valeurs entre deux fenêtres en C#-WPF
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 07/01/2014, 02h13
  4. Echange de valeurs entre Active X et application
    Par Hypollite76 dans le forum Delphi
    Réponses: 4
    Dernier message: 02/03/2007, 14h04
  5. [PHP-JS] echange de valeur entre le javasript et le php
    Par cortex007 dans le forum Langage
    Réponses: 7
    Dernier message: 20/01/2006, 19h32

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