le code vba :
Option Explicit
Private Sub Workbook_Open()
' Désactiver les mises à jour pour optimiser les performances
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' Appeler la fonction pour actualiser les factures
ActualiserFactures
' Réactiver les mises à jour une fois terminé
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
Sub ActualiserFactures()
Dim ws As Worksheet
Dim cheminDossier As String
Dim dictFichiers As Collection ' Utilisation d'une Collection à la place de Scripting.Dictionary
Dim tableauFactures() As Variant
Dim derniereLigne As Long
Dim i As Long
Dim compteur As Long
Dim fichier As String
Dim nomFichier As String
Dim dateCreation As Date
Dim fichierExiste As Boolean
' Définir le chemin du dossier PDF (adapté pour macOS)
cheminDossier = "/Users/telemark/Desktop/En cours/pdf/" ' Remplacez par le chemin correct sur macOS
' Créer une référence à la feuille "factures"
On Error Resume Next
Set ws = ThisWorkbook.Worksheets("factures")
On Error GoTo 0
' Si la feuille n'existe pas, la créer
If ws Is Nothing Then
Set ws = ThisWorkbook.Worksheets.Add
ws.Name = "factures"
End If
' Ajouter les titres aux colonnes A, B et C si nécessaire
If ws.Cells(6, "A").Value = "" Then
ws.Cells(6, "A").Value = "N°"
ws.Cells(6, "B").Value = "Factures"
ws.Cells(6, "C").Value = "Date de dépôt"
ws.Range("A6:C6").Font.Bold = True
ws.Range("A6:C6").HorizontalAlignment = xlCenter
End If
' Créer une collection pour stocker les fichiers existants
Set dictFichiers = New Collection
' Remplir la collection avec les fichiers déjà listés
derniereLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
If derniereLigne >= 7 Then
For i = 7 To derniereLigne
dictFichiers.Add ws.Cells(i, "B").Value, ws.Cells(i, "B").Value
Next i
End If
' Initialiser un tableau pour stocker les nouvelles données
compteur = 0
ReDim tableauFactures(1 To 1000, 1 To 3) ' Ajustez la taille selon vos besoins
' Parcourir tous les fichiers PDF dans le dossier (méthode alternative pour macOS)
fichier = Dir(cheminDossier & "*.pdf")
Do While fichier <> ""
nomFichier = fichier
dateCreation = FileDateTime(cheminDossier & fichier)
' Vérifier si le fichier n'est pas déjà dans la collection
fichierExiste = False
On Error Resume Next
fichierExiste = Not IsEmpty(dictFichiers(nomFichier))
On Error GoTo 0
If Not fichierExiste Then
compteur = compteur + 1
' Ajouter les nouvelles données au tableau
tableauFactures(compteur, 1) = derniereLigne - 6 + compteur
tableauFactures(compteur, 2) = nomFichier
tableauFactures(compteur, 3) = dateCreation
End If
fichier = Dir
Loop
' Si des nouveaux fichiers ont été trouvés, les ajouter à la feuille
If compteur > 0 Then
ws.Cells(derniereLigne + 1, "A").Resize(compteur, 3).Value = tableauFactures
End If
' Appliquer le format "jj/mm/aaaa" à la colonne C (Date de dépôt)
ws.Range("C7:C" & derniereLigne + compteur).NumberFormat = "dd/mm/yyyy hh:mm"
' Trier le tableau du plus ancien au plus récent
derniereLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
If derniereLigne >= 7 Then
With ws.Sort
.SortFields.Clear
.SortFields.Add Key:=ws.Range("C7:C" & derniereLigne), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange ws.Range("A7:C" & derniereLigne)
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
' Mettre à jour les index après le tri
For i = 7 To derniereLigne
ws.Cells(i, "A").Value = i - 6
Next i
End If
' Ajouter les liens hypertexte aux factures
Dim cell As Range
For i = 7 To derniereLigne
If ws.Cells(i, "B").Value <> "" Then
ws.Hyperlinks.Add Anchor:=ws.Cells(i, "B"), Address:=cheminDossier & ws.Cells(i, "B").Value, TextToDisplay:=ws.Cells(i, "B").Value
End If
Next i
' Ajuster automatiquement la largeur des colonnes
ws.Columns("A:k").AutoFit
' Libérer les objets
Set dictFichiers = Nothing
End Sub
Je ne peux pas faire de capture car le fichier se trouve au travail, mais à chaque fois que j'ajoute un fichier pdf dans le dossier PDF, Excel demande de sélectionner le fichier et d'autoriser l'accès.