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 :

Optimisation: Import Excel vers Access par batch plutot que ligne par ligne


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut Optimisation: Import Excel vers Access par batch plutot que ligne par ligne
    Bonjour,

    Je dispose d'un fichier Excel un peu particulier à importer de façon automatique dans une table, j'ai donc pour cela réalisé une fonction VBA.
    Je ne peux pas (et ne veut pas) importer le fichier via l'import d'access, car j'effectue quelques tests pour importer les bonnes lignes, et le format du fichier ne permet pas de toute manière une importation via "Fichier -> Importer".

    Le coeur de ma fonction ressemble grosso modo à ça :

    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
    Dim derLigne As Long
    derLigne = oWSht.Range("A65536").End(xlUp).Row
    'On importe jusqu'à la dernière ligne
    While i <= derLigne '(où i représente la ligne)
         'On ne veut pas importer les lignes qui commencent par "Besoin", celles où Ai=Bi et celles qui sont égales à "Total"
         If (Left(oWSht.Range("A" & i).Value, 7) <> "Besoins" And oWSht.Range("B" & i).Value <> "" And oWSht.Range("A" & i).Value <> "Total") Then
              'Pour chaque lignes on effectue 3 importations dans la table temporaire: col(J) stock la position des trois colonnes à importer.
              For j = 0 To 2
                   DoCmd.RunSQL "INSERT INTO [Importation_Alloc_Temp] ( [Modèle], [Pays], [Volume], [Mois] ) VALUES ('" _
                   & oWSht.Cells(i, 1) & "', '" _
                   & oWSht.Cells(i, 2) & "', '" _
                   & Val(oWSht.Cells(i, col(j))) & "', '" _
                   & Mois(j) & "');"
                   count = count + 1
              Next j
         End If
         'on incrémente la variable i pour passer à la ligne suivante
         i = i + 1
    Wend
    Or ce code est un peu long car j'importe au final 3500 enregistrements environ. C'est pas mal, mais franchement pas énorme, et j'aimerais optimiser le temps d'execution (~20sec) (sans la requête, ma fonction met au total 2sec pour tout parcourir). Je veux surtout l'optimiser car ma base est destinée à être utilisée sur un réseau, où les temps d'execution sont exponentiellement plus longs.

    Pour cela, je pense qu'il serait beaucoup plus efficient d'importer tous les enregistrements d'un seul coup, plutot qu'un à un ... Quel est selon vous le meilleur moyen de les stocker (4 champs) avant de les importer en une fois ... Est il possible de les ajouter dans un recordset que l'on déverse ensuite dans une table ?

    Merci d'avance pour votre aide,

    Thomas

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2010
    Messages : 47
    Points : 60
    Points
    60
    Par défaut
    Bonjour

    Proposition :
    - étape 1 : importer la feuille excel dans une table temporaire (avec un modèle d'import si nécessaire) ; ceci peut être aisément automatisé.
    - étape 2 : effectuer les différents tests en détruisant les enregistrements dans la table.
    - étape 3 : ajouter les enregistrements "corrigés" dans la table définitive.

    Avec un peu de code et quelques requêtes SQL, ceci devrait vous satisfaire car c'est rapide, facilement maîtrisable.
    Nourson

  3. #3
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    oui...
    ou bien même faire des règles de validation sur les champs de la table pour éliminer les enregistrements directement à l'import, puis copier les données de la table ainsi mise à jour dans la table de destination.
    Avec une architecture frontal-dorsal traditionnelle (frontale sur le client bien sûr...) et une table locale pour éviter les transferts réseau, ca pourrait avoir un résultat étonnant en terme de performances :p

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 56
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Merci tout d'abord pour vos suggestions.
    Le problème vient du fait que chaque ligne Excel correspond à trois enregistrements. En fait, j'ai pour chaque ligne 3 valeurs pour 3 mois, alors que dans ma base, je veux un enregistrement pour chaque mois.
    Je ne pense pas que cela soit possible de l'importer automatiquement via la fonction d'import de feuille Excel d'Access qui n'est pas très bien paramètrable.

    Je vais essayer de me pencher sur la question quand même.

    Sinon pour l'architecture frontale dorsale, c'est la solution la plus adaptée à mon cas je crois en tout cas, merci!

Discussions similaires

  1. Import Excel vers Access
    Par rabihm81 dans le forum Access
    Réponses: 1
    Dernier message: 07/05/2008, 16h00
  2. Import Excel vers Access MAJ et nouveaux enregistrements
    Par sl1980 dans le forum VBA Access
    Réponses: 8
    Dernier message: 23/01/2008, 09h02
  3. import excel vers access avec bouton "parcourir"
    Par zeloutre dans le forum Access
    Réponses: 3
    Dernier message: 04/04/2007, 19h06
  4. échec importation excel vers access
    Par emmablue dans le forum Access
    Réponses: 2
    Dernier message: 31/07/2006, 11h34
  5. Import Excel vers Access +hypertexte
    Par liop49 dans le forum Access
    Réponses: 2
    Dernier message: 24/07/2006, 14h40

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