Simplification d'un code de recherche
Bonjour,
Pour une base de données de gestion de stock que je suis en train de créer, je souhaiterai simplifier un code de recherche.
A la fermeture de mon document, j'effectue une recherche dans chaque feuille de mon classeur (correspondant à des magasins de stockage différent) et dans chaque cellule de la colonne A la présence d'un fond de couleur Jaune dans la cellule afin d'afficher un message pour l'utilisateur.
Le but étant d'inciter l'utilisateur à prévenir le responsable des magasins lorsqu'une nouvelle entrée à été saisi afin que lui soit attribué un code article.
Le fond jaune permet au responsable des magasins de repérer plus rapidement les nouvelles entrées
Mon code fonctionne, mais je le trouve plutôt lent alors que je n'ai pas plus de 400 entrées par magasin. Auriez-vous une idée d'optimisation ?
Merci d'avance
Dim FeuilleDeCalcul As Worksheet
' Boucle sur chaque feuille du classeur et sur chaque cellule de la colonne A pour détecter la couleur de fond de celles-ci (ce code fonctionne très bien, mais il est très lent)
For Each FeuilleDeCalcul In ThisWorkbook.Worksheets
For Each Cellules In FeuilleDeCalcul.Range("A3", FeuilleDeCalcul.Range("A3").End(xlDown))
If WorksheetFunction.And(Cellules.Interior.Color = RGB(255, 255, 0)) Then
MsgBox "Attention, Pensez à prévenir " & Personne_A_Contacter & " qu'il y a des Saisies SAP à faire !", vbOKOnly
End If
Next Cellules
Next FeuilleDeCalcul
End IfBonjour,
Ajoutez ceci en début de macro:
Application.ScreenUpdating = Falsecdlt
Bonjour Morta Delo, Arturo83
Tu boucle sur l'intégralité de la colonne A à partir de A3, et ce pour toutes tes feuilles, donc 1 048 573 lignes à chaque fois.
En supposant que toutes les cellules sont remplies :Il faudrait donc limiter la boucle à la dernière cellule remplie de la colonne A.
De plus , si tu as plusieurs cellules en jaune, tu auras un message à chaque fois, alors qu'il suffit d'une seule cellule pour déclencher le message (de ce que j'ai compris)..
A tester:
Sub test()
Dim FeuilleDeCalcul As Worksheet
Dim dl As Integer
Application.ScreenUpdating = False
' Boucle sur chaque feuille du classeur et sur chaque cellule de la colonne A pour détecter la couleur de fond de celles-ci (ce code fonctionne très bien, mais il est très lent)
For Each FeuilleDeCalcul In ThisWorkbook.Worksheets
dl = FeuilleDeCalcul.Range("A" & Rows.Count).End(xlUp).Row
For Each cellules In FeuilleDeCalcul.Range("A3", FeuilleDeCalcul.Range("A" & dl))
If WorksheetFunction.And(cellules.Interior.Color = RGB(255, 255, 0)) Then
MsgBox "Attention, Pensez à prévenir " & Personne_A_Contacter & " qu'il y a des Saisies SAP à faire pour magasin " & FeuilleDeCalcul.Name & " !", vbOKOnly
Exit For 'quitte la boucle sur colonne A
End If
Next cellules
Next FeuilleDeCalcul
End SubCordialement,
Merci Arturo et xorsankukai pour vos réponses.
Je vais essayer de retravailler ça avec le xlUp et le Exit For.
Je me suis rendu compte que sur mon fichier il y avait des cellules vide. Je vais essayer de prendre ça en compte.
Pour l'instruction, Application.ScreenUpdating = False, je ne suis pas sur que cela change grand chose.
Re,
Merci pour le retour,
Pour l'instruction, Application.ScreenUpdating = False, je ne suis pas sur que cela change grand chose.
Fais l'essai avec et sans et tu verras,
https://forum.excel-pratique.com/excel/application-screenupdating-false-vba-plus-rapide-60849
Bonne continuation,
Cordialement,
Bonjour et merci encore pour votre soutien @xorsankukai et @ Arturo83
Voici le code final avec les commentaires et modifications apportées:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim FeuilleDeCalcul As Worksheet
Dim dl As Integer
Dim Case_Jaune As Boolean
Case_Jaune = False
Application.ScreenUpdating = False 'Arrête le rafraichissement de la feuille de calcul pour gagner en vitesse d'exécution du code
' Boucle sur chaque feuille du classeur et sur chaque cellule de la colonne A pour détecter la couleur de fond de celles-ci
For Each FeuilleDeCalcul In ThisWorkbook.Worksheets
'rechercher la derniere case rempli en partant de la dernière case possible de la feuille,
'ceci afin de prendre en compte les cases qui pourrait être vide dans la liste.
' !!! si les dernieres cases ne sont pas rempli, elle ne seront pas prise en compte.
dl = FeuilleDeCalcul.Range("A" & Rows.Count).End(xlUp).Row
For Each Cellules In FeuilleDeCalcul.Range("A3", FeuilleDeCalcul.Range("A3" & dl))
'Contrôle de la couleur de fond de la cellule
If WorksheetFunction.And(Cellules.Interior.Color = RGB(255, 255, 0)) Then
Case_Jaune = True
Exit For 'Sortir de la boucle For Cellule
End If
Next Cellules
If Case_Jaune = True Then
Exit For 'Sortir de la boucle For Feuille
End If
Next FeuilleDeCalcul
'Afficher le message à l'attention de l'utilisateur
If Case_Jaune = True Then
Application.ScreenUpdating = True 'Active le rafraichissement de la feuille de calcul
MsgBox "Attention, Pensez à prévenir " & Personne_A_Contacter & " qu'il y a des Saisies SAP à faire !", vbOKOnly
End If
End Sub