IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Import VBA fichier CSV


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 60
    Par défaut Import VBA fichier CSV
    Bonjour,

    J’ai créer un bouton dans un formulaire Access qui permet d’ouvrir une boîte de dialogue Parcourir pour importer un fichier CSV dans une table Access. Pour cela j’ai utilisé le code suivant de la FAQ que j’ai mis dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Option Compare Database
     
      'Déclaration de l'API
    Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                       "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
     
     'Structure du fichier
    Private Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
     
     'Constantes
    Private Const OFN_READONLY = &H1
    Private Const OFN_OVERWRITEPROMPT = &H2
    Private Const OFN_HIDEREADONLY = &H4
    Private Const OFN_NOCHANGEDIR = &H8
    Private Const OFN_SHOWHELP = &H10
    Private Const OFN_ENABLEHOOK = &H20
    Private Const OFN_ENABLETEMPLATE = &H40
    Private Const OFN_ENABLETEMPLATEHANDLE = &H80
    Private Const OFN_NOVALIDATE = &H100
    Private Const OFN_ALLOWMULTISELECT = &H200
    Private Const OFN_EXTENSIONDIFFERENT = &H400
    Private Const OFN_PATHMUSTEXIST = &H800
    Private Const OFN_FILEMUSTEXIST = &H1000
    Private Const OFN_CREATEPROMPT = &H2000
    Private Const OFN_SHAREAWARE = &H4000
    Private Const OFN_NOREADONLYRETURN = &H8000
    Private Const OFN_NOTESTFILECREATE = &H10000
     
    Private Const OFN_SHAREFALLTHROUGH = 2
    Private Const OFN_SHARENOWARN = 1
    Private Const OFN_SHAREWARN = 0
     
     
    Public Function OuvrirUnFichier(Handle As Long, _
                                    Titre As String, _
                                    TypeRetour As Byte, _
                                    Optional TitreFiltre As String, _
                                    Optional TypeFichier As String, _
                                    Optional RepParDefaut As String) As String
     'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
     'la boîte de dialogue de sélection d'un fichier.
     'Explication des paramètres
        'Handle = le handle de la fenêtre (Me.Hwnd)
        'Titre = Titre de la boîte de dialogue
        'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
            '1 = Chemin complet + Nom du fichier
            '2 = Nom fichier seulement
        'TitreFiltre = Titre du filtre
            'Exemple: Fichier Access
            'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
        'TypeFichier = Extention du fichier (Sans le .)
            'Exemple: MDB
            'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
        'RepParDefaut = Répertoire d'ouverture par defaut
            'Exemple: C:\windows\system32
            'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application
     
    Dim StructFile As OPENFILENAME
    Dim sFiltre As String
     
     'Construction du filtre en fonction des arguments spécifiés
    If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
      sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
    End If
    sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
     
     
     'Configuration de la boîte de dialogue
      With StructFile
        .lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
        .hwndOwner = Handle 'Identification du handle de la fenêtre
        .lpstrFilter = sFiltre 'Application du filtre
        .lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
        .nMaxFile = 254 'Taille maximale du fichier
        .lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
        .nMaxFileTitle = 254  'Taille maximale du nom du fichier
        .lpstrTitle = Import 'Titre de la boîte de dialogue
        .flags = OFN_HIDEREADONLY  'Option de la boite de dialogue
        If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
            RepParDefaut = CurrentDb.Name
            PathStripPath (RepParDefaut)
            .lpstrInitialDir = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Mid$(RepParDefaut, 1, _
    InStr(1, RepParDefaut, vbNullChar) - 1)))
            Else: .lpstrInitialDir = RepParDefaut
        End If
      End With
     
    If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
        Select Case TypeRetour
          Case 1: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFile, InStr(1, StructFile.lpstrFile, vbNullChar) - 1))
          Case 2: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFileTitle, InStr(1, StructFile.lpstrFileTitle, vbNullChar) - 1))
        End Select
      End If
     
    End Function
    Ensuite j’ai placé ce code dans une classe d’objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Commande121_Click()
    'On Error GoTo Err_Commande120_Click
     
    NomFichier = OuvrirUnFichier(Me.Hwnd, "Parcourir", 1, "Fichier CSV ", "csv")
    DoCmd.TransferText acImportDelim, CSV_Format_Import, "Livraisons SCF", NomFichier, True
    Exit_Commande120_Click:
        Exit Sub
    Err_Commande120_Click:
        MsgBox "L'importation n'a pas eu lieu", vbInformation
    End Sub
    Comme c’est un export d’un fichier CSV j’ai créer un format d’import (via la boîte de dialogue Import Access et j’ai bien nommé les champs correspondant lors de la création de ce format d’import.

    Pourtant quand je clique sur le bouton, ça ne fonctionne pas. J’ai un message d’erreur qui me dit que les champs - tous les champs de l’en-tête du fichier CSV - ne sont pas présent dans la table de destination. Mais quand je fais cet import manuellement avec Access en utilisant le format d’import créé, ça fonctionne parfaitement.

    Donc là je ne comprends pas pourquoi ça ne marche pas.

    Si quelqu’un à une solution…

    Merci d’avance

  2. #2
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    Bonjour !

    Je ne sais pas si j'ai une solution mais essaies toujours de mettre "False" en lieu et place de "True" (pour autant que la première ligne de ton fichier CSV soit des données)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferText acExportDelim, CSV_Format_Import, "Livraisons SCF", NomFichier, False

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 60
    Par défaut
    Bonjour,

    J'ai déjà essayé avec False. Dans ce cas là le message d'erreur change: "Le champ F1 est inexistant dans la table de destination".

  4. #4
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Par défaut
    Salut,
    Quand tu utilises l'animateur d'import, Access, dès qu'un champ nouveau apparait, prends en compte cette évolution, mais lorque tu utilises la commande en vba,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferText acExportDelim, CSV_Format_Import, "Livraisons SCF", NomFichier, False
    aucune différence entre ton fichier csv et le paramètre d'import d'access , n'est possible.

    Verifie bien que le nombre de virgule( ou point virgule) +1 correspond au nombre de colonne résultat.

    ces vérifications effectuées, si tu veux que l'on puisse t'aider envoie une extraction de ta base contenant les paramètre d'import, avec un échantillon du fichier csv.

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 60
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Si j'ai bien compris, il faut que je rajoute une colonne en plus dans ma table pour pouvoir importer le fichier CSV.

    Voici les deux premières ligne de mon fichier CSV: la première ligne correspondant au titre des colonnes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IDENTIFIANT REFCDE*;CDRES*;CDURG;CANALVENTE*;CODCLIDO*;REFCLIF*;REFAFF;COMLIV;INSTRANSP;DATEEXP*;CDCLILIV*;NOMLIV*;ADRLIV1*;ADRLIV2;ADRLIV3;ADRLIV4;CDPOSLIV*;LOCLIV*;CDPAYLIV*;TYPENVOI*;REFART*;QTECDE*;TYPCDE;INDLIV;EMAIL*
    1;DIS;00;DIS_DIRECT;19911;AUI000000467131;MU0000009945015;;;20080919;UYHT-314;Nom Prenom;Nom Entreprise;196 Rue des Tulipes;;;92000;Ville;FR;48;210099;1;C;1;toto@tutu.com
    Par contre j'ai pas compris ce que tu veux dire par:
    envoie une extraction de ta base contenant les paramètre d'import
    Voici le message d'erreur que je reçois quand je tente un import (voir PJ). J'ai l'impression qu'il ne prend pas en compte les points virgules.

    Merci
    Images attachées Images attachées  

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 60
    Par défaut
    Bonjour,

    J'ai résolu le problème. J'avais tout bêtement oublié les quotes dans le format d'import ("CSV_Format_Import").

    Maintenant ça marche .

    Merci à tous pour votre aide.

    Srini

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Importer un fichier .csv sur excel avec VBA
    Par sambrook dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/01/2013, 12h47
  2. Import de fichier CSV automatique dans Access
    Par Jmar dans le forum Access
    Réponses: 4
    Dernier message: 20/01/2006, 10h48
  3. Importer un fichier CSV dans un clientdataset ?
    Par mls dans le forum Bases de données
    Réponses: 7
    Dernier message: 15/04/2005, 12h35
  4. [Conseil] Import de fichier CSV vers MySQL
    Par ShinJava dans le forum JDBC
    Réponses: 6
    Dernier message: 15/03/2005, 19h14
  5. Importation de fichier CSV vers une base Interbase
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 15/03/2005, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo