Bonjour,
J'essaye d'automatiser une tâche redondante par le biais d'une macro plutôt simple. Un tableau croisé dynamique est créé à partir d'un fichier de 600 000 lignes. Des filtres sont ensuite appliqués puis les données filtrées sont copiées sur une autre feuille.
Sur cette nouvelle feuille qui ne contient alors plus que 74000 lignes, je m'aperçois que le traitement est anormalement long et qu'une fois celui-ci terminé, je ne peux plus rien faire dans le tableau par manque de ressources(j'essayais de supprimer les colonnes A et B de la feuille LRU colonne). J'ai tenté de vider le presse papier mais rien n'y fait.
Auriez-vous une idée ? Ma macro est-elle si lente que ça ou est ce que je génère des choses qui font ralentir la machine ? Que sais je
Le traitement me semble plutôt basique. Je pense que mes nombreux copiés/collés sont à l'origine de mon problème. De quelle manière alors pourrais je régler ça ? S'il est nécessaire de joindre un fichier, dites le moi.
Merci beaucoup !
J'essaye d'automatiser une tâche redondante par le biais d'une macro plutôt simple. Un tableau croisé dynamique est créé à partir d'un fichier de 600 000 lignes. Des filtres sont ensuite appliqués puis les données filtrées sont copiées sur une autre feuille.
Sur cette nouvelle feuille qui ne contient alors plus que 74000 lignes, je m'aperçois que le traitement est anormalement long et qu'une fois celui-ci terminé, je ne peux plus rien faire dans le tableau par manque de ressources(j'essayais de supprimer les colonnes A et B de la feuille LRU colonne). J'ai tenté de vider le presse papier mais rien n'y fait.
Auriez-vous une idée ? Ma macro est-elle si lente que ça ou est ce que je génère des choses qui font ralentir la machine ? Que sais je
Code:
Option Explicit
Sub CreatePivot()
Application.ScreenUpdating = False
Application.CutCopyMode = False
Dim objTable As PivotTable, objField As PivotField
Dim maPlage As Range
Dim DernLigne As Long
DernLigne = Range("A" & Rows.Count).End(xlUp).Row
Set maPlage = Range("A1:Q" & DernLigne)
ActiveWorkbook.Sheets("Feuil1").Select
Range("A1").Select
Sheets.Add.Move After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "TCD"
Worksheets("TCD").PivotTableWizard _
SourceType:=xlDatabase, _
SourceData:=Worksheets("Feuil1").Range("A:Q").Address(, , xlR1C1, True), _
TableDestination:=Worksheets("TCD").Range("A1"), _
tableName:="TCD_1"
Set objTable = Worksheets("TCD").PivotTables("TCD_1")
Set objField = objTable.PivotFields("Article")
objField.Orientation = xlRowField
Set objField = objTable.PivotFields("Composant")
objField.Orientation = xlRowField
Set objField = objTable.PivotFields("Nb Dmd rep")
objField.Orientation = xlDataField
Set objField = objTable.PivotFields("Composant")
Call miseEnColonne
End Sub
Sub miseEnColonne()
Application.ScreenUpdating = False
' == AJOUT D'UNE FEUILLE ET COPIE DES DONNES ==
Sheets.Add.Move After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "LRU colonne"
Sheets("TCD").Columns("A:B").Copy
Sheets("LRU colonne").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("A:B").EntireColumn.AutoFit
'==============================================
'==== NOUVEAU FILTRE ET SUPPRESSION DE LIGNES==
Rows("1:1").Delete
Range("A:B").AutoFilter Field:=1, _
Criteria1:="=*Total*", _
Operator:=xlAnd
Range("A2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("A:B").AutoFilter Field:=1, _
Criteria1:="(vide)", _
Operator:=xlAnd
Range("A2:B2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
ActiveSheet.Range("A1").AutoFilter Field:=1
'==============================================
'SUPPRESSION DU TCD (PENSANT QU'IL ETAIT A L ORIGINE DU PB
Application.DisplayAlerts = False
Sheets("TCD").Delete
Application.DisplayAlerts = True
'== DEBUT DU TRAITEMENT PERMETTANT DE METTRE LES LIGNES EN COLONNES
'Bien que sans doute peu optimisée, j'ai déjà testé cette macro seule, et elle
'n'est pas si lente qu'utilisée dans ce cadre.
Dim celluleRef As Range
Set celluleRef = Range("A1")
Dim nbLignes As Long
nbLignes = Range("A" & Rows.Count).End(xlUp).Row
Dim LRU As Range
Set LRU = Range("C1")
Dim decalageCellule As Long
decalageCellule = 0
Dim cellComposants As Range
Dim tableauComposants()
Dim indice As Double
indice = 2
While (indice < nbLignes)
If celluleRef.Cells(indice) <> "" Then
Dim iComposants As Integer
Dim i As Integer, nbLig As Integer
celluleRef.Cells(indice).Copy
iComposants = 1
Set cellComposants = celluleRef.Cells(indice, 2)
cellComposants.Select
nbLig = Range(Selection, Selection.End(xlDown)).Rows.Count
ReDim tableauComposants(nbLig)
For i = 1 To nbLig
If Not (cellComposants.Cells(i) = "FLU") Then
tableauComposants(iComposants) = cellComposants.Cells(i)
iComposants = iComposants + 1
End If
Next i
LRU.Offset(0, decalageCellule).Select
ActiveSheet.Paste
For iComposants = 1 To UBound(tableauComposants)
LRU.Offset(iComposants, decalageCellule).Value = tableauComposants(iComposants)
Next iComposants
decalageCellule = decalageCellule + 1
End If
indice = indice + 1
Wend
Application.CutCopyMode = True
End Sub
Le traitement me semble plutôt basique. Je pense que mes nombreux copiés/collés sont à l'origine de mon problème. De quelle manière alors pourrais je régler ça ? S'il est nécessaire de joindre un fichier, dites le moi.
Merci beaucoup !
Dernière édition: