Probleme execution macro vba car trop de données

Fermé
popey003 Messages postés 5 Date d'inscription mardi 28 juillet 2015 Statut Membre Dernière intervention 18 février 2017 - Modifié par pijaku le 10/08/2015 à 14:59
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 - 10 août 2015 à 14:53
bonjour à tous,
J'ai depuis quelques jours un problème d'exécution de ma macro car il semblerait que mon tableau soit trop grand ... La voici :

Sub couperdécaler()
Dim c As Single

    c = Timer


Application.ScreenUpdating = False

dl = Range("G1").CurrentRegion.End(xlDown).Row

Sheets("Vérif").Select
    Range("G1:K1").Select
    Selection.Copy
    Sheets("Quinté").Select
    Range("A1").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Selection.Copy
    Range("A2").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("A3").Select
    Sheets("Vérif").Select
    Range("AH1").Select

Range("AC" & Rows.Count).End(xlUp).Select
Range(ActiveCell(1, 1), ActiveCell(1, 4)).Select
Selection.Copy
Range("M1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Cells(1, 28).Select
    
        ' copie de la selection après filtre
            Columns("AM:AM").Select
            Selection.AutoFilter
            ActiveSheet.Range("$L$1:$L$60000").AutoFilter Field:=1, Criteria1:="<>"
            Range("G1:K" & dl).Select
            Selection.Copy
        ' trouve la dernière cellule vers le haut et copie
            Worksheets("quinté").Select
            Range("A1").Select
            ActiveSheet.Paste
            Worksheets("Vérif").Select
            Selection.AutoFilter
            
        'Effacement de la dernière ligne (AC:AG)
            Range("AC" & Rows.Count).End(xlUp).Select
            Range(ActiveCell(1, 1), ActiveCell(1, 5)).Select
            Selection.Delete Shift:=xlUp
            
            
            
        Do While Range("AC1") <> ""
        ' copie de la selection après filtre
            Columns("AM:AM").Select
            Selection.AutoFilter
            ActiveSheet.Range("$L$1:$L$60000").AutoFilter Field:=1, Criteria1:="<>"
            Range("G1:K" & dl).Select
            Selection.Copy
        ' trouve la dernière cellule vers le bas écrite et descend d'un vers le bas
             Worksheets("quinté").Select
             Range("A:A").Select
             Selection.End(xlDown).Select
             Selection.Offset(1, 0).Select
             ActiveSheet.Paste
             
            ' Columns("A:E").Select
    'ActiveSheet.Range("$A$1:$E$65493").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5) _
    '    , Header:=xlNo
        
        
             Worksheets("Vérif").Select
             Selection.AutoFilter
            
            'Effacement de la dernière ligne (AC:AG)
            Range("AC" & Rows.Count).End(xlUp).Select
            Range(ActiveCell(1, 1), ActiveCell(1, 5)).Select
            Selection.Delete Shift:=xlUp
            
            Range("AC" & Rows.Count).End(xlUp).Select
            Range(ActiveCell(1, 1), ActiveCell(1, 5)).Select
            Selection.Copy
            Range("M1").Select
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            
            Loop
      
        
           Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
            Cells(1, 28).Select
            
        
            Sheets("Quinté").Select
            Range("A1:E2").Select
            Selection.Delete Shift:=xlUp
            
            
            Columns("A:E").Select
    ActiveSheet.Range("$A$1:$E$60000").RemoveDuplicates Columns:=Array(1, 2, 3, 4, 5), _
        Header:=xlNo
    ActiveWorkbook.Worksheets("Quinté").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Quinté").Sort.SortFields.Add Key:=Range("A1:A60000") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Quinté").Sort.SortFields.Add Key:=Range("B1:B60000") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Quinté").Sort.SortFields.Add Key:=Range("C1:C60000") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Quinté").Sort.SortFields.Add Key:=Range("D1:D60000") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Quinté").Sort.SortFields.Add Key:=Range("E1:E60000") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Quinté").Sort
        .SetRange Range("A1:E60000")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
   
    Range("M1").Select
    ActiveCell.FormulaR1C1 = "=RC[-12]+RC[-11]"
    Range("N1").Select
    ActiveCell.FormulaR1C1 = "=RC[-13]+RC[-12]+RC[-11]"
    Range("O1").Select
    ActiveCell.FormulaR1C1 = "=RC[-14]+RC[-13]+RC[-12]+RC[-11]"
    Range("P1").Select
    ActiveCell.FormulaR1C1 = "=RC[-15]+RC[-14]+RC[-13]+RC[-12]+RC[-11]"
    Range("M1:P1").Select
    Selection.AutoFill Destination:=Range("M1:P16"), Type:=xlFillDefault
    Range("M1:P16").Select
    Selection.AutoFill Destination:=Range("M1:P1379"), Type:=xlFillDefault
    Range("M1:P1379").Select
    Range("AB1").Select
   Application.ScreenUpdating = True
   MsgBox Timer - c
       End Sub



Peut-être sauriez-vous m'apporter votre aide s'il vous plait afin qu'elle puisse intégrer un maximum de données (65 000). Car à ce jour, elle tourne de 07h30 à midi sans arrêt et me dit quelque fois qu'elle ne peut continuer....
Je pense que mon langage vba est lourd aussi.
Remerciements par avance!
A voir également:

2 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 778
28 juil. 2015 à 19:52
Bonjour,

«Je pense que mon langage vba est lourd» Effectivement !!!

Créer des macro à partir de l'enregistreur de macro est une première étape dans l'apprentissage du VBA.
Pour optimiser le code obtenu, il suffit très souvent de lire l'aide VBA associé au code ainsi créé et notamment les exemples correspondants.

Par exemple tu cliques sur un des .copy (pour y placer le curseur) puis tu appuies sur F1, tu obtiens l'aide de la méthode Copy.
En regardant l'exemple fourni, tu va te rendre compte qu'il est parfaitement inutile de sélectionner une cellule ou une plage pour la copier.
Tu peux supprimer la plupart des .select de ton code, ce sera déjà un bon début.
0
popey003 Messages postés 5 Date d'inscription mardi 28 juillet 2015 Statut Membre Dernière intervention 18 février 2017
28 juil. 2015 à 20:42
Bonsoir Patrice33740,
Merci pour ce conseil.
Je viens de lire aussi "0,0625 secondes pour 10000 lignes "
Je pense que même si je retire certains .select je n'arriverai jamais moi tout seul à ce merveilleux résultat...
Dommage !!
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 778
28 juil. 2015 à 22:23
Pourquoi certains ??? Il faut tous les supprimer !!!
0
ActiveSheet.AutoFilter.Sort.SortFields.Add Key:= _
Range("E1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
10 août 2015 à 14:53
Bonjour
dis plutôt ce que tu veux faire EXACTEMENT et joint un EXTRAIT de ton classeur

pour cela:
Mettre le classeur sans données confidentielles en pièce jointe sur https://www.cjoint.com/
et coller le raccourci proposé (clic droit) dans le message de réponse
Dans l'attente


transféré dans forum VBA
0