Salut oiseaubleu, salut ric,
Je ne crois pas que ceci puisse aider dans le cas présent ... voir ...
https://docs.microsoft.com/fr-ca/office/vba/api/excel.application.displayalerts
Tu as tout à fait raison. Je le met toujours par habitude
L'actualisation de l'affichage de l'écran reprendra automatiquement à la fin du code. Je me souviens d'avoir lu un commentaire de MFERRAND à ce sujet.
Je ne savais pas... merci !
@oiseaubleu J'ai repris le fichier de ric que j'ai modifié.
- Première erreur qu'il faut éviter(sauf dans certains cas) : ne pas utiliser le ".select" sur des cellules et feuilles.
Il suffit de bien indiquer la feuille, par exemple : Worksheets("Travail")
Ainsi, ton code :
Travail.Rows(derlnT & ":" & derlnT + nbempl).Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Devient :
Worksheets("Travail").Rows(derlnT & ":" & derlnT + nbempl).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
- Deuxième erreur : ne jamais utiliser de copy/paste !!
Il faut déclarer deux variables comme range, la première qui indique la range des cellules que tu veux copier et la deuxième qui indique la range des cellules où tu veux coller (attention, il faut que ces deux variables aient le même nombre de cellules).
C'est cette erreur qui faisait que l'exécution de ta macro prenait du temps.
Ainsi, ton code :
Base.Range("B" & j + bec & ":C" & j + bec).Copy
Travail.Range("B" & derlnT - 1 + j + k & ":C" & derlnT + j + k).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Devient :
Dim CopyRange As Range
Dim PasteRange As Range
Set CopyRange = ThisWorkbook.Worksheets("Base").Range("B" & j + bec & ":C" & j + bec)
Set PasteRange = ThisWorkbook.Worksheets("Travail").Range("B" & derlnT - 1 + j + k & ":C" & derlnT + j + k)
PasteRange.Value2 = CopyRange.Value2
Le .Value2
ne fonctionne qu'avec des tableaux pour information, d'où son utilisation ici.
- Enfin, tu as mis dans ta boucle for l'ajout des formules à chaque fois alors que tu peux insérer toutes les formules en une ligne de code en dehors de cette boucle.
Ce code récupère la ligne qui possède déjà la formule et la glisse dans les cellules du dessous. Comme tu peux le faire manuellement.
Ainsi ton code :
Worksheets("Travail").Range("L" & derlnT - 1 + j + k & ":L" & derlnT + j + k).FormulaLocal = "=SI(SOMME(I" & _
derlnT - 1 + j + k & ":K" & derlnT - 1 + j + k & ")+SI(ESTVIDE(H" & _
derlnT - 1 + j + k & ");0;MIN(H" & derlnT - 1 + j + k & ";40))=0;"""";" & _
"SOMME(I" & derlnT - 1 + j + k & ":K" & derlnT - 1 + j + k & ")+SI(ESTVIDE(H" _
& derlnT - 1 + j + k & ");0;MIN(H" & derlnT - 1 + j + k & ";40)))"
Devient :
Worksheets("Travail").Range("L" & Worksheets("Travail").Range("B" & Rows.Count).End(xlUp).Row - 90).AutoFill Destination:=Range("L" & Worksheets("Travail").Range("B" & Rows.Count).End(xlUp).Row - 90 & ":L" & Worksheets("Travail").Range("B" & Rows.Count).End(xlUp).Row), Type:=xlFillDefault
(Oui, j'ai eu la flemme de mettre une variable pour trouver la dernière ligne du tableau, d'où le formule un peu longue ici, tu modifier cela si tu veux)
Voici donc toutes les modifications que j'ai apporté et qui permette que l'exécution de ta macro sois rapide.
N'oublie pas de faire ces changements dans ton code du UserForm !
Voici donc le fichier final avec modifications :
Bonne journée,
Baboutz
PS :