Import de bases de données .CSV ou XSLX ?
Bonsoir,
Petite question :
La vitesse d'ouverture d'un document .csv est elle plus rapide qu'un fichier .xslx ..
... Notamment lorsqu'on exécute cette ouverture via une macro ?
Pour le moment je travaille avec des fichier .csv, mais ça devient pénible car les délimitations changent selon l'origine des bases de données (et même lorsque j'enregistre en .csv sous excel avec une délimitation particulière).
Donc je commence à penser que tout faire avec du .xslx pourrait s'avérer plus pratique, mais ça ne doit pas impacter la vitesse d'ouverture des documents.
Bonne soirée !
Bonjour Le Drosophile
Pour moi l'utilisation de fichiers ".xlsx" est mieux, vous pourrez utiliser la connexion ADODB (pas besoin d'ouvrir le fichier)
@+
Bonjour,
Merci BrunoM465 pour votre réponse. J'ai ouvert tous les sujets de discussion pour l'utilisation de la connexion ADODB (sans ouvrir le fichier) et ça semble bien compliqué...
https://forum.excel-pratique.com/excel/probleme-adodb-connection-132874#p816096
https://forum.excel-pratique.com/excel/import-de-donnees-d-un-fichier-excel-ferme-t97127.html
Un post ouvert par vous :
https://forum.excel-pratique.com/excel/import-de-donnees-d-un-fichier-excel-ferme-t97127.html
J'ai pour les moment des erreurs qui sont normalement très facilement résolue,du genre "Erreur définie par l'application ou par l'objet" alors que les librairies sont bonnes...
Bonne journée !
Salut,
Tout développement n'est pas forcément simple... c'est un métier
Mais quand tu as pris l'habitude d'utiliser ADODB ça roule tout seul ou presque
Variables publique pour la connexion ADODB
' Variables pour Connexion ADODB
Public Cnn As Object, Rs As Object
Public sConn As StringLa procédure de connexion
Sub Connect_xls(sPathBdD As String)
Set Cnn = CreateObject("ADODB.Connection")
Cnn.provider = "MSDASQL"
Cnn.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" & _
"DBQ=" & sPathBdD & "; ReadOnly=False;"
End SubL'ouverture des enregistrements
Sub OuvrirRs(sPathBdD As String, sTable As String, Optional sCrit As String, Optional vCrit As String)
Dim sRqt As String, sCond As String, Sql As String
' En cas d'erreur
On Error GoTo Erreur_Proc
FlgErrCon = False
' Connecter la BdD
Call Connect_xls(sPathBdD)
' En cas d'erreur message d'information à l'utilisateur
If FlgErrCon = True Then
MsgBox "Impossible de se connecter à la base de données !", vbCritical, "OUPS..."
Cnn.Close: Set Cnn = Nothing
End
End If
' Préparer la requête
If InStr(1, sTable, " ") > 0 Then
Sql = "SELECT * FROM ['" & sTable & "$']"
Else
Sql = "SELECT * FROM [" & sTable & "$]"
End If
' Vérifier si critère présent
If Not IsMissing(sCrit) Then
' Définir la condition
sCond = "WHERE " & sCrit & "='" & vCrit & "';"
' Créer la syntaxe de la requête
sRqt = Sql & " " & sCond
End If
' Créer un nouveau Recordset et l'ouvrir
Set Rs = CreateObject("ADODB.Recordset")
Rs.Open sRqt, Cnn, CursorType
Exit Sub
Erreur_Proc:
LogError Err, "Sub OuvrirRs(sPathBdD=" & sPathBdD & ", sTable=" & sTable & ", sCrit=" & sCrit & ", vCrit=" & vCrit & ")"
FlgErrCon = True ' Mettre le FLAG d'erreur de connexion à vrai
Resume Next
End SubL'appel de la procédure (exemple)
' Ouvrir le Recordset pour l'équipe
Call OuvrirRs(sPath & sBdD, "PERSONNEL", "NOM_Prénom", NomChef)J'espère que cela pourra vous aiguiller
@+
Oh merci pour les infos !
Finalement, pour le moment, je m'y suis pris ainsi :
Public Sub Import_Data() '[Maj depuis http://silkyroad.developpez.com/VBA/ClasseursFermes/]
Dim source$, fichier$, fe$, lastfich$, sFeuille$, fich, wbks As Workbook, wbkc As Workbook, ddt As Date 'fich,
Dim oSource As ADODB.Connection, oRS As ADODB.Recordset, oCommand As ADODB.Command
If ActiveSheet.Name <> "BDD_SAISIE_FLORE" Then
Set wbkc = ThisWorkbook: fe = ActiveSheet.Name
fich = Application.GetOpenFilename("Fichiers Csv,*.csv")
'If ActiveSheet.Name <> "BDD_SAISIE_FLORE" and Not fich Like "*" & nmfe & "*" Then MsgBox "Pour cette étape, veuillez choisir un document dont le nom contient : " & nmfe: chk2 = chk2 + 1: Exit Sub
If Not fich = False Then
Set wbks = Workbooks.Open(fich, local:=1)
wbkc.Sheets(fe).Cells.clear
wbks.ActiveSheet.Cells.Copy wbkc.Sheets(fe).Cells
wbks.Close 0
Else
MsgBox "Vous n'avez choisi aucun fichier", vbCritical, "Absence de sélection": chk2 = chk2 + 1
End If
End If
If ActiveSheet.Name = "BDD_SAISIE_FLORE" Then
Set wbkc = ThisWorkbook: fe = ActiveSheet.Name
source = ThisWorkbook.Path & "\Bases de données\"
fich = Dir(source & "*BDD_SAISIE_FLORE_*" & "*.xlsx")
ddt = DateSerial(1, 1, 1)
Do While fich <> ""
If FileDateTime(source & fich) > ddt Then
lastfich = source & fich
sFeuille = Replace(fich, ".xlsx", "") & "$"
ddt = FileDateTime(source & fich)
End If
fich = Dir
Loop
fich = lastfich
End If
If fich = False Then MsgBox "Aucun fichier sélectionné" & vbCrLf, vbCritical: Exit Sub
If Dir(fich) = "" Then MsgBox "Fichier absent" & vbCrLf & fich, vbExclamation: Exit Sub
Set oSource = New ADODB.Connection
oSource.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & fich & ";Extended Properties=""Excel 12.0;HDR=NO"";"
Set oCommand = New ADODB.Command
With oCommand
.ActiveConnection = oSource
.CommandText = "SELECT * FROM [" & sFeuille & "]"
End With
Set oRS = New ADODB.Recordset
oRS.Open oCommand, , adOpenKeyset, adLockOptimistic
Set oRS = oSource.Execute("[" & sFeuille & "]")
ActiveSheet.Range("A1").CopyFromRecordset oRS
oRS.Close: oSource.Close
Set oSource = Nothing: Set oRS = Nothing: Set oCommand = Nothing
End SubSans certitude que mon code soit encore complet pour le moment.
Selon le nom de la feuille, l'import se fait avec des formats .csv (lorsque je n'ai pas le choix) ou directement avec des .xlsx lorsque c'est faisable.
Pour l'ouverture automatique des bdd en .xlsx je prend toujours la version la plus récente.
Le résultat est collé dans une feuille. Et pour le moment j'ai un problème avec cette partie. J'essaie de comprendre pourquoi certains en-têtes de colonnes disparaissent (lorsqu'il s'agit de colonne numériques ou de dates).
Bonne journée !