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 :

Importation Fichier Excel sans doublon [AC-2007]


Sujet :

VBA Access

  1. #1
    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 Importation Fichier Excel sans doublon
    Bonjour,

    J'ai actuellement une macro me permettant d'importer des données d'un fichier Excel dans ma base de données Access.
    Cependant, j'aimerai que l'importation soit bloquée si elle a déjà été faite auparavant.
    Pour ça, j'ai pensé à mettre une condition pour tester deux champs qui sont le nom et la date, cependant, étant un débutant complet en VBA, j'ai trouvé des tutos pour éviter les doublons d'un champ mais pas pour deux en même temps.

    Si quelqu'un a des pistes pour tester deux champs en même temps, ou même d'autre pistes pour pouvoir tester si un fichier a déjà été importé

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Bonjour

    Tu veux tester sur les 2 champs Date et Nom pour empêcher
    - l'import du fichier Excel en entier
    - ou l'import des enregistrements qui ont cette date et ce nom ?

    tester si un fichier a déjà été importé
    Tu peux créer une table alimentée par le nom du fichier importé. Il suffit de la consulter juste avant un nouvel import.

    titi95
    Un problème bien posé est à moitié résolu

  3. #3
    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
    L'import du fichier en entier

    Le problème avec la table alimentée par le nom du fichier et qu'il y a déja plusieurs fichiers qui ont été importés !

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Dans ce cas (fichier entier)
    - tu crées une table Historique dans laquelle tu stockes les valeurs des 2 champs lors de chaque import
    - avant chaque nouvel import, tu vas lire les 2 champs dans Excel et tu les compare avec ceux de la table à l'aide d'un requête basée sur la table et avec les valeurs récupérés d'Excel comme critères (ET = sur la même ligne de critères)
    - si le résultat de la requête est vide, tu peux importer.

    Est-ce valable dans ton contexte ?

    titi95
    Un problème bien posé est à moitié résolu

  5. #5
    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
    Les 2 champs sont déjà entrés dans une table, je voudrais justement savoir comment pouvoir comparer ces champs avec ceux du fichier Excel ?

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    1) tu récupères les valeurs des 2 champs dans Excel
    - soit tu sais faire, voir tuto
    http://access.developpez.com/faq/?page=Excel#PilotExcel
    - sois tu importes sous Access dans une table temporaire (à supprimer quand opération terminée)
    2) tu les mets en critères d'une requête basée sur la table Histo
    3) tu teste si la requête est vide (avec Dcount sut Nom par exemple)

    titi95
    Un problème bien posé est à moitié résolu

  7. #7
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Allez, je suis gentil... c'est vendredi
    Un bout de code à mettre sur l’événement "Sur clic" du bouton qui lance ton import (à adapter,à tester, voire à corriger...)
    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
        Dim xlApp As Excel.Application
        Dim xlSheet As Excel.Worksheet
        Dim xlBook As Excel.Workbook
     
        ' Initialiser les variables
        Set xlApp = CreateObject("Excel.Application")
        Set xlBook = xlApp.Workbooks.Open("C:\Chemin\NomFichier.xls") 'à renseigner
     
        NomXls = xlSheet.Range("A2") 'à renseigner + créer Zone de texte NomXls dans le formulaire
        DateXls = xlSheet.Range("B2")  'à renseigner + créer Zone de texte DateXls dans le formulaire
     
        If DCount("[NOM]", "[r_Doublons]") <> 0 Then 'à renseigner
            MsgBox "Fichier déjà importé"
            GoTo Fin
        End If
        DoCmd.TransferSpreadsheet acImport, ... 'à renseigner
     
    Fin:
        'fermeture Excel
        xlBook.Save
        xlApp.Quit
        Set xlSheet = Nothing
        Set xlBook = Nothing
        Set xlApp = Nothing
    titi95
    Un problème bien posé est à moitié résolu

  8. #8
    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
    Je suis en train de faire ça, étant un débutant en VBA, je ne connais pas très bien la syntaxe, j'ai une erreur 424 Objet requis pour ma requête SQL qui est :

    strRequetSQL = "SELECT * FROM Source_Taux WHERE Date = " & stringDate & " AND Site = " & stringNom & ";"

    Edit : Je viens de voir ton deuxieme message, j'avais pas fait la même chose pour récupérer les données, je suis plutot parti sur :
    Set xlSheet = xlBook.Sheets("Taux")
    Set stringDate = xlSheet.Cells(2, 1)
    Set stringNom = xlSheet.Cells(2, 2)

  9. #9
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Coté Excel cela devrait être bon si tuas bien déclaré et ouvert au début du code, sans oublier de fermer à la fin.

    Personnellement, j'évite de travailler avec le SQL pour les requêtes (encore une syntaxe, c'est en ligne...). Aussi je ne peux rien te dire de plus.
    "Moi", j'aurais construit une requête classique en mode Création (on est en 2D et j'y vois plus clair, surtout quand quand il y a de nombreuses combinaisons de critères en ET et OU)
    - basée sur la table,
    - avec les 2 champs nécessaires
    - avec pour chacun, comme critère, le nom du champ du formulaire correspondant à la récup d'Excel.

    Éventuellement tu peux le faire pour vérifier et mettre au point, ensuite tu récupères le SQL.

    titi95
    Un problème bien posé est à moitié résolu

  10. #10
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2012
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2012
    Messages : 53
    Points : 73
    Points
    73
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strRequetSQL = "SELECT * FROM Source_Taux WHERE Date = " & stringDate & " AND Site = " & stringNom & ";"
    Je suis pas mais je crois que les dates (au format français) doivent être entre "#"

    Ensuite il manque les ' avant et après stringNom et je crois que tu n'as pas besoin du dernier ";" mais bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    strRequetSQL = "SELECT * FROM Source_Taux WHERE Date = #" &
     stringDate & "# AND Site = '" & stringNom & "' ;"

  11. #11
    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
    En fait, j'ai abandonné l'idée de la requête SQL, le DCount suffit.

    Voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If DCount("[Site]", "Source_Taux", "[Site] = '" & stringNom & "' AND [Date] = #" & stringDate & "#") <> 0 Then
    (Site et Date étant des champs de Source_Taux)

    La requête fonctionne bien quand le fichier a déjà été importé mais quand le nom n'a jamais été entré il se comporte bizarrement, il me dit "Le champ exemple n'existe pas dans la table destination Source_Taux". Or "exemple" n'est pas un champ mais une valeur (stringNom) !

  12. #12
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Et sans la paire de ' ?

    titi95
    Un problème bien posé est à moitié résolu

  13. #13
    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
    Sans les ', il y a une erreur et il ne comprend pas la requête.

  14. #14
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Une autre proposition...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DCount("[Site]", "Source_Taux", "[Date] = #" & stringDate & "# And [Site] = '" & stringNom & " ' ")
    titi95
    Un problème bien posé est à moitié résolu

  15. #15
    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
    Problème résolu !
    Ça n'avait rien à voir avec le DCount, c'était un problème sur la fermeture du fichier Excel, un peu bizarre

    Tout marche parfaitement, merci

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

Discussions similaires

  1. Importer fichier Excel sans l'entête
    Par Carmiel dans le forum VBA Access
    Réponses: 2
    Dernier message: 31/12/2011, 10h39
  2. Importation fichier Excel dans table Access
    Par kemasse dans le forum Access
    Réponses: 2
    Dernier message: 27/06/2006, 15h12
  3. Ouvrir un fichier excel sans pouvoir le modifier
    Par snakejl dans le forum Langage
    Réponses: 6
    Dernier message: 09/06/2006, 11h46
  4. import fichier excel vers mysql
    Par Groshaeny Roger dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 03/04/2006, 20h31
  5. [SQL Server 2000] erreur lors importation fichier excel
    Par Abydos Business Group dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/03/2006, 09h24

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