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 159 160 161 162 163 164
| '-----------------------------------------------------------------------------------------------
'
' Sous VBE Outils | References Cocher Microsoft ActiveX Data Objects 2.x Library
' Microsoft Scripting Runtime
'
'-----------------------------------------------------------------------------------------------
Private Declare Function QueryPerformanceCounter Lib "Kernel32" (x As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "Kernel32" (x As Currency) As Boolean
Option Explicit
Dim NbFichiers As Long
Dim TabFichiers() As String
' Paramètres à adapter
Const NomFeuille As String = "Feuil1"
Const PlageALire As String = "A1:Z65536"
Const FichierRch As String = "*.xls"
Const ColDep As Long = 2 ' Colonne B
Const RowDep As Long = 2 ' Ligne 2
Private Sub LireDatas(ByVal sDossier As String)
Dim NomFichier As String, Tableau As Variant
Dim i As Long, r As Long, sCol As String
Dim Dep As Currency, Fin As Currency, Freq As Currency
With Application
.StatusBar = ""
.ScreenUpdating = False
End With
QueryPerformanceCounter Dep
Erase TabFichiers
NbFichiers = 0
ListeFichiersDansDossier sDossier, True
ShDatas.Range(Cells(RowDep, 1), Cells(Rows.Count, Columns.Count)).Clear
r = RowDep
sCol = NumCol2Lettre(ColDep)
If NbFichiers = 0 Then
MEP
Exit Sub
End If
For i = 1 To UBound(TabFichiers)
NomFichier = TabFichiers(i)
LireDonnéesADO NomFichier, NomFeuille, PlageALire, Tableau
With ShDatas
.Range(sCol & r, .Cells(r + UBound(Tableau, 1) - 1, UBound(Tableau, 2) + ColDep - 1)).Value = Tableau
r = .Range(sCol & .Cells.Rows.Count).End(xlUp).Row + 1
End With
Application.StatusBar = i & " / " & UBound(TabFichiers)
Next i
MEP
QueryPerformanceCounter Fin: QueryPerformanceFrequency Freq
With Application
.StatusBar = "Terminé : " & Format(((Fin - Dep) / Freq), "0.00 s")
.ScreenUpdating = True
End With
End Sub
Private Sub LireDonnéesADO(ByVal Fichier As String, ByVal Feuille As String, _
ByVal Plage As String, ByRef TableauDatas As Variant)
Dim Conn As ADODB.Connection, Cmd As ADODB.Command
Dim Rs As ADODB.Recordset
Dim Ligne As Long, Colonne As Long
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""
Set Cmd = New ADODB.Command
Cmd.ActiveConnection = Conn
Cmd.CommandText = "SELECT * FROM `" & Feuille & "$" & Plage & "`"
Set Rs = New ADODB.Recordset
Rs.Open Cmd, , adOpenKeyset, adLockOptimistic
ReDim TableauDatas(1 To Rs.RecordCount, 1 To Rs.Fields.Count)
Rs.MoveFirst
Do While Not Rs.EOF
For Ligne = 1 To Rs.RecordCount
For Colonne = 0 To Rs.Fields.Count - 1
TableauDatas(Ligne, Colonne + 1) = Rs.Fields(Colonne).Value
Next Colonne
Rs.MoveNext
Next Ligne
Loop
Conn.Close
Set Rs = Nothing
Set Cmd = Nothing
Set Conn = Nothing
End Sub
Private Sub ListeFichiersDansDossier(ByVal sDossierSource As String, ByVal InclureSousDossiers As Boolean)
Dim FSO As Scripting.FileSystemObject
Dim DossierSource As Scripting.Folder, SousDossier As Scripting.Folder
Dim Fichier As Scripting.File
Dim sNomFichier As String
Dim VerifNom As Boolean
Set FSO = New Scripting.FileSystemObject
Set DossierSource = FSO.GetFolder(sDossierSource)
For Each Fichier In DossierSource.Files
sNomFichier = FSO.GetFileName(Fichier)
VerifNom = UCase(sNomFichier) Like UCase(FichierRch) And sNomFichier <> ThisWorkbook.Name
If VerifNom Then
NbFichiers = NbFichiers + 1
ReDim Preserve TabFichiers(1 To NbFichiers)
TabFichiers(NbFichiers) = Fichier
End If
Next Fichier
If InclureSousDossiers Then
For Each SousDossier In DossierSource.SubFolders
ListeFichiersDansDossier SousDossier.Path, True
Next SousDossier
End If
Set DossierSource = Nothing
Set FSO = Nothing
End Sub
Private Function NumCol2Lettre(iNumCol As Long) As String
Dim i As Long, sStr As String
i = iNumCol
sStr = ""
Do While i > 0
sStr = Chr$(((i - 1) Mod 26) + 65) & sStr
i = (i - 1) \ 26
Loop
NumCol2Lettre = sStr
End Function
Private Sub MEP()
With ShDatas
.Activate
.Cells.ColumnWidth = 10.71
.Columns.AutoFit
.Range("A1").Select
End With
End Sub
Sub SelDossier()
With Application.FileDialog(msoFileDialogFolderPicker)
.InitialFileName = ThisWorkbook.Path & "\"
.Title = "Sélectionner un Dossier"
.AllowMultiSelect = False
.InitialView = msoFileDialogViewDetails
.ButtonName = "Sélection Dossier"
.Show
If .SelectedItems.Count > 0 Then LireDatas .SelectedItems(1)
End With
End Sub |
Partager