Archivage conditionnel vers un nouveau classeur
Bonjour,
Je me penche sur un outil VBA permettant d'archiver les données d'un fichier Excel qui gère la location d'engins.
Le constat : A la fin de l'année le fichier Excel devient trop lourd : plus de 2000 lignes et environ 380 colonnes.
L'idée est d'archiver ces lignes en fonction de la valeur d'une colonne : Date de fin.
Ainsi nous pourrions exporter dans un nouveau classeur ce tableau afin de garder toutes les données mais de les séparer en plusieurs fichier (en fonction de la date de fin de location) afin d'alléger la taille.
Ex : le fichier 2019 LOCATION transfèrera ces donnés aux quatre fichiers suivants : 2019 LOCATION T1 (de janvier à mars), 2019 LOCATION T2(d'avril à juin), 2019 LOCATION T3(de juillet à septembre), 2019 LOCATION T4(d'octobre à décembre).
Le hic, c'est que nous avons un autre fichier qui lui, doit exploiter les données de tous les classeurs afin de faire un récapitulatif des couts des locations.
La première question est la suivante : VBA me permet-il de répondre à mes besoins?
La seconde : Vers quels outils VBA dois-je m'orienter?
Merci d'avance pour vos lumières.
Je peux aussi me tromper de stratégie en voulant générer 4 fichiers pour aller celui d'origine, je suis ouvert à toute suggestion
bonjour
il est normal d'avoir des milliers de lignes, mais pas d'avoir plus de colonnes
à quoi servent les colonnes ?
à te relire
amitiés et bonne année
En fait les colonnes vont de A à F, il s'agit du bandeau principale du tableau. Ensuite il y a le bandeau secondaire qui est juxtaposé au principal. Dans celui ci il y a un pseudo calendrier ou une colonne représente un jour calendaire. Lorsqu'un "1" est mis dans une de ces colonnes, la colonne dans le bandeau principale qui compte le nombre de jour de location s'incrémente de 1, affectant ainsi le prix de la location qui est basé sur un cout journalier + transport A/R.
Alors j'ai avancé un peu, voilà le code que j'ai fait.
Mon problème :
1. Malgré les instructions que je mets dans le code, j'ai l'impression que certaines lignes saute (passent entre les mailles du filets).
2. Les opérations ne sont pas optimisés, le code mets longtemps à s'exécuter (après c'est normal je pense vu qu'il a 2000 lignes a traiter, dans le futur l'archivage pour se faire régulièrement car le programme ne considère pas les lignes sans date de fin de location et le nombre de lignes a traiter sera donc moindre).
Je met mon code ci-dessous :
Sub Transfert()
'--DECLARATIONS-----------------------------------------'
Dim WbT1 As Workbook 'Déclarations des différents classeurs
Dim WbT2 As Workbook
Dim WbT3 As Workbook
Dim WbT4 As Workbook
Dim WbS As Workbook
Dim OS As Worksheet 'Déclarations des onglets de chaque classeur
Dim OD1 As Worksheet
Dim OD2 As Worksheet
Dim OD3 As Worksheet
Dim OD4 As Worksheet
Dim DEST As Range 'destination du copier coller
Dim DL As Long 'definition de la dernière ligne
Dim CD As Long 'colonne date de fin
Dim D1 As Date 'date limite pour le 1er trimestre
Dim D2 As Date 'date limite pour le second trimestre
Dim D3 As Date 'date limite pour le 3eme trimestre
Dim D4 As Date 'date limite pour le dernier trimestre
Dim Chemin As String 'chemin du dossier ou se trouve les fichiers excels
'--INITIALISATION---------------------------------------'
Chemin = ThisWorkbook.Path + "\"
Set WbS = ThisWorkbook 'définit le classeur source'
Set WbT1 = Workbooks.Open(Chemin + "2018 LOCATION T1.xls") 'définit le classeur 1 trimestre'
Set WbT2 = Workbooks.Open(Chemin + "2018 LOCATION T2.xls") 'définit le classeur 2 trimestre'
Set WbT3 = Workbooks.Open(Chemin + "2018 LOCATION T3.xls") 'définit le classeur 3 trimestre'
Set WbT4 = Workbooks.Open(Chemin + "2018 LOCATION T4.xls") 'définit le classeur 4 trimestre'
Set OS = WbS.Worksheets("suivie")
Set OD1 = WbT1.Worksheets("archive")
Set OD2 = WbT2.Worksheets("archive")
Set OD3 = WbT3.Worksheets("archive")
Set OD4 = WbT4.Worksheets("archive")
CD = 20 'Position de la colonne ou se trouve les dates de fin de location
DL = OS.Cells(Application.Rows.Count, "B").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne B de l'onglet OS du classeur WbS
D1 = CDate("01/04/2018")
D2 = CDate("01/07/2018")
D3 = CDate("01/10/2018")
D4 = CDate("31/12/2018")
'--CODE-------------------------------------------------'
For i = 6 To DL
If (OS.Cells(i, CD).Value < D1 And OS.Cells(i, CD).Value > 0) Then
'copie la ligne et on la déplace dans T1, puis on la supprime dans le fichier d'origine
Set DEST = OD1.Cells(Application.Rows.Count, "B").End(xlUp).Offset(1, 0) 'on parametre la destination
OS.Cells(i, "B").Resize(1, 21).Copy 'On copie la ligne
DEST.PasteSpecial xlPasteValues 'On fait un collage spécial des valeurs
OS.Cells(i, "B").EntireRow.Delete 'On supprime la ligne
' j1 = j1 + 1
Else:
If (OS.Cells(i, CD).Value >= D1 And OS.Cells(i, CD).Value < D2) Then
'copie la ligne et on la déplace dans T2, puis on la supprime dans le fichier d'origine
Set DEST = OD2.Cells(Application.Rows.Count, "B").End(xlUp).Offset(1, 0)
OS.Cells(i, "B").Resize(1, 21).Copy
DEST.PasteSpecial xlPasteValues
OS.Cells(i, "B").EntireRow.Delete
'j2 = j2 + 1
Else:
If (OS.Cells(i, CD).Value < D3 And OS.Cells(i, CD).Value >= D2) Then
'copie la ligne et on la déplace dans T3, puis on la supprime dans le fichier d'origine
Set DEST = OD3.Cells(Application.Rows.Count, "B").End(xlUp).Offset(1, 0)
OS.Cells(i, "B").Resize(1, 21).Copy
DEST.PasteSpecial xlPasteValues
OS.Cells(i, "B").EntireRow.Delete
'j3 = j3 + 1
Else:
If (OS.Cells(i, CD).Value <= D4 And OS.Cells(i, CD).Value >= D3) Then
'copie la ligne et on la déplace dans T4, puis on la supprime dans le fichier d'origine
Set DEST = OD4.Cells(Application.Rows.Count, "B").End(xlUp).Offset(1, 0)
OS.Cells(i, "B").Resize(1, 21).Copy
DEST.PasteSpecial xlPasteValues
OS.Cells(i, "B").EntireRow.Delete
'j4 = j4 + 1
Else: 'rien faire'
End If
End If
End If
End If
Next
OD1.Columns("S:T").NumberFormat = "m/d/yyyy" 'Mise en forme au format Date courte
OD1.Columns("A:T").EntireColumn.AutoFit 'Ajuster la largeur des cellules
OD2.Columns("S:T").NumberFormat = "m/d/yyyy"
OD2.Columns("A:T").EntireColumn.AutoFit
OD3.Columns("S:T").NumberFormat = "m/d/yyyy"
OD3.Columns("A:T").EntireColumn.AutoFit
OD4.Columns("S:T").NumberFormat = "m/d/yyyy"
OD4.Columns("A:T").EntireColumn.AutoFit
End Sub
Voila, voila, désolé pour le pavé j'espère avoir structuré mon code suffisamment pour que tout le monde puisse le comprendre.
Envoyer vos remarques/idées !
Merci d'avance !