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)

@+

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 String

La 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 Sub

L'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 Sub

L'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 Sub

Sans 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 !

Rechercher des sujets similaires à "import bases donnees csv xslx"