pour plus de clarté pour vous je vous copie la Sub complète:
Sub Mise_A_Jour_Bilan()
'DECLARATION DES VARIABLES
Dim Data As Range, DerLigData&, Mini#, Maxi#, Col%, PremColTrouve As Boolean, Premier As Double
Dim DerCol As Byte, PremCol As Byte, Rel As Range, VeilleCol As Byte
Dim Mois$, An$, Calcul As Boolean, Wb As Workbook, csvOuvert As Boolean, v As Byte
Dim TabCol(31)
Dim Liste$
Liste = "§Csv§EBD§BAO§T111§ET§TOUYRE§"
Application.ScreenUpdating = False 'fige l'affichage écran pendant le traitement de la macro
'RECHERCHE DES DATES LIMITES DU MOIS
With ThisWorkbook
Mois = Mid(.Name, Len(.Name) - 8, 2) 'extraction du mois à partir du nom de fichier
An = Mid(.Name, Len(.Name) - 5, 2) 'extraction de l'année à partir du nom de fichier
'Vérification de la cohérence des données extraites
If Not (IsNumeric(Mois) And IsNumeric(An)) Then _
MsgBox "Le nom de ce fichier ne permet pas son traitement": Exit Sub
If Mois < 1 Or Mois > 12 Then MsgBox "Numéro de mois incohérent dans le nom de fichier": Exit Sub
Mini = CDate("01/" & Mois & "/" & An) 'premier jour du mois
Maxi = CDate("01/" & Mois + 1 & "/" & An) - 1 'dernier jour du mois(veille du premier jour du mois suivant)
End With
'TRAVAIL SUR LE FICHIER "Report.xls"
' csvOuvert = False 'initialise la variable à False (faux)
For Each Wb In Application.Workbooks 'boucle sur chacun des fichiers ouverts
If Wb.Name = "Report.xls" Then csvOuvert = True: Exit For 'change la variable si le fichier est ouvert
Next Wb
'message et abandon de la procédure si le fichier Report.xls n'est pas ouvert
If Not csvOuvert Then MsgBox "Vous devez d'abord ouvrir le fichier Report.xls": Exit Sub
Windows("Report.xls").Activate 'Active la fenêtre du fichier xls
DerLigData = Range("d65536").End(xlUp).Row '- 1 'recherche le numéro de la dernière ligne utile
Set Data = ActiveSheet.Range("d3:ah" & DerLigData) 'Définit le champ attribué à la variable
'ANALYSE DES DATES DU CHAMP DATA
' PremColTrouve = False ': DeuxiemeTrouve = False 'initialise les variables à False (faux)
'si une ou plusieurs date(s) du mois sont dans le fichier csv
With Data
If Maxi >= WorksheetFunction.Small(.Rows(1), 1) And Mini <= WorksheetFunction.Large(.Rows(1), 1) Then
For Col = 1 To 31 'boucle sur les 31 cellules du champ
'crée un tableau de 31 cellules dans lequel les n° des colonnes répondant aux critères s'inscrivent
If .Cells(1, Col) >= Mini And .Cells(1, Col) <= Maxi Then
'cherche le N° de colonne de la première date correcte trouvée, enregistre sa valeur et sa position
If Not PremColTrouve Then
PremColTrouve = True: Premier = .Cells(1, Col): PremCol = Col
If Col = 1 Then 's'il s'agit du premier jour du mois
For v = 28 To 31 'boucle sur les colonnes 28 à 31
'si un de ces jours correspond à la veille du prmier jour du mois
'mémorise le N° colonne dans la variable VeilCol puis sort de la boucle
If .Cells(1, v) = Premier - 1 Then VeilleCol = v: Exit For ' Else VeilleCol = 0
Next v
End If
End If
TabCol(Col) = Col: DerCol = Col 'ajoute dans le tablo fictif e mémorise le dernier numéro de colonne
End If
Next Col
Else: MsgBox "Aucune donnée dans Report.xls correspondante à ce mois": Exit Sub
End If
End With
With ThisWorkbook
Windows(.Name).Activate 'active ce classeur
For Each Ws In .Worksheets 'boucle sur chacune des feuilles
If InStr(Liste, "§" & Ws.Name & "§") <> 0 Then
Set Rel = Ws.Range("b8") 'affecte la cellule "b8" à la variable Rel (Relevé)
Do 'débute une boucle infinie
If Rel > 3 And Rel <= DerLigData Then 'vérifie la cohérence de la valeur de la ligne
Calcul = IIf(Rel.Offset(1, 0) > 0, True, False) 'affecte vrai ou faux à la variable Calcul
'boucle sur chacune des colonnes de Data répondant au critère de date de ce fichier
For Col = PremCol To DerCol
'si Rev n'est pas vide et qu'un numéro de colonne est dans le TabCol
If Rel.Offset(Col + 3, 0) = "" And TabCol(Col) > 0 Then
With Data 'applique les instructions suivantes à la variable Data
If Calcul Then 's'il s'agit d'une donnée à calculer
's'il s'agit du premier jour du mois et que des valeurs sont dispo pour la veille _
report de la valeur du jour - la valeur dans la colonne VeilleCol
If Col = 1 And VeilleCol > 0 Then _
Rel.Offset(Col + 2, 0) = .Cells(Rel - 2, Col) - .Cells(Rel - 2, VeilleCol)
's'il ne s'agit ni premier jour du mois, ni du premier trouvé,report de la valeur _
du jour - la valeur dans la colonne immédiatement à gauche
If Col > 1 And Col <> PremCol Then _
Rel.Offset(Col + 2, 0) = .Cells(Rel - 2, Col) - .Cells(Rel - 2, Col - 1)
'report directe de la donnée (pour les données sans calcul)
Else: Rel.Offset(Col + 2, 0) = .Cells(Rel - 2, Col)
End If
End With
End If
Next Col
Else: MsgBox "La valeur en " & Rel.Address & " de la feuille " & Ws.Name & " n'est pas cohérente"
End If
Set Rel = Rel.Offset(0, 1) 'décale l'affectation de la variable d'une colonne vers la droite
Loop While Rel > 0 'poursuit la boucle tant qu'un N° de ligne est précisé
End If
Next Ws 'poursuit la boucle sur la feuille suivante
End With
End Sub