ghosts11111
XLDnaute Nouveau
Bonjour à tous,
je souhaite simplifier une macro qui aujourd'hui me prend énormément de temps. le but de la macro est de récupérer les affectations de 300 personnes par services en fonction d'une base de données de 18000 lignes.
La macro initiale fonctionne rapidement mais en 2ème partie je demande à la macro de me supprimer toutes les lignes ayant une affectation à 0h et là il met un temps fou.
Merci à vous si une simplification est possible.
code :
je souhaite simplifier une macro qui aujourd'hui me prend énormément de temps. le but de la macro est de récupérer les affectations de 300 personnes par services en fonction d'une base de données de 18000 lignes.
La macro initiale fonctionne rapidement mais en 2ème partie je demande à la macro de me supprimer toutes les lignes ayant une affectation à 0h et là il met un temps fou.
Merci à vous si une simplification est possible.
code :
VB:
Sub CréerAffectations()
Application.ScreenUpdating = False
Dim Base As Range, Personnels As Range, Personnel As Range, Destination As Range
Dim LoAffectations As ListObject
'compteur temps
Dim debut As Date, temps As Date, fin As Date
debut = Time
'suppression base avant création
Sheets("Affectations").Activate
Rows("2:10000").Select
Selection.Delete Shift:=xlUp
' initialisation des variables de travail
With ThisWorkbook
Set Base = .Sheets("Base").Range("T_Base")
Set Personnels = .Sheets("Base personnel").Range("T_BasePersonnel")
Set LoAffectations = .Sheets("Affectations").ListObjects("T_Affectations")
End With
' Pour chaque ligne de personnel
For Each Personnel In Personnels.Rows()
' Vérifier que le personnel en cours de boucle n'est pas déjà dans le tableau des affectations
If Not IsError(Application.Match(Personnel.Cells(1, 1), LoAffectations.Range.Columns(2), 0)) Then
' S'il l'est, demander s'il faut continuer ou passer au prochain
If MsgBox(Personnel.Cells(1, 2) & " existe déjà dans le tableau des affectations !" & vbCrLf & _
"Continuer et l'ajouter de nouveau ?", vbQuestion + vbYesNo, "Affectation personnel") = vbNo Then GoTo Prochain
End If
' définir la destination de la copie de données
If Not LoAffectations.InsertRowRange Is Nothing Then
' La ligne d'insertion automatique existe, on la retient
Set Destination = LoAffectations.InsertRowRange
Else
' Elle n'existe pas, on la crée
Set Destination = LoAffectations.ListRows.Add().Range
End If
' Copie des données de base dans la destination
Base.Copy Destination
' copie des données particulières dans les colonnes
With Destination.Resize(Base.Rows.Count)
.Columns(1).Value = Personnel.Cells(1, 5).Value ' Fonction
.Columns(2).Value = Personnel.Cells(1, 1).Value ' Matricule
.Columns(3).Value = Personnel.Cells(1, 2).Value ' Nom
End With
Prochain:
Next Personnel
Application.CutCopyMode = False
'supprime toutes les lignes à 0h
Sheets("Affectations").Activate
For Z = 10000 To 2 Step -1 'ligne du tableau
If Cells(Z, 7) = "0" Then 'mot recherché qui supprime la ligne
Rows(Z).Delete
End If
Next Z
'fin suppression ligne à 0h
'module temps fin + box message
fin = Time
temps = fin - debut
MsgBox ("C'est fini !" & Chr(10) & "temps de traitement " & temps)
MsgBox "Fichier prêt"
End Sub
Dernière édition: