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 de code [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de L'Albatros
    Homme Profil pro
    Chercheur en économie - statistique
    Inscrit en
    Avril 2012
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur en économie - statistique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 150
    Par défaut Optimisation de code
    Bonjour,

    Je dois coder une "mini-appli" en VBA qui trie, dans une feuille donnée, les données de la colonne A pour les "dispatcher" sur d'autres feuilles d'un même classeur tout le tableau.

    Mon code fonctionne très bien, mais je dois traiter des fichiers de minimum 30000 lignes et ça rame...

    je me demande s'il ne faudrait pas que j'enlève les ".select" puis que je travaille avec des variables tableaux au lieu de copier-coller d'une feuille à l'autre.

    Auriez-vous des conseils d'ordre général quant à l'optimisation de fonctions/procédures ?

    Pourriez-vous svp me montrer comment optimiser le code ci-dessous "proprement" pour que j'ai un exemple de code optimisé et propre ?

    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
    Sub dispatch()
     
     
    Dim chaine_test As String
    Dim compteur_boucle As Double
    Dim rang As Integer
     
    compteur_boucle = 1
    Windows("Calcul_Dispatch.xls").Activate
    Sheets("Target").Select
    Range("A1").PasteSpecial
     
    For compteur_boucle = 2 To Range("A1").End(xlDown).Row
     
        Sheets("Target").Select
        If UserForm1.ProgressBar1.Value < Duree Then
            UserForm1.ProgressBar1.Value = (compteur_boucle / Sheets("Target").Range("A1").End(xlDown).Row)
        End If
     
        chaine_test = Range("A" & compteur_boucle).Value
        Range("A" & (compteur_boucle)).EntireRow.Copy
     
        If IsWorksheet(chaine_test) Then
            Sheets(chaine_test).Select
        Else
            Sheets.Add
            ActiveSheet.Name = chaine_test
            Sheets("Target").Range("A1").EntireRow.Copy
            If Sheets(chaine_test).Range("A1").Value <> "" Then
                Sheets(chaine_test).Range("A1").PasteSpecial
            End If
        End If
     
     
    rang = (Range("A65536").End(xlUp).Row + 1)
    Range("A" & rang).PasteSpecial
     
     
    Next compteur_boucle
     
     
    End Sub
    Merci d'avance,

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 107
    Par défaut
    Essaies quelque chose de ce style, avec Filtre et variables tableaux.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Sub Dispatchh()
        Dim WS As Worksheet
        Dim NwS As Worksheet
        Dim k As Long
        Dim h As Long
        Dim MesFeuilles()
        Dim WT As Worksheet
        Dim IRange As Range, ORange As Range
        Dim Mt() As Variant
        Dim i As Integer
     
        Application.ScreenUpdating = False
     
        Set WS = ThisWorkbook.Worksheets("Target")
        Set WT = Worksheets.Add
     
        With WS
            k = .Cells(.Rows.Count, 1).End(xlUp).Row
            h = .Cells(1, .Columns.Count).End(xlToLeft).Column + 2
     
            Set IRange = .Cells(1, 1).Resize(k, h - 2)
            .Cells(1, 1).Copy Destination:=.Cells(1, h)
            Set ORange = .Cells(1, h)
            IRange.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:="", _
                CopytoRange:=ORange, Unique:=True
     
            ReDim MesFeuilles(1 To .Cells(.Rows.Count, h).End(xlUp).Row - 1)
     
            MesFeuilles() = Application.WorksheetFunction.Transpose(.Range(.Cells(2, h), .Cells(.Cells(.Rows.Count, h).End(xlUp).Row, h)))
            .Range(.Cells(1, h), .Cells(.Cells(.Rows.Count, h).End(xlUp).Row, h)).ClearContents
     
            For i = 1 To UBound(MesFeuilles, 1)
                If Not SheetExists(MesFeuilles(i)) Then
                    Set NwS = Worksheets.Add
                    NwS.Name = MesFeuilles(i)
                End If
     
                .Cells(1, 1).AutoFilter Field:=1, Criteria1:=MesFeuilles(i)
                .Cells(1, 1).CurrentRegion.Copy Destination:=WT.Cells(1, 1)
                With WT
                    Mt() = .Range(.Cells(2, 1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft).Column))
                    WT.Cells.ClearContents
                End With
                With ThisWorkbook.Worksheets(MesFeuilles(i))
                    .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1).Resize(UBound(Mt, 1), UBound(Mt, 2)) = Mt()
                End With
                WS.AutoFilterMode = False
                Erase Mt()
            Next i
        End With
        Application.DisplayAlerts = False
        WT.Delete
        Application.DisplayAlerts = False
        Application.ScreenUpdating = True
     
    End Sub
     
     
    Public Function SheetExists(ByVal Sname As String, Optional WB As Workbook) As Boolean
        Dim WS As Worksheet
        If WB Is Nothing Then
            Set WB = ActiveWorkbook
        End If
        On Error Resume Next
            SheetExists = CBool(Not WB.Sheets(Sname) Is Nothing)
        On Error GoTo 0
    End Function

    Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1).Resize(UBound(Mt, 1), UBound(Mt, 2)) = Mt()
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row + 1, 1).Resize(,UBound(Mt, 2)) = Mt()

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

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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