Autres Optimiser UN CODE très lent

chaelie2015

XLDnaute Accro
Bonsoir Forum
Ce code, nommé "Mise_a_jour", parcourt une plage de cellules dans la feuille de calcul "CRT", allant de C17 à C47. Pour chaque cellule dans cette plage (appelée "cell1"), il définit une autre cellule (appelée "cell2") en utilisant la même ligne, mais dans la colonne AO. Ensuite, il convient si la valeur de cell2 n'est ni "sam" ni "ven". S'il est vrai, il faut si la couleur de fond de cellule1 est blanche (RGB (255, 255, 255)). Si c'est le cas, il définit la valeur de cellule.
je souhaite le optimiser il semble qu'il est tres lent.
Merci

VB:
Sub Mise_a_jour() ' code moin rapide que le precedant
Dim cell1 As Range, cell2 As Range
For Each cell1 In Sheets("CRT").Range("C17:C47" & derniereLigne)
    Set cell2 = Sheets("CRT").Range("AO" & cell1.Row)
    If (cell2.Value <> "sam") And (cell2.Value <> "ven") Then
        If cell1.Interior.Color = RGB(255, 255, 255) Then
            cell1.Value = "8"
        End If
    ElseIf (cell2.Value = "sam") Or (cell2.Value = "ven") Then
        cell1.Value = "RH"
    End If
Next cell1
End Sub
 

Deadpool_CC

XLDnaute Accro
Bonsoir
Alors sans fichier exemple pour tester, je peux uniquement te proposer :
VB:
Sub Mise_a_jour()

Dim Cellule As Range
Dim ValCellule2 As String

With Sheets("CRT")
    For Each Cellule In .Range("C17:C47")    ' j'ai viré le "& derniereLigne" du range car variable non déclarée qui sert à ???
        ValCellule2 = Cells(Cellule.Row, "AO").Value
        Select Case ValCellule2
            Case "sam", "ven"
                Cellule.Value = "RH"
            Case Else
                If Cellule.Interior.Color = RGB(255, 255, 255) Then Cellule.Value = 8
        End Select
    Next Cellule
End With

End Sub
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

@chaelie2015,

Franchement, après 1 481 messages ne pas joindre de fichier est incompréhensible. Ce sont les répondeurs qui doivent le faire ?

Dans le code initial il est écrit : ' code moins rapide que le précédant
Pourquoi ne pas conserver le précédent ? ( 🤪 )

Que vaut "derniereLigne" ? Si c'est 0, alors la plage examinée sera C17:C470. Si "derniereLigne" vaut 1 000, la plage examinée sera C17:C47000 :eek:.
 

chaelie2015

XLDnaute Accro
Bonsoir
Alors sans fichier exemple pour tester, je peux uniquement te proposer :
VB:
Sub Mise_a_jour()

Dim Cellule As Range
Dim ValCellule2 As String

With Sheets("CRT")
    For Each Cellule In .Range("C17:C47")    ' j'ai viré le "& derniereLigne" du range car variable non déclarée qui sert à ???
        ValCellule2 = Cells(Cellule.Row, "AO").Value
        Select Case ValCellule2
            Case "sam", "ven"
                Cellule.Value = "RH"
            Case Else
                If Cellule.Interior.Color = RGB(255, 255, 255) Then Cellule.Value = 8
        End Select
    Next Cellule
End With

End Sub
Bonsoir Deadpool_CC
Merci beaucoup, il est un peu rapide que le mien
 

chaelie2015

XLDnaute Accro
Que vaut "derniereLigne" ? Si c'est 0, alors la plage examinée sera C17:C470. Si "derniereLigne" vaut 1 000, la plage examinée sera C17:C47000 :eek:.
Bonjour mapomme
la variable "dernièreLigne" est utilisée pour stocker la valeur de la dernière ligne non vide de la colonne C dans la feuille de calcul "CRT". Cette valeur est utilisée pour limiter la plage de cellules parcourues par la boucle "For Each" pour seulement celle qui contient des données, donc éviter de parcourir des lignes vides ce qui va améliorer les performances de la boucle.
 

chaelie2015

XLDnaute Accro
Bonjour à tous,

@chaelie2015,

Franchement, après 1 481 messages ne pas joindre de fichier est incompréhensible. Ce sont les répondeurs qui doivent le faire ?

Dans le code initial il est écrit : ' code moins rapide que le précédant
Pourquoi ne pas conserver le précédent ? ( 🤪 )

Que vaut "derniereLigne" ? Si c'est 0, alors la plage examinée sera C17:C470. Si "derniereLigne" vaut 1 000, la plage examinée sera C17:C47000 :eek:.
re
Si la variable "dernièreLigne" vaut 0, cela signifie qu'il n'y a aucune donnée dans la colonne C de la feuille de calcul "CRT", donc la plage examinée par la boucle "For Each" sera vide. Dans ce cas, la boucle ne sera pas exécutée car il n'y a pas de cellules à progression.
 

chaelie2015

XLDnaute Accro
C'est l'avantage du Select Case ... il evalue pas les instructions du case Else s'il le case précédent est ok
et regarder 1 seul fois la valeur de la 'cellule2' plutôt qui de la lire pour tous les test que tu avais mis ... lol

après comme dit @mapomme sans fichier exemple difficile d'optimiser
RE Deadpool_CC
Merci pour les details
je vais faire mon possible pour préparer le fichier exemple (l'original est confidentiel et très volumineux)
Merci
 

Cousinhub

XLDnaute Barbatruc
Inactif
Bonsoir,
Juste pour un p'tit truc...
C'est l'avantage du Select Case ...
Je me souviens d'un essai, effectué il y a quelques années... (je n'arrive pas à le retrouver, mais ça ne doit pas être difficile de le refaire...)(quelques années, en gros 15/20 ans...)
Et que le If...Then..End If était plus rapide que Select Case...
@ vérifier, donc...
Bonne soirée à tous
 

Discussions similaires

Réponses
0
Affichages
304
Réponses
1
Affichages
1 K

Statistiques des forums

Discussions
314 496
Messages
2 110 236
Membres
110 708
dernier inscrit
novy16