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 traitement vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut Optimisation traitement vba
    Bonjour :

    Je souhaite optimiser au maximum le temps du traitement (actuellement presque 20 secondes) de 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
      base = Sheets("Menu").Range("BA20").Value
            Workbooks.Open base
     
            Windows("suivi.xlsm").Activate
            Sheets("extraction").Select
     
     
    Windows("Commentaires.xlsx").Activate
     
    DoEvents
     
    With Sheets("comments")
            dern = .Range("A65536").End(xlUp).row
            Set plage = .Range(Cells(2, 1), Cells(dern, 1))
     
    For Each cell In plage
     
        commentaire = cell.Offset(0, 2).Value
        acteur = cell.Offset(0, 3).Value
        date_de_fin = cell.Offset(0, 4).Value
     
            Select Case commentaire
            Case Is <> ""
                ref = cell.Value
                With Workbooks("suivi.xlsm").Sheets("extraction")
                Set C = .Range("A:A").Find(ref, LookIn:=xlValues)
                    If Not C Is Nothing Then
                    C.Offset(0, 91).Value = commentaire
                    C.Offset(0, 92).Value = acteur
                    C.Offset(0, 93).Value = date_de_fin
                    End If
                End With
            End Select
     
    Next cell
    End With
     
     Workbooks("Commentaires.xlsx").Activate
     ActiveWorkbook.Close
     
             Windows("suivi.xlsm").Activate
            Sheets("extraction").Select
     
     
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Merci pour votre aide

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Premièrement:

    Application.screenupdating=false

    Deuxièmement: au lieu d'utiliser des ranges: mets tes ranges dans des tableaux.. Tu construis donc trois tableaux:
    commentaire()
    acteur()
    date_de_fin()

    Une affectation pour toute tes lignes.

    Puis après en bouclant sur ton tableau commentaire de ubound à ubound.
    Tu mets un if commentaire =""

    Et tu remplis un quatrième tableau à trois dimensions

    Puis tu le mets dans le range.

    Tu devrais bien gagner 10 secondes

  3. #3
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    Application.screenupdating = false est inclus

    Par contre je sais pas du tout comment monter ce tableau

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim commentaire()
    commentaire = Sheets("comments").Range("C2:C" & dern).Value

  5. #5
    Inactif  
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    1 733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 1 733
    Par défaut
    Il n'y a qu'en pataugeant qu'on apprend. Je ne te rendrais aucun service en te filant un code tout craché. Si tu as été capable de pondre ce code tu peux très bien le faire en passant par des tableaux et ça t'apprendra à faire des codes qui iront plus vite

    Si tu n'y es pas parvenu lundi et que tu montres avoir essayé je t'aiderai!

    Bon WE!

  6. #6
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    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
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
     
    'ouverture du fichier sur le serveur
            base = Sheets("Menu").Range("BA20").Value
            Workbooks.Open base
     
            Windows("suivi.xlsm").Activate
            Sheets("extraction").Select
     
     
    Windows("Commentaires.xlsx").Activate
     
    DoEvents
     
    With Sheets("comments")
            dern = .Range("A65536").End(xlUp).row
     
         commentaire = .Range("C2:C" & dern).Value
         acteur = .Range("D2:D" & dern).Value
         date_de_fin = .Range("E2:E" & dern).Value
          ref = .Range("A2:A" & dern).Value
     
        l = Range("A2:A" & [A65000].End(xlUp).row)
     
            For i = LBound(l) + 1 To UBound(l)
            Select Case commentaire
            Case Is <> ""
                With Workbooks("suivi.xlsm").Sheets("extraction")
                Set C = .Range("A:A").Find(ref, LookIn:=xlValues)
                    If Not C Is Nothing Then
                    C.Offset(0, 91).Value = commentaire
                    C.Offset(0, 92).Value = acteur
                    C.Offset(0, 93).Value = date_de_fin
                    End If
                End With
            End Select
        Next i
     
    End With
     
     Workbooks("Commentaires.xlsx").Activate
     ActiveWorkbook.Close
     
             Windows("suivi.xlsm").Activate
            Sheets("extraction").Select
     
    'Application.ScreenUpdating = True
    'Application.Calculation = xlCalculationAutomatic
    J'ai essayé ta solution, mais il me renvoi une erreur.
    Je pense qu'il ya un souci

    J'ai réussi à monter le tableau

    Cependant j'ai toujours plus de 20 secondes de traitement.....

    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
    With Sheets("comments")
            dern = .Range("A65536").End(xlUp).row
     
        Arr_commentaire = Range("A2:E" & dern)
     
        For R = 1 To UBound(Arr_commentaire, 1) ' First array dimension is rows.
        Select Case Arr_commentaire(R, 3)
        Case Is <> ""
                With Workbooks("suivi.xlsm").Sheets("extraction")
                Set C = .Range("A:A").Find(Arr_commentaire(R, 1), LookIn:=xlValues)
                    If Not C Is Nothing Then
                    C.Offset(0, 91).Value = Arr_commentaire(R, 3)
                    C.Offset(0, 92).Value = Arr_commentaire(R, 4)
                    C.Offset(0, 93).Value = Arr_commentaire(R, 5)
                    End If
                End With
            End Select
        Next R
     
    End With

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    Bonjour

    sa dure encore 20 ... parceque tu a fait le travail a moitié

    tes comment tu les prend dans un tableau que tu crée avec le 1 er classeur
    pourquoi ne cré tu pas un 2 eme tableau plutot que de boucle dans le 2 eme classeur
    ensuite tu instruit 1 3 eme tableau que tu collera directement dans le sheet avec application transpose

    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Bonjour,

    Au niveaux compréhension des Array, tu peux consulter les tutos de DVP

    IX. Optimisation du code avec les variables tableau sous Excel

    Il y a un exemple ou l'on passe de 1h17mn à 1mn41 secondes sur un traitement de 14 millions de cellules... et un lien vers un autre tuto pour savoir utiliser les instructions relatives aux tableaux.

    cordialement,

    Didier

  9. #9
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Par défaut
    Bonjour,

    J'ai essayé cette solution, mais je elle ne renvoi pas le résultat de la recherche V

    quelquun peux m'aider? Merci

    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
     With Sheets("comments")
            dern = .Range("A65536").End(xlUp).row
     
        Arr_commentaire = Range("A2:E" & dern)
     
        dern1 = Workbooks("suivi.xlsm").Sheets("extraction").Range("A65536").End(xlUp).row
     
        Arr_comment = Workbooks("suivi.xlsm").Sheets("extraction").Range("A2:CP" & dern1)
     
        For r = 1 To UBound(Arr_commentaire, 1) ' First array dimension is rows.
        Select Case Arr_commentaire(r, 3)
        Case Is <> ""
     
        For rr = 1 To UBound(Arr_comment, 1)
        If Arr_comment(rr, 1) = Arr_commentaire(r, 1) Then
     
                    Arr_comment(rr, 92) = Arr_commentaire(r, 3)
                    Arr_comment(rr, 93) = Arr_commentaire(r, 4)
                    Arr_comment(rr, 94) = Arr_commentaire(r, 5)
     
        End If
        Next rr
        End Select
        Next r
     
    End With

  10. #10
    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 à tou(te)s, ninette24,
    Sans avoir étudier ton code (et surtout le dimensionnement de tes tableaux),
    Insères au moins le résultat du tableau "Arr_comment" dans un Range
    Quelque chose comme ça (à l'aveugle)
    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
    Sub TTT()
    Dim Arr_commentaire, dern As Long, r As Long, rr As Long
    With Sheets("comments")
      dern = .Range("A" & .Rows.Count).End(xlUp).Row
      Arr_commentaire = .Range("A2:E" & dern)
    End With
    With Workbooks("suivi.xlsm").Sheets("extraction")
      dern = .Range("A" & .Rows.Count).End(xlUp).Row
      Arr_comment = .Range("A2:CP" & dern)
      For r = 1 To UBound(Arr_commentaire, 1)
        If Arr_commentaire(r, 3) <> "" Then
          For rr = 1 To UBound(Arr_comment, 1)
            If Arr_comment(rr, 1) = Arr_commentaire(r, 1) Then
              Arr_comment(rr, 92) = Arr_commentaire(r, 3)
              Arr_comment(rr, 93) = Arr_commentaire(r, 4)
              Arr_comment(rr, 94) = Arr_commentaire(r, 5)
            End If
          Next rr
        End If
      Next r
      .Range("A2").Resize(UBound(Arr_comment, 1), UBound(Arr_comment, 2)) = Arr_comment
    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...)

Discussions similaires

  1. Optimisation - Traitement de messages et GUI
    Par buzzkaido dans le forum C++
    Réponses: 4
    Dernier message: 08/01/2007, 13h40
  2. Requette Trop longue. Comment optimiser ?[Traitement]
    Par Tankian dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/06/2006, 20h37
  3. Optimiser traitement fichier [.txt]
    Par Metallic-84s dans le forum Langage
    Réponses: 14
    Dernier message: 16/03/2006, 13h33
  4. [PL/SQL] Optimisation traitement
    Par nako dans le forum Oracle
    Réponses: 1
    Dernier message: 29/12/2005, 16h01
  5. Optimisation Traitement ADO
    Par adjava dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/04/2005, 14h48

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