|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Bonjour a tous,
Je vais vous exposer mon petit problème en bref : Je dois trouver un programme VBA Access qui analyse, dans un dossier général, des sous-dossiers en les identifiants par leur nom et ensuite analyse leur contenu. Dans chaque sous-dossier, il y a deux types de fichiers excel qui ont chacun une structure particulière. (type NAV et type Fonds où tous les fichiers excel NAV ont la mm structure et tous les fichiers Fonds aussi) Si le fichier excel comporte le nom NAV : en extraire les données dans une table d'une base de données Access, en évitant les doublons. Si le fichiers excel comporte le mot Fonds : en extraire les données dans une autre table de la même base de données, tout en évitant également les doublons. En fait je ne demande pas de me faire tout ça, je cherche juste un moyen d'extraire des données de plusieurs fichiers excel vers Access (a partir de VBA Access) vers une base de données déja existante (c'est a dire a la suite des données de la base de données). Et si possible en évitant les doublons. Je pensais faire une boucle avec la fonction TransferSpreadsheet, mais j'ai aucune idée de comment le faire ^^. Quelqu'un pourrait-il m'aider? |
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() Pierre GONZALEZDéveloppeur Office VBA Inscription : août 2005 Messages : 3 412 ![]() |
Bonjour.
Perso, je n'utiliserais pas de commande d'importation. Deux solutions de principe : 1. Rst sur claseur fermé. Si tes classeurs contiennent des données disposées proprement en tableaux, tu peux ouvrir un jeu d'enregistrement ADO ou DAO sur chaque classeur XL qui peut rester fermer. La manipulation du jeu d'enregistrement te permettra de renseigner les tables. 2. Variable tableau avec classeur ouvert. Si tes données sont un peu dispersées, tu ne couperas pas à l'ouverture de chaque classeur. Tu peux utiliser des variables tableaux à 2 dimensions pour charger des zones de données. La manipulation des variables tableaux te permettra de renseigner les tables. Cordialement, PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon |
|
|
00
|
|
|
#3 |
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Ok, donc je pencherais plutôt vers la 1ère solution, les classeurs excel sont bien rangés par colonnes, chaque classeur ayant les mm colonnes (sauf pour les deux types différents bien sûr).
Il faudrait effectivement que je puisse extraire toutes les données en laissant les classeurs fermés. Il faudrait alors que je fasse une boucle sur le nom du classeur(NAV ou Fond), en fonction de cela, les données seront placées dans l'une des deux tables Access. (en évitant les doublons dans les 2 cas) Ensuite entourer ça d'une boucle qui "boucle" sur les sous-dossiers. Dites-moi si vous voyez quelque chose qui n'irait pas dans mon raisonnement. Maintenant je dois donc essayer de comprendre comment fonctionne les plateformes DAO ou ADO ^^. Ou bien y aurait-il une solution générale existante que je n'aurais pas encore vue sur le net(avec ADO ou DAO bien sûr)? (j'ai déjà fait le tour des forums pour trouver un "simple" programme VBA Access qui extrait un ensemble de données de plusieurs fichiers Excel vers Access, pas moyen d'en trouver un correct...) Quelqu'un aurait-il déjà du code pour extraire un fichier? (ou plusieurs) |
|
|
00
|
|
|
#4 |
|
Expert Confirmé Sénior
![]() Pierre GONZALEZDéveloppeur Office VBA Inscription : août 2005 Messages : 3 412 ![]() |
Re,
Sur DVP il y a beaucoup de ressources. Regarde le tuto de SilkyRoad Lire et écrire dans des classeurs fermés Reviens quand tu auras commencé ton code et si tu rencontres des pb. Cordialement, PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon |
|
|
00
|
|
|
#5 | ||||
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Bonjour,
J'ai commencé a taper du code pour utiliser ADO mais là je reste bloqué, je ne sais pas comment prendre des données excel et les mettre dans access... Code :
Sinon j'avais trouvé une autre sorte de code pour extraire des données, mais là encore je suis bloqué car je n'arrive pas à sélectionner la colonne entière au lieu des cellules : Code :
|
||||
|
|
00
|
|
|
#6 | ||
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Sinon j'ai trouvé cette procédure, mais je n'arrive pas à la faire tourner...
Elle est censer faire ça : boucle sur tous les classeurs d'un répertoire sans les ouvrir et transfert les données de la Feuil1 vers une table Access (Table1). L'exemple suppose que Tous les onglets portent le même nom. Les classeurs sont structurés comme une vraie base (pas de données éparpillées) et de structure identique à la base Access (nombre de colonne et type de données adaptés:date,texte,numerique...etc...) la procédure nécessite d'activer la référence Microsoft ActiveX Data Objects x.x Library Code :
|
||
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() Pierre GONZALEZDéveloppeur Office VBA Inscription : août 2005 Messages : 3 412 ![]() |
Bonjour.
Dans ta première prcédure ADO tu as un jeu d'enregistrement Rst qui contient les données du classeur XL fermé. Il te reste à ouvrir un autre jeu d'enregistrement sur la table Access pour y ajouter les données de Rst. Ce que tu fais dans le dernier code que tu montres. EN plus ce nouveau code balaie tous les classeurs d'un répertoire. Ce code semble correct. Quel est le problème que tu rencontres? Cordialement, PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon |
|
|
00
|
|
|
#8 | ||
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Je te donne le code modifié avec mes données :
Code :
Je met en fait ce programme dans un module sous access avec les références : Microsoft ActiveX Data Objects.6.0 Library Microsoft ADO Ext.6.0 for DDL and Security J'ai déja essayé en enlevant la 2ème référence que je t'ai donné mais ça me fait la même erreur qui est : run-time error '-2147467259(80004005)' : 'C:\users\myname\documents\libraries\documents\database2.accdb' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides. En fait, ce code est dans un module de ma base access que je voudrais enrichir avec les fichiers excel. J'ai déja une table avec les mm noms que les colonnes de mes fichiers excel.(ici tout est dans database2, le code et la table) Je viens d'essayer autre chose, j'ai remplacé : 'Libraries\Documents\Database2.mdb' Par : 'C:\Users\myname\Desktop\Database2.accdb' Et cela me donne cette erreur : run-time error '-2147467259(80004005)' : The database has been placed in a state by user 'Admin' on machine 'LUACGL8781' that prevents it from being opened or locked. Voila, je ne sais vraiment pas a quoi cela correspond...Merci d'avance pour ton aide ! |
||
|
|
00
|
|
|
#9 | ||
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Bon j'ai plus les même messages d'erreur qui apparaissent, j'ai maintenant :
Run-time error '-2147467259(80004005)': Unrecognized database format 'C:\Users\qdeutschle\Desktop\ExtractADO.accdb' Code :
|
||
|
|
00
|
|
|
#10 | ||
|
Expert Confirmé Sénior
![]() Pierre GONZALEZDéveloppeur Office VBA Inscription : août 2005 Messages : 3 412 ![]() |
Bonjour.
Si ton code est dans la BD, tu remplaces Code :
Cordialement, PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon |
||
|
|
10
|
|
|
#11 |
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Super merci beaucoup !
Le programme fonctionne très bien ^^ ! Bon je vais maintenant tenter de faire mes gestions d'erreur et mes boucles sur les folder et éviter les doublons seul ^^ (sauf bien sûr si vous avez quelques conseils à me donner) Encore merci pour votre aide, Cordialement, Nitromard |
|
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() Pierre GONZALEZDéveloppeur Office VBA Inscription : août 2005 Messages : 3 412 ![]() |
Bonsoir.
Il faudrait savoir comment tu définis les doublons, c'est-à-dire quels champs ont des valeurs identiques : 1, 2, n, tous? Après ce n'est pas trop difficile. Cordialement, PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon |
|
|
00
|
|
|
#13 |
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Bonjour,
Donc je n'ai pas de clé primaire dans ma table, pour l'instant ce n'est pas dans mon objectif de créer une clé primaire, donc les doublons ne sont pas supprimés automatiquement. Ensuite j'ai ma 1ère colonne date qui est identique 642 fois(et il faudrai que je la garde pour plus tard car j'aurais des dates différentes mais qui se répèteront aussi bcp de fois), ensuite une colonne code service avec 3 ou 4 différents codes. Une colonne sécurity name qui peut être répétée plusieurs fois. Ensuite une quantité qui est souvent différente mais qui peut aussi se répéter. Une date de maturité qui n'existe pas toujours. Un code pays qui se répète aussi. Une valeur marchée qui change souvent mais qui peut aussi être identique. Un strike souvent nul. Et enfin deux dernière colonne qui peuvent se répéter aussi. En gros, toute mes colonnes se répètent ou sont susceptibles de se répéter, mais je pense que chaque ligne est indépendante. Donc le mieux serait soit de comparer une ligne a toute les autres pour voir si elle se répète, ou bien de faire une clé primaire... Je pencherais du coup pour la clé primaire : plus rapide et consomme moins de temps j'imagine. Qu'en pensez-vous? Cordialement, Nitromard |
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() Pierre GONZALEZDéveloppeur Office VBA Inscription : août 2005 Messages : 3 412 ![]() |
Bonjour.
DOnc pour toi 2 enregistrements constituent 1 doublon si tous leurs champs contiennent des valeurs identiques? Autrement dit, 2 enregistrements qui contiennent des valeurs diffrentes dans 1 champ ne sont pas des doublons? PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon |
|
|
00
|
|
|
#15 |
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Oui c'est exactement ça.
En fait j'ai fait quelques tests : -Si j'ai une clé primaire : le programme s'arrête lorsqu'il trouve un doublon et il ne prends pas les données qui viennent ensuite. -Si je n'ai pas de clé primaire : le programme prend toutes les données mm les doublons (comme définis à mon sens). Et donc je veux éviter ces doublons ou bien faire une clé pour chaque ligne. Mais cela comporte un risque de faire une clé, en fait comme c'est le client qui envoi les données et que je crée une clé pour chaque ligne, si lui a commis une erreur et a recopier 2 fois la mm ligne alors si je ne le vois pas j'aurais un doublon a proprement dit mais qui aura une clé différente de son jumeau... |
|
|
00
|
|
|
#16 | ||
|
Expert Confirmé Sénior
![]() Pierre GONZALEZDéveloppeur Office VBA Inscription : août 2005 Messages : 3 412 ![]() |
Bonjour.
Avant d'ajouter un enregistrement à la table, tu dois t'assurer que ce n'est pas un doublon, c'est-à-dire que le n-uples des nouvelles valeurs n'est pas déjà en table. Pour cela, il suffirait de faire une Find sur le jeu d'enregistrements de la table. Le problème c'est que le recordset ADO n'accepte pas les recherches multicritères. Une solution serait donc d'ouvrir plutôt une jeu d'enregistrements ADO qui lui permet ces recherches. (He oui, DAO a aussi des vertus!) Une autre solution est d'utiliser la méthode Filter du jeu d'enregistrements ADO. Cette solution donnerait Code :
Cordialement, PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon |
||
|
|
00
|
|
|
#17 |
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Donc si je comprends bien, je dois construire une chaîne sCritere en fonction de chacune de mes colonnes, du coup il me lira les fichiers excel à travers ce filtre?
|
|
|
00
|
|
|
#18 |
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Donc ça c'est la solution (si elle fonctionne ^^) au problème de la talbe sans clé primaire.
Je pense que je serais quand même confronté au problème des tables avec clé primaire. Quelle serait la démarche pour éviter que le programme ne se bloque sur chaque doublon? (j'imagine qu'il doit y avoir une commande ou une fonction qui permet ça?) |
|
|
00
|
|
|
#19 | ||
|
Membre actif
![]() Quentin D.Étudiant Inscription : avril 2011 Messages : 175 ![]() |
Bon voila ce que j'ai tapé du coup mais j'ai une erreur :
Code :
Invalid Use of property. Il me met le .Filter en surbriance... |
||
|
|
00
|
|
|
#20 |
|
Expert Confirmé Sénior
![]() Pierre GONZALEZDéveloppeur Office VBA Inscription : août 2005 Messages : 3 412 ![]() |
Re,
Au temps pour moi, c'est :Je n'ai pas regardé le reste. Si tu as encore une erreur, fait un PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon |
|
|
10
|
Copyright © 2000-2012 - www.developpez.com