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 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
| '---------------------------------------------------------------------------------------
' Procedure : Fct_Xls_Import
' Author : Thomas Boulay
' Date : 19/06/2013
' Purpose : Import d'un fichier Excel
' Parametres : Chemin et nom du fichier, nom de la feuille, numero de ligne de depart (par defaut : 1ere ligne),
' contôle de l'entete (par defaut : non), entete a contrôler
'---------------------------------------------------------------------------------------
'
Function Fct_Xls_Import(ByVal strFilename As String, Optional strSheetName As String, Optional lngStartLine As Long = 1, Optional blnHeaderControl As Boolean = False, Optional strHeader As String) As Boolean
Dim appExcel As Excel.Application 'Necessite la reference Microsoft Excel Object Library
Dim wbExcel As Excel.Workbook 'Classeur Excel
Dim wsExcel As Worksheet 'Feuille Excel
Dim varTab() As Variant 'Tableau dynamique
Dim lngLine As Long 'Numero de ligne
Dim lngColumn As Long 'Numero de colonne
Dim lngNbColumns As Long 'Nombre de colonnes
Dim lngNbLines As Long 'Nombre de lignes
Dim lngLineData As Long
Dim lngColData As Long
Dim rss As New ADODB.Recordset 'Necessite la reference Microsoft ActiveX Data Objects Library
Dim dtmChange As Date 'Date de modification du fichier
Dim i As Long
Dim strFileHeader As String
dtmChange = Fct_File_DateModif(strFilename)
'Ouverture d'Excel
Set appExcel = CreateObject("excel.application")
appExcel.ScreenUpdating = False
appExcel.EnableEvents = False
'Ouverture du classeur
Set wbExcel = appExcel.Workbooks.Open(strFilename)
If strSheetName = "" Then 'si la feuille n'est pas renseignee on importe la 1ere feuille
Set wsExcel = wbExcel.Sheets(1)
Else
'Verifie si la feuille existe
If Fct_Xls_SheetIsExist(wbExcel, strSheetName) = False Then
MsgBox "L'onglet " & strSheetName & " n'existe pas."
'Fermeture du classeur Excel
wbExcel.Close False
appExcel.ScreenUpdating = True
appExcel.EnableEvents = True
'Fermeture d'Excel
appExcel.Quit
'Liberation memoire
Set wsExcel = Nothing
Set wbExcel = Nothing
Set appExcel = Nothing
Fct_Xls_Import = False
Exit Function
End If
Set wsExcel = wbExcel.Sheets(strSheetName)
End If
'Transfere les donnees d'excel dans la variable tableau : ATTENTION RISQUE DE SATURATION MEMOIRE
varTab = wsExcel.UsedRange.value 'le UsedRange permet de definir automatiquement la zone des donnees
'Recupere les dimensions du tableau
lngNbColumns = UBound(varTab, 2)
lngNbLines = UBound(varTab, 1)
'Recherche de la premiere ligne non vide
'Initialisation des variables
lngLine = 1
lngColumn = 1
Do Until varTab(lngLine, lngColumn) <> ""
lngLine = lngLine + 1
Loop
lngLineData = lngStartLine 'ligne des donnees
lngColData = 0
'Contrôle de l'entete
If blnHeaderControl = True Then
Do Until lngColumn = lngNbColumns + 1
If strFileHeader <> "" Then strFileHeader = strFileHeader & ","
strFileHeader = strFileHeader & varTab(lngLine, lngColumn)
lngColumn = lngColumn + 1
Loop
If strFileHeader Like strHeader Then
'L'entete est conforme
Else
'L'entete n'est pas conforme
Fct_Nav_Msg Replace(Message("msgHeaderMismatch"), "{1}", strHeader) & " " & strFileHeader, 0, 1, 0, 1
'Fermeture du classeur Excel
wbExcel.Close False
appExcel.ScreenUpdating = True
appExcel.EnableEvents = True
'Fermeture d'Excel
appExcel.Quit
'Liberation memoire
Set wsExcel = Nothing
Set wbExcel = Nothing
Set appExcel = Nothing
Fct_Xls_Import = False
Exit Function
End If
End If
'Suppression des donnees de la table temporaire
CurrentDb.Execute "DELETE * FROM tImport_Temp", dbFailOnError
'Ouverture du recordset de la table temporaire pour ajout des donnees
rss.Open "SELECT * FROM tImport_Temp", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
'Boucle de changement de ligne
Do
'Boucle de changement de colonne
Do
lngColumn = 1
'Ajout d'un enregistrement
rss.AddNew
'Ajoute le nom du fichier
rss!SOURCING = wbExcel.Name
'Ajoute le nom de la feuille qui correspond a la zone dans la 1ere colonne de la table
rss!F1 = wsExcel.Name
'Ajoute la date de modification du fichier
rss!DT_CHANGE = dtmChange
i = 1 'les champs precedents ne faisant pas partie du tableau il faudra incrementer de i le nombre de colonnes
'Recupere les entetes de ligne
rss.Fields("F" & i + 1).value = varTab(lngLineData, lngColumn)
'jusqu'a ce qu'un champ cotienne un nombre ou soit vide
lngColumn = lngColumn + 1
Do Until lngColumn = lngNbColumns
'Ajoute la donnee dans la table
rss.Fields("F" & lngColumn + i).value = varTab(lngLineData, lngColumn)
lngColumn = lngColumn + 1
Loop
'Recupere les quantites
rss.Fields("F" & (lngColumn + i - 1 + lngLine)).value = varTab(lngLineData, lngColumn + lngColData)
rss.Update
lngColData = lngColData + 1
Loop Until lngColumn + lngColData = lngNbColumns + 1
lngLineData = lngLineData + 1
lngColData = 0
Loop Until lngLineData = lngNbLines + 1
'Efface le contenu du tableau
Erase varTab
'Fermeture du recordset
rss.Close
Set rss = Nothing
'Fermeture du classeur Excel
wbExcel.Close False
appExcel.ScreenUpdating = True
appExcel.EnableEvents = True
'Fermeture d'Excel
appExcel.Quit
'Liberation memoire
Set wsExcel = Nothing
Set wbExcel = Nothing
Set appExcel = Nothing
Fct_Xls_Import = True
End Function |
Partager