1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| Option Explicit
Sub AppelRépertoire()
' Macro
'Declaration des variables
Dim Classeur_Maitre As Workbook, Classeur_Slave As Workbook
Dim oShell As Object, oFolder As Object
Dim oFolderItem As Object
Dim Tab_Files As Variant
Dim aFile As Variant
Dim ValueB7 As String 'si le contenu de la cellule B7 est numerique mettre Long ou integer a la place de string
Dim Cel As Range
Application.DisplayAlerts = False
Set Classeur_Maitre = ActiveWorkbook
'Moceau de code original pioché ici -> http://www.developpez.net/forums/d270516/autres-langages/general-visual-basic-6-vbscript/vbscript/vos-contributions-vbscript/faq-utiliser-boite-dialogue-selection-repertoire/
Set oShell = CreateObject("Shell.Application")
Set oFolder = oShell.BrowseForFolder(&H0&, "Choisir un répertoire", &H1&)
If oFolder Is Nothing Then
MsgBox "Abandon opérateur", vbCritical
Exit Sub
Else
Set oFolderItem = oFolder.Self
'MsgBox oFolderItem.Path
End If
'Fin du morceau pioché
'On recupert les fichier contenu dans le repertoire en question
Tab_Files = ListFilesInFolder(oFolderItem.Path, False) 'mettre true a la place de false pour regarder les sous repertoires et rajouter une liste d'extension pour limiter les fichiers listés (,"txt;ert;doc;xls")
For Each aFile In Tab_Files
Set Classeur_Slave = Workbooks.Open(aFile, ReadOnly:=True)
'Ouvre le premier classeur et copie la cellule B7
ValueB7 = Classeur_Slave.Sheets("En tête").Range("B7").Copy
'Sélectionne la feuille toujours du premier classeur "Bordereau collecte"
With Classeur_Slave.Sheets("Bordereau collecte")
'Colle B7 en collage spécial valeurs si cellule adjacente non vide toujours du premier classeur
For Each Cel In .Range(.Cells(4, "F"), .Cells(Rows.Count, "F").End(xlUp))
If Cel <> "" Then Cel.Offset(0, -1).Value = ValueB7
Next Cel
End With
'le tableau suivant est toujours de la meme taille ?"E4:AT1000" non d'un nombre de lignes différent mais jamais plus de 1000 je n'ai pas su rendre le code evolutif en fonction d'un nombre de ligne changeant !!
Classeur_Slave.Sheets("Bordereau collecte").Range("E4:AT1000").Copy
'Copie E4:AT100 du premier classeur et le colle en collage spécial valeurs dans le fichier de la macro Sheet "Tous les Bordereaux Collectes"
With Classeur_Maitre.Sheets("Tous les Bordereaux Collectes").Range("A65536").End(xlUp)
.Offset(2, 8).Value = Classeur_Slave.Name
.Offset(2, 0).PasteSpecial Paste:=xlValues
End With
Classeur_Slave.Close False
Next
MsgBox "Attention, Tous les fichiers sont chargés, Enregistrer le fichier en ajoutant TOUS pour garder l'original vièrge"
End Sub
Function ListFilesInFolder(strFolderName As String, Optional bIncludeSubfolders As Boolean = False, Optional strTypeFichier As String) As Variant
' adapté de Ole P Erlandsen
' necessite d'activer la reference Microsoft Scripting RunTime par VBA Outils Références cocher Microsoft Scripting RunTime
' Code modifié par Qwazerty le 14/03/2010
' Code initial http://www.developpez.net/forums/d200523/logiciels/microsoft-office/excel/contribuez/lister-fichiers-repertoire-feuille-excel/
' En reponse a la demande de ce post http://www.developpez.net/forums/d891321/logiciels/microsoft-office/excel/macros-vba-excel/boucle-fichiers-repertoire/
' tabTypeFichier represente une liste des differents extensions a prendre en compte lors du dressage de la liste des fichiers, celle ci seront séparé par ; ex: "xls;doc"
' ListFilesInFolder renvoi un tableau contenant le chemin de chaque fichiers
Static FSO As FileSystemObject
Static bNotFirstTime As Boolean
Static tabType As Variant, vType As Variant
Static dicoType As Object
Static strResult As String
Dim bTheFirst As Boolean
Dim oSourceFolder As Scripting.Folder
Dim oSubFolder As Scripting.Folder
Dim oFile As Scripting.File
'Static wksDest As Worksheet
'Static iRow As Long
'initialisation
bTheFirst = False
If Not bNotFirstTime Then
'On identifi le tout premiere appel de la fonction recursive
bTheFirst = True
Set FSO = CreateObject("Scripting.FileSystemObject")
Set dicoType = CreateObject("Scripting.Dictionary")
If strTypeFichier <> "" Then
'On cré un tableau contenant toutes les extensions / * si rien de precisé
tabType = Split(strTypeFichier, ";")
' a l'aide de ce tableau on renseigne notre dictionnaire
For Each vType In tabType
dicoType.Add vType, "Ext"
Next
End If
bNotFirstTime = True
On Error Resume Next
Set oSourceFolder = FSO.GetFolder(strFolderName)
On Error GoTo 0
'On regarde si le rep existe bien
If oSourceFolder Is Nothing Then
MsgBox "Le répertoir '" & strFolderName & "' n'existe pas." & vbCrLf & "L'execution va prendre fin.", vbExclamation, "Répertoir inconnu"
GoTo finApp
End If
End If
Set oSourceFolder = FSO.GetFolder(strFolderName)
'On boucle sur tous les fichier present
For Each oFile In oSourceFolder.Files
'On verifie que l'extension du fichier correspond a ce qui est demandé
If dicoType.Exists(ExtractFileExt(oFile.Name)) Or (strTypeFichier = "") Then
'On le rajoute dans la chaine result
strResult = strResult & oFile.Path & ";"
End If
Next oFile
'Si on a l'option Sous dossier on boucle sur les sous dossiers
If bIncludeSubfolders Then
For Each oSubFolder In oSourceFolder.SubFolders
'On ajoute les fichiers contenu dans ce rep dans la liste precedente
strResult = Join(ListFilesInFolder(oSubFolder.Path, True), ";") & ";"
Next oSubFolder
End If
'On supprime le dernier ";" s'il il exist
If Right(strResult, 1) = ";" Then strResult = Left(strResult, Len(strResult) - 1)
'On renvoi le resulta sous forme de tabelau
ListFilesInFolder = Split(strResult, ";")
finApp:
'Si on se trouve dans le 1er appel on reinitialise les vaiables Static
'pour ne pas conserver des valeurs static lors d'une prochaine utilisation de la fonction
If bTheFirst Then
Set FSO = Nothing
Set dicoType = Nothing
bNotFirstTime = False
tabType = ""
vType = ""
strResult = ""
End If
End Function
Function ExtractFileExt(strName As String) As String
If InStr(strName, ".") = 0 Then
ExtractFileExt = ""
Else
ExtractFileExt = Mid(strName, InStrRev(strName, ".") + 1)
End If
End Function |
Partager