Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/04/2011, 14h39   #1
Futur Membre du Club
 
Thomas M
Inscription : février 2011
Messages : 38
Détails du profil
Informations personnelles :
Nom : Thomas M

Informations forums :
Inscription : février 2011
Messages : 38
Points : 19
Points : 19
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 :
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
thomas.m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 08h50   #2
Membre du Club
 
Inscription : mai 2010
Messages : 36
Détails du profil
Informations personnelles :
Âge : 61
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2010
Messages : 36
Points : 45
Points : 45
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
Nourson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2011, 23h42   #3
Rédacteur

 
Avatar de Maxence HUBICHE
 
Homme Maxence HUBICHE
Formateur et Développeur - Conseil en Informatique
Inscription : juin 2002
Messages : 3 687
Détails du profil
Informations personnelles :
Nom : Homme Maxence HUBICHE
Âge : 42
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Formateur et Développeur - Conseil en Informatique

Informations forums :
Inscription : juin 2002
Messages : 3 687
Points : 6 516
Points : 6 516
Envoyer un message via MSN à Maxence HUBICHE Envoyer un message via Skype™ à Maxence HUBICHE
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
__________________
1formaxion, une formation de qualité, des formateurs compétents
Mes tutoriels et vidéos :
Tableaux croisés dynamiques, Access les Bases, et les autres !
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 11h03   #4
Futur Membre du Club
 
Thomas M
Inscription : février 2011
Messages : 38
Détails du profil
Informations personnelles :
Nom : Thomas M

Informations forums :
Inscription : février 2011
Messages : 38
Points : 19
Points : 19
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!
thomas.m est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h30.


 
 
 
 
Partenaires

Hébergement Web