Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Un peu d'aide pour améliorer le code de ma macro

  • Initiateur de la discussion Initiateur de la discussion corvelc
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

corvelc

XLDnaute Occasionnel
Bonjour,

N'étant pas un pro en macro Excel, j'ai ecrit une macro pour faire une mise à jour des données intégrées dans un tableau excel avant la mise à disposition pour mes utilisateurs.
Cette macro utilise de nombreuses boucles et donc met un certain temps pour la mise à jour des données.
Peut-on optimiser le code (au moins les boucles) pour réduire le temps de traitement car le volumétrie augmente toutes les semaines.Actuellement déjà plus de 9800 lignes dans le tableau.

je joints ma macro et merci d'avance pour l'aide apportée.
C.C

Sub Mod2_Maj_Tbl_Source_ACT01()

'Initialisation des variables

Dim LigneD&, NbLigne&, Valcol1, Valcol2, Ligne&
Dim C As Range
LigneD = 2
NbLigne = 0

' select du tableau

Sheets("Extract Globale Artémis-ACT01").Select
Range("A2").CurrentRegion.Select

' Récupere les nombre de ligne du tableau

NbLigne = Selection.Rows.Count
Range("A" & NbLigne).Select

' 1eres Boucles pour suppression des blancs après texte pour les colonnes
' utilisées dans tableau Dynamique

For Each C In Range("D1:d" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C
For Each C In Range("F1:F" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C
For Each C In Range("H1:H" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C
For Each C In Range("O1:O" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C
For Each C In Range("J1:J" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C

'2eme boucle pour remplacement des codes ressources par nom ressources

For Each C In Range("J1:J" & [A65536].End(xlUp).Row)
If C.Value = "4500012833/400057" Then
C.Value = "SELVANADIN FREDDY"
ElseIf C.Value = "4500012200 / 40057" Then
C.Value = "POULIN REMI"
ElseIf C.Value = "4500012201 / 4500057" Then
C.Value = "RASSOUW NICOLAS"
ElseIf C.Value = "4500012097/400057" Then
C.Value = "DE SOUSA MIGUEL"
ElseIf C.Value = "4500012096/400057" Then
C.Value = "DELACATA OLIVIER"
ElseIf C.Value = "4500012199 / 400057" Then
C.Value = "POULIN REMI"
End If
Next C

' 3eme boucle Balaye le tableau et supprime les lignes non valides

For Ligne = LigneD To NbLigne
Valcol1 = Mid$(Cells(NbLigne, 15), 1, 1)
Valcol2 = Cells(NbLigne, 10)
Cells(NbLigne, 1).EntireRow.Select

If Valcol1 = "F" Then
NbLigne = NbLigne - 1
ElseIf Valcol1 = "P" Then
NbLigne = NbLigne - 1
ElseIf Valcol1 = "S" Then
NbLigne = NbLigne - 1
Else
Cells(NbLigne, 1).EntireRow.Delete
NbLigne = NbLigne - 1
End If
Next Ligne

' tri le tableau sur la colonne Code_ProjSys

Range("A1").Select
Selection.Sort Key1:=Range("O2"), Order1:=xlAscending, _
Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

Range("B2").Select

End Sub
 
Re : Un peu d'aide pour améliorer le code de ma macro

bonjour corvelc,

ce que tu peux essayer pour accélérer ta macro, c'est :
Code:
Sub Mod2_Maj_Tbl_Source_ACT01()
[COLOR="Red"][B]On Error GoTo msg_err 'si il y a une erreur dans la macro, aller à la ligne msg_err
Application.ScreenUpdating = False[/B][/COLOR]

'Initialisation des variables
....
....
....
Range("B2").Select

[COLOR="Red"][B]msg_err:
Application.ScreenUpdating = True[/B][/COLOR]
End Sub

ensuite, il doit y avoir moyen de l'améliorer en enlevant les "Select", mais il faudrait que tu envois un fichier.


A+
 
Re : Un peu d'aide pour améliorer le code de ma macro

Bonjour,

Il serait souhaitable d'utiliser des SELECT CASE au lieu des elseif.
Tu pourrais également regrouper tes 2 boucles.

Tes 2 boucles deviendraient :

Code:
For Each C In Range("D1:d" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C
For Each C In Range("F1:F" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C
For Each C In Range("H1:H" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C
For Each C In Range("O1:O" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
Next C
For Each C In Range("J1:J" & [A65536].End(xlUp).Row)
C.Value = Trim(C.Value)
select case c.value
case "4500012833/400057" : C.Value = "SELVANADIN FREDDY"
case "4500012200 / 40057" : C.Value = "POULIN REMI"
case "4500012201 / 4500057" : C.Value = "RASSOUW NICOLAS"
case "4500012097/400057" : C.Value = "DE SOUSA MIGUEL"
case "4500012096/400057" : C.Value = "DELACATA OLIVIER"
case "4500012199 / 400057" : C.Value = "POULIN REMI"
end select

Next C
 
Re : Un peu d'aide pour améliorer le code de ma macro

Bonjour et merci pour ton aide.

Ta solution me permet effectivement de réduire la mise à jour de plus de 2mn à quelques secondes, d'autan que je l'ai appliqué pour mes deux autres tableaux ou j'avais le meme problème.

par contre pour que je comprenne le fonctionnement de cette gestion d'erreur, vu qu'en execution pas à pas je n'ai pas d'erreur. Ou était le problème?
 
Re : Un peu d'aide pour améliorer le code de ma macro

en fait, si ta macro n'a pas d'erreur pour l'instant, elle poura en avoir plus tard.
avec le OnError GoTo, on force la macro, en cas d'erreur à passer par la ligne voulue (et non s'arrêter...)
Sans ça, si on s'arrête sur une erreur, on va pas passer par la ligne
"Application.ScreenUpdating = True"
et donc la mise à jour de l'affichage Excel ne sera pas réactivée.

En gros, c'est juste au cas ou (moi je le met tout le temps par habitude)
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
177
Réponses
3
Affichages
193
Réponses
2
Affichages
201
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…