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

Contribuez Discussion :

[Sources] [VBA] Importation sélective Excel -> Access sans doublons


Sujet :

Contribuez

  1. #1
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut [Sources] [VBA] Importation sélective Excel -> Access sans doublons
    Bonjour à tous !

    Alors, ce code résume la discussion que j'ai eu avec totofe et présente les dernières avancées auxquelles nous sommes arrivés, grâce à son entière contribution.
    Vu que c'est un thème assez abordé et que l'importation Excel -> Access est souvent utilisée, j'ai pensé que proposer ce code dans les sources pourrait aider pas mal de développeurs en herbe .

    Le code permet de copier les plages de cellules voulues d'un fichier Excel vers les champs voulus d'une table Access, en évitant le doublons.

    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
    Private Sub Commande1_Click()
    'Ici l'importation se déclenche en cliquant sur le bouton "Commande1"
    'mais on peut aussi mettre ce code à l'ouverture d'un formulaire
    Dim oApp As Excel.Application
    Dim oWkb As Excel.Workbook
    Dim oWSht As Excel.Worksheet
     
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open("chemin_du_fichier_xls") 'mettez ici le chemin vers votre fichier Excel
    Set oWSht = oWkb.Worksheets("nom_de_la_feuille_concernée_par_limportation") 'mettez ici le nom de la feuille qui contient les données à importer
     
    'première ligne ou commence l'import
    i = 11
     
    'pour éviter les messages lors de l'ajout des enregistrements
    DoCmd.SetWarnings False
     
    'tant qu'on n'est pas arrivés à la ligne 600 du tableur
    While i < 600
    'on peut aussi arrêter l'importation lorsque le programme rencontre une case
    'vide en remplaçant la ligne du While par :
    'While oWSht.Range("I" & i).Value <> "" '(où I représente la colonne et i la ligne)
     
    'condition de remplissage de la table => eviter les doublons
    'si l'enregistrement existe déjà dans la table destination,
    'on passe à la ligne suivante sans l'importer
    If DCount("*", "[nom_da_la_table_destination]", "[nom_du_champ_destination_qui_ne_doit_pas_avoir_de_doublons] LIKE '" & oWSht.Cells(i, 9) & "'") = 0 Then
    'le numéro 9 correspond au numéro de la colonne source, tel que : A=1, B=2, C=3 ...
     
    'requète SQL (avec en paramètre la ligne i et le numéro de la colonne comme précisé au-dessus)
    cSQL = "insert into [table_destination] ( [champ1], [champ2] ) values (" & Chr(34) & oWSht.Cells(i, 13) & Chr(34) & ", " & Chr(34) & oWSht.Cells(i, 11) & Chr(34) & ");"
    'ici, on ne prend que les colonnes M (=13) et K (=11).
     
    'exécute la requète
    DoCmd.RunSQL cSQL
     
    End If
     
    'on incrémente la variable i pour passer à la ligne suivante
    i = i + 1
     
    Wend
     
    'on réactive les messages d'erreurs
    DoCmd.SetWarnings True
    Set oWSht = Nothing
    Set oWbk = Nothing
    Set oApp = Nothing
    End Sub
    Bon, tous les commentaires ne sont là que pour la compréhension du code, mais si vous aviez toutefois des questions, n'hésitez pas
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  2. #2
    Expert éminent
    Avatar de Lou Pitchoun
    Profil pro
    Inscrit en
    Février 2005
    Messages
    5 038
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 5 038
    Points : 8 268
    Points
    8 268
    Par défaut
    Salut,

    Si tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.SetWarnings False
    il faut à la fin remettre
    Mais il y a peut être plus simple pour importer une partie des données Excel vers Access

  3. #3
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par Lou Pitchoun Voir le message
    Salut,

    Si tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.SetWarnings False
    il faut à la fin remettre
    Message édité !
    J'avais oublié le End Sub, aussi
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Désolé d'arriver si tard mais estce que le bouton se place dans le fichier excel ??

  5. #5
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Non, personnellement, je l'ai placé sur un formulaire sous Access
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 16
    Points : 14
    Points
    14
    Par défaut
    Bonjour. Désolé de déterrer ce post mais comme il m'a servi pour un projet, je tiens à faire part d'une remarque, tout fonctionne correctement mais ne serait-il pas judicieux de libérer la mémoire utilisée par les variables objet à la fin de la fonction?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set oWSht = Nothing
    Set oWbk = Nothing
    Set oApp = Nothing

  7. #7
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par shuggy Voir le message
    Bonjour. Désolé de déterrer ce post mais comme il m'a servi pour un projet, je tiens à faire part d'une remarque, tout fonctionne correctement mais ne serait-il pas judicieux de libérer la mémoire utilisée par les variables objet à la fin de la fonction?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set oWSht = Nothing
    Set oWbk = Nothing
    Set oApp = Nothing
    En effet. J'étais tout jeune développeur à l'époque de ce code, je faisais ça crado

    Par contre il semblerait que l'on ne puisse pas éditer un message trop ancien ?
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 924
    Points
    55 924
    Billets dans le blog
    131
    Par défaut
    Salut.

    Il serait peut-être judicieux de rédiger le code de façon à le rendre générique. En gros, il faudrait retirer les variables "externes" (chemin du fichier, plages, etc...) et les passer en paramètres.

    Cela permet une réutilisation aisée du code, sans devoir se poser la question de savoir où on la place (Excel ou Access, déclenchement par bouton ou "en direct", etc)...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    Il serait peut-être judicieux de rédiger le code de façon à le rendre générique. En gros, il faudrait retirer les variables "externes" (chemin du fichier, plages, etc...) et les passer en paramètres.

    Cela permet une réutilisation aisée du code, sans devoir se poser la question de savoir où on la place (Excel ou Access, déclenchement par bouton ou "en direct", etc)...
    Bonjour Pierre.
    Le problème c'est qu'on ne peut pas entièrement rendre ce code "générique" puisque qu'il s'agit d'une importation sélective.
    Il y aura dans tous les cas des modifications à faire dans le code.
    De plus, bien que le découpage d'un projet en sous-procédures et fonctions soit la bonne méthode de coder, je crains qu'un débutant ne soit pas familier avec leur utilisation (appel, arguments, retour...).

    À toutes fins utiles, voici ce que je peux fournir rapidement :
    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
    Function ImportXL(xlPath As String, wsName As String, startRow As Integer, pKeyCol As String, acTable As String, pKey As String) As Boolean
    '-> La fonction renvoie vrai si l'import réussit et faux dans le cas contraire
    'xlPath : chemin du fichier Excel
    'wsName : nom de la feuille Excel qui contient les données à importer
    'startRow : ligne du fichier Excel où commence l'import
    'pKeyCol : colonne du fichier Excel qui est la clé primaire de la table Access
    'acTable : table Access qui reçoit les données
    'pKey : nom du champ "identifiant"
     
        'active la routine de gestion d'erreur.
        On Error GoTo erreur
     
        'déclaration des variables
        Dim app As Excel.Application
        Dim wkb As Excel.Workbook
        Dim wks As Excel.Worksheet
     
        'initialisation des variables
        Set app = New Excel.Application
        Set wkb = app.Workbooks.Open(xlPath)
        Set wks = wkb.Worksheets(wsName)
     
        Dim i As Integer, cSQL As String
        i = startRow
     
        'pour éviter les messages lors de l'ajout des enregistrements
        DoCmd.SetWarnings False
     
        With wks
            'arrêter l'importation lorsque l'on rencontre une case vide
            While .Range(pKeyCol & i).Value <> "" '(où pKeyCol représente la colonne et i la ligne)
     
                'condition de remplissage de la table => eviter les doublons
                'si l'enregistrement existe déjà dans la table destination,
                'on passe à la ligne suivante sans l'importer
                If DCount("*", acTable, pKey & " LIKE '" & .Range(pKeyCol & i).Value & "'") = 0 Then
     
                    'requête SQL (ajouter autant de champs que nécessaire)
                    cSQL = "INSERT INTO " & acTable & " ( [champ1], [champ2] ) VALUES (" & Chr(34) & .Range("E" & i) & Chr(34) & ", " & Chr(34) & .Range("G" & i) & Chr(34) & ");"
                    'exemple avec les colonnes E et G
     
                    'exécute la requète
                    DoCmd.RunSQL cSQL
     
                End If
     
                'on incrémente la variable i pour passer à la ligne suivante
                i = i + 1
            Wend
     
        End With
     
        'on réactive les messages d'erreurs
        DoCmd.SetWarnings True
     
        'libération variables
        Set wks = Nothing
        Set wkb = Nothing
        Set app = Nothing
     
        MsgBox "Import du fichier Excel réussi.", vbInformation + vbOKOnly, "Opération terminée..."
     
        ImportXL = True
        Exit Function
     
    erreur:    ' Routine de gestion d'erreur.
        MsgBox "Erreur: " & Err.Number & vbCrLf & Err.Description, vbOKOnly + vbInformation
        ImportXL = False
    End Function
    J'ai abondement commenté et ai ajouté un gestionnaire d'erreur.
    Le code a été correctement compilé mais il n'a pas été testé.
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    j'ai repiqué et adapté ce code, qui est très utile, par contre je rencontrais une erreur de type "définie par l'application..",
    Je ne sais pas si c'est moi qui est mal ré-adapté mais en passant la variable Pkeycol en string, et en la definissant par sa lettre de colonne, ça passe...
    A noter que mon stlyle de référence sous Excel n'est pas définie en L1C1, peut être cela venait de cela, je n'ai pas testé...Slts

  11. #11
    Membre éprouvé Avatar de azertix
    Homme Profil pro
    Technicien d'assistance informatique
    Inscrit en
    Juin 2007
    Messages
    958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien d'assistance informatique

    Informations forums :
    Inscription : Juin 2007
    Messages : 958
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par princeflorizel Voir le message
    Bonjour,
    j'ai repiqué et adapté ce code, qui est très utile, par contre je rencontrais une erreur de type "définie par l'application..",
    Je ne sais pas si c'est moi qui est mal ré-adapté mais en passant la variable Pkeycol en string, et en la definissant par sa lettre de colonne, ça passe...
    A noter que mon stlyle de référence sous Excel n'est pas définie en L1C1, peut être cela venait de cela, je n'ai pas testé...Slts
    Il faut effectivement mettre cette variable en string au lieu d'integer.
    Je viens de demander la modification.
    Merci de l'avoir signalé

    Edit : C'est bon, modif faite par Pierre Fauconnier.
    Si ma réponse vous a été utile pensez à voter Pour

    Avant de poster sur le forum Access :
    FAQ > SOURCES > COURS > FORUM > GOOGLE
    Pas de question par MP ou je mords


  12. #12
    Membre habitué Avatar de lakhdar16
    Homme Profil pro
    West POS Senior Representative
    Inscrit en
    Avril 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Algérie

    Informations professionnelles :
    Activité : West POS Senior Representative
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2011
    Messages : 170
    Points : 127
    Points
    127
    Par défaut
    bonjour,

    cette discussion est très intéressante pour moi, ce code m'a beaucoup aidé à réaliser ce que je veux.

    juste une petite question:

    dans mon cas le code sert à importer des données de type numérique, texte, date et booléen dans ma base de données (dorsale/frontale), si le client fait une erreur de saisie dans le fichier Excel par exemple: il met une valeur de type texte au lieu de type numérique, ou il saisi une valeur avec un autre format, comment puis-je éviter l'erreur lors de l'importation en cas de erreur de saisie et convertir les format en cas de format différente dans le fichier Excel?

    J'espère que j'été claire dans ma question.

    merci à vous.

  13. #13
    Membre habitué Avatar de lakhdar16
    Homme Profil pro
    West POS Senior Representative
    Inscrit en
    Avril 2011
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Algérie

    Informations professionnelles :
    Activité : West POS Senior Representative
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2011
    Messages : 170
    Points : 127
    Points
    127
    Par défaut
    Bonsoir,

    peut-on associer un progressBar avec cette fonction?

    merci.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    La solution proposée est intéressante.
    Je possède un problème similaire, cependant, lors de l'importation, ce n'est pas les doublons de valeurs des colonnes que je veux éviter mais les doublons de ligne (ligne dont tous les champs sont égaux).
    Je n'arrive pas à trouver de solutions, si quelqu'un a une piste

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Secrétaire - Service Cantonal de la jeunesse (VS-CH)
    Inscrit en
    Mai 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Secrétaire - Service Cantonal de la jeunesse (VS-CH)
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 25
    Points : 37
    Points
    37
    Par défaut
    Super ce code !

    j'ai moi aussi une question à poser.

    Est-ce que on pourrait imaginer que le code s'applique à tout les classeurs excel dans un répertoire ?

    Exemple fictif : On a des employés qui nous envoient des fiches mensuel de travail. Et avec 70 employé c'est long de faire cette Macro 70 fois. Imaginons que l'on place tout ces documents excels dans D:\horaires\

    Comment nous pourrions adapter le code pour cette situation ?

    Je vais chercher de mon coté aussi

  16. #16
    Membre du Club
    Homme Profil pro
    NC
    Inscrit en
    Janvier 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NC
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2013
    Messages : 61
    Points : 51
    Points
    51
    Par défaut Importation EXCEL
    Bonjour,

    1. Je viens de remarquer qu'importer une cellule EXCEL contenant le guillemet caractère " (ASCII 34) qui génère une erreur. Ce qui est évident...

    Voici le contenu de la cellule: AB335216 / HOLZSUH - BIS "C" et je ne souhaite pas remplacer le caractère " Auriez-vous une piste ?

    2. Si la recherche devait se faire sur 2 champs est-ce que la ligne suivante serait correcte ?
    A savoir que l'on ne souhaite pas de doublon sur le couple pkey et pkey1.


    If DCount("*", acTable, pKey & " LIKE '" & .Range(pKeyCol & i).Value & "' And " & pKey1 & " LIKE '" & .Range(pKeyCol1 & i).Value & "'") = 0 Then



    Merci pour toute aide.

Discussions similaires

  1. Importer Feuil Excel dans Access
    Par beurnoir dans le forum Access
    Réponses: 4
    Dernier message: 21/10/2009, 16h46
  2. problème pour importer données excel dans Access
    Par sarah67 dans le forum Access
    Réponses: 8
    Dernier message: 20/02/2006, 08h17
  3. Importer Feuil Excel dans Access
    Par beurnoir dans le forum Access
    Réponses: 2
    Dernier message: 27/10/2005, 14h13
  4. Problème champ après import d'excel vers access
    Par David M dans le forum Access
    Réponses: 6
    Dernier message: 16/10/2005, 11h53
  5. PB importation classeur excel sous access 2003
    Par techinfo37 dans le forum Access
    Réponses: 6
    Dernier message: 04/10/2005, 20h41

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