Bonjour,
Version commentée....
Sub suivclient_date()
'1) On déclare toutes ses variables, et on les type autant que possible... Pourquoi ?
'Parce qu'une variable typée est d'accès plus rapide qu'une variable de type Variant
'On ne lésine pas sur les variables nécessaires pour faciliter l'écriture et qui de plus
'permettront une exécution plus rapide
Dim nbli%, nblis%, i%, k%, ssd%, cde$, fsc$, ded, suivi As Worksheet
'2) On désactive la mise à jour de l'affichage quand on sait qu'il va être modifié durant l'exécution
Application.ScreenUpdating = False
'3) La mise sous instruction With... End With accélère aussi l'exécution
'et on qualifie toutes ses expressions ! (pas de Range ou Cells non référés explicitement
'à une feuille (et classeur si plusieurs)... ça aussi, c'est plus rapide !
With ThisWorkbook.Worksheets(1)
'4) Plus sûr que l'utilisation de CurrentRegion (voir 4bis)
nbli = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = 4 To nbli
'5) On ne va pas ouvrir le même classeur à chaque tour de boucle !
'Prenant en compte le fait qu'il puisse y avoir plusieurs classeurs, on a défini une variable
'pour récupérer le chemin et le nom : on teste si la valeur de la variable est conforme
'à la mention en colonne A (si c'est le cas on conserve le classeur déjà ouvert, sinon
'on le ferme (si ouvert, car au début pas de classeur), on actualise la variable, on ouvre
'le nouveau classeur,on affecte la feuille à une variable et on mémorise l'extension des données).
'Ce qu'on ne fait que si le classeur doit changer et non à chaque tour de boucle !
If fsc <> .Cells(i, 1) Then
If fsc <> "" Then Workbooks(fsc).Close True
fsc = .Cells(i, 1)
Set suivi = Workbooks.Open(fsc).Worksheets(1)
'4bis) Il est sage de s'interroger sur le résultat des commandes qu'on utilise et tester
'préalablement au besoin : CurrentRegion présuppose de ne pas l'appliquer à une cellule
'entourée de cellules vides, qui ne renverra qu'elle-même...
nblis = suivi.Cells(Rows.Count, 1).End(xlUp).Row
End If
If .Cells(i, 19) <> "" Then
'6) Si la condition est réunie pour envoyer la date de suivi, on prélève celle-ci dans une variable
'[NB-type Variant, car si on a une fausse date on déclencherait une erreur, on la prélève sous
'forme d'entier Long (propr. Value2) qui évite tout risque, bien qu'ici il ne devrait pas y en avoir]
'On prélève également les numéros de ssdossier et de commande dans des variables, cela
'simplifie l'écriture, et c'est plus rapide
ded = .Cells(i, 19).Value2: ssd = .Cells(i, 3): cde = .Cells(i, 4)
For k = 4 To nblis
'7) Illustration... : ...et on sort de la boucle une fois trouvé, inutile de la poursuivre...
If suivi.Cells(k, 2) = ssd And suivi.Cells(k, 3) = cde Then
suivi.Cells(k, 18) = ded: Exit For
End If
Next k
End If
Next i
End With
Workbooks(fsc).Close True
ThisWorkbook.Save
End Sub
Cordialement.
NB- La prochaine fois, mets ton code sous balises Code dans le post.
Et si tu indentais ton code celui-ci serait plus lisible et sujet à moins d'erreurs...