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
15semaine-xx-2020.xlsm (518.97 Ko)

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 pas Application.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 pas Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee, LookAt:=xlWhole)
  • Set cell = Range(AdresseTrouvee) plutôt que Set cell = Range(AdresseTrouvee, AdresseTrouvee)
  • D'ailleurs cell est inutile car elle correspond juste à Trouve
  • Trouve = Format(repas, "hh:mm") plutôt que Lh = Format(repas, "hh:mm") et cell.Value = Lh
  • Le vidage des variables est à mon avis inutile
  • Ajouter en début de macro : Application.ScreenUpdating = False et Application.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 !

Rechercher des sujets similaires à "macro lente secondes"