Macro lente (plusieurs secondes)
Bonjour, je débute en VBA et j'ai bricolé une macro qui fonctionne mais qui est très lente.
Le but de ma macro est de noter dans la colonne LUNCH avec un Offset l'heure de retour d'un employé partant en pause, puis de trouver sur cette même ligne la valeur "L", fusionner les trois cellules contenant "L" puis inscrire dans cette cellule fusionnée la même heure que notée dans la colonne LUNCH. Enfin afficher un UserForm indiquant à l'employé son heure de retour.
Auriez-vous une idée de pourquoi la macro est si longue à exécutée... Sachant qu'elle ne l'était pas avant que j'ajoute la partie "trouver "L" / fusion / valeur dans cette nouvelle cellule".
Le code de la macro :
Sub lunch()
Application.DisplayAlerts = "False"
Dim repas As Date
repas = Time + TimeValue("00:46:00")
With ActiveCell.Offset(0, 84)
.Value = repas
Dim prenom As String
prenom = ActiveCell.Value
End With
'déclaration des variables :
Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
'affectation de valeurs aux variables :
'on cherche le mot "L"
Valeur_Cherchee = "L"
Set PlageDeRecherche = ActiveCell.EntireRow
Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
'traitement de l'erreur possible : Si on ne trouve rien :
If Trouve Is Nothing Then
'ici, traitement pour le cas où la valeur n'est pas trouvée
AdresseTrouvee = "Aucun lunch de prévu pour toi désolé"
Else
'ici, traitement pour le cas où la valeur est trouvée
AdresseTrouvee = Trouve.Address
End If
UserForm1.Show 0
Dim cell As Range
Set cell = Range(AdresseTrouvee, AdresseTrouvee)
Range(cell, cell.Offset(0, 2)).Merge
Lh = Format(repas, "hh:mm")
cell.Value = Lh
'vidage des variables
Set PlageDeRecherche = Nothing
Set Trouve = Nothing
End Sub
Je suppose que mon code n'est optimal mais je bloque...
Merci d'avance à ceux qui pourront m'aider
Bonjour,
Quelques commentaires :
- La déclaration des variables ne se fait pas au fur et à mesure mais est à grouper en début de macro
Application.DisplayAlerts = False
et pasApplication.DisplayAlerts = "False"
- Une recherche sur une ligne ou colonne complète est plus lente qu'une recherche sur une plage finie :
Set PlageDeRecherche = Range("A" & ActiveCell.Row & ":Z" & ActiveCell.Row)
plutôt que Set PlageDeRecherche = ActiveCell.EntireRow
Set Trouve = PlageDeRecherche.Find(Valeur_Cherchee, LookAt:=xlWhole)
et pasSet Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
Set cell = Range(AdresseTrouvee)
plutôt queSet cell = Range(AdresseTrouvee, AdresseTrouvee)
- D'ailleurs
cell
est inutile car elle correspond juste àTrouve
Trouve = Format(repas, "hh:mm")
plutôt queLh = Format(repas, "hh:mm")
etcell.Value = Lh
- Le vidage des variables est à mon avis inutile
- Ajouter en début de macro :
Application.ScreenUpdating = False
etApplication.Calculation = xlCalculationManual
- Ajouter en fin de macro :
Application.Calculation = xlCalculationAutomatic
Avec ces modifications, votre code devrait être plus lisible et plus rapide.
Bonjour OncleSid, bonjour le forum,
Je n'ai pas ouvert ton fichier, juste regardé le code. Trop de variables inutiles. Cela ne devrait pas ralentir l'exécution du code mais va être très gourmand en mémoire. Essaie comme ça :
Sub lunch()
Dim Trouve As Range
ActiveCell.Offset(0, 84).Value = Time + TimeValue("00:46:00")
Set Trouve = Rows(ActiveCell.Row).Find("L", LookAt:=xlWhole)
If Not Trouve Is Nothing Then
Trouve.Value = Format(ActiveCell.Value, "hh:mm")
Range(Trouve, Trouve.Offset(0, 2)).Merge
Else
MsgBox = "Aucun lunch de prévu pour toi désolé"
End If
Set Trouve = Nothing
UserForm1.Show 0
End Sub
[Édition]
Bonjour Pedro, nos posts se sont croisés...
TOP ! Merci à vous c'est beaucoup beaucoup plus rapide !
J'ai combiné vos deux codes et modifié avec l'Offset car le deuxième code de ThauThème affichait le prénom et non l'heure dans les cellules fusionnées.
Trop content du résultat merci énormément d'avoir pris le temps !