Importation d'un fichier

Résolu/Fermé
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015 - 30 avril 2013 à 15:49
 Tessel75 - 6 mai 2013 à 22:11
Bonjour à tous !

J'aimerais l'avis de personnes plus expérimentées que moi pour une mission que je dois réaliser. Je suis stagiaire dans une entreprise et il m'est demandé de crée un programme Access permettant à partir d'un fichier Excel d'importer les données et de les placer dans les bonnes tables, le soucis c'est que les noms des champs sont présents mais ne sont pas identiques (Fichiers achetés) Par exemple dans la base le nom d'un contact est dans un champ apellé "nom" alors que dans un fichier Excel il pourra s'apeller "First Name".
Je dois donc réaliser un formulaire permettant à un utilisateur de choisir quel champ correspond à quel champ (L'utilisateur sélectionne d'un côté le nom du champ dans la base, de l'autre le nom du champ sur Excel et valide pour que les données du champ "First Name" soit associées au champ "Nom"
Je ne sais pas trop quel est le meilleur moyen de réaliser cette tâche, j'ai pensé à mettre deux zones de liste (l'une contenant les noms des champs dans la base, l'autre celle des noms des champs dans Excel : Après importation sur Access évidemment) et à renommer dans la table importée les champs par ceux choisis pas l'utilisateur.
Je vois plusieurs inconvénients à cette méthode mais le principal est qu'après avoir renommé un champ il reste dans la zone de liste et j'aurais aimé qu'il en sorte.
Pensez-vous que ma solution est convenable ou une autre serait meilleur?

Je ne demande pas à ce qu'on me fasse le travail juste qu'on m'aiguille car actuellement je galère à mettre en place cette méthode (Pas moyen de renommer le champ) et je me demande si ce que je fais n'est pas trop compliqué pour ce que c'est.

D'avance merci de votre aide.
Cordialement,
Uryon.


A voir également:

17 réponses

blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
30 avril 2013 à 16:34
Salut,

si la correspondance est toujours la même, tu peux créer un format d'importation et t'en servir.

si la correspondance est variable, le mieux est encore de prendre les données excel, de les mettre dans une table temporaire sous access et de ventiler ensuite en fonction des besoins.
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
Modifié par Uryon le 30/04/2013 à 16:46
J'ai enfin trouvé la solution simple que je cherche depuis deux jours, donner les noms A L'IMPORTATION

Je vais être élu boulet du mois un de ces jours....
Merci à toi quand même blux (encore)
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
30 avril 2013 à 16:45
Un parcours des champs de la table "exce"l pour générer une liste (non déroulante), un parcours de la table access pour générer une liste (non déroulante). Un formulaire qui présente ces deux listes, un bouton qui va regarder lesquelles sont choisies, qui fait l'import et qui remet à jour les deux listes...

Je te fais le code pour parcourir la collection fields de la collection tabledefs et je reposte ASAP.
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
Modifié par Uryon le 30/04/2013 à 16:51
Ah si tu as la solution je la veux toujours ça m'arrangerais :)
J'ai essayé de faire la solution que tu me donnes malheuresement les tabledefs, les fields etc... ne me sont pas très familiers pour le moment. Très sympa de ta part de m'aider autant merci !
En fait mon problème principal c'est que comme cette action s'effectue champ par champ et qu'il faut que chaque ligne soit la même qu'à la base, il faut faire une requête comprenant l'ID de la ligne dans la clause WHERE et la mienne ne fonctionnait pas.
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
30 avril 2013 à 17:10
Dim Tbl As dao.TableDef
Dim Champ As dao.Field
For Each Tbl In CurrentDb.TableDefs
    MsgBox Tbl.Name
    For Each Champ In Tbl.Fields
        MsgBox Champ.Name
    Next
Next


Ce code parcours TOUTES les tables de la base (y compris les tables système), affiche leur nom et pour chaque table parcours la liste des champs en affichant leur nom.

Ensuite, tu peux parfaitement l'adapter pour ne sélectionner qu'une table en particulier (avec une correspondance sur un nom) et t'en servir pour créer une chaine qui sera en rowsource d'une zone de liste.
0
Bonjour Uryon, Bonjour Blux,
Pour pratiquer ce sport (l'importation depuis Excel avec des noms de champs distincts) depuis longtemps et fréquemment, il me parait que le plus simple est de changer le nom de tes champs AVANT l'importation et non pas après.
A l'importation, Access reconnait les entêtes de colonnes Excel comme des noms de champs, il est donc bien plus facile de changer ces dernières dans Excel pour importer en toute tranquillité. De plus sauf tes entêtes changes tout le temps, tu peux très bien élaborer une macro Excel qui balaie tes entêtes et les remplace par les noms convenus pour être intégré immédiatement par Access au moment de l'importation.
(Je le fais plusieurs fois chaque mois pour les stats de mon service et je n'ai aucun souci. ... Click Icône Macro "ConfigurerTableauExcel" puis Click Bouton "Importer" dans Access.)
L'automatisation ne vaut évidemment que si les entêtes sont toujours les mêmes, mais sinon tu peux envisager une méthode, toujours dans Excel, pour changer le nom de tes entêtes de colonnes. A voir.
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
3 mai 2013 à 10:51
Bonjour Tessel,

après avoir essayé de faire avec l'autre méthode puis essayé de trouver des tutos pour faire avec la tienne je reviens vers toi, je n'ai pas l'habitude d'utiliser le VBA sous Excel et je ne sais pas trop comment faire, j'ai bien trouvé un tuto mais il y a 226 pages et je ne trouve pas ce que je veux...

Cordialement,
Uryon.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
3 mai 2013 à 12:10
Je viens de me rendre compte qu'au final je n'ai pas posé de question.
Mon problème est que je ne sais pas comment faire pour utiliser les données sous Excel sans les importer sous Access, je ne sais ni commenter les récupérer ni comment les modifier, j'ai juste trouvé comment parcourir les lignes mais c'est dans Excel seulement....
0
Bonjour,
Je n'ai jamais dit qu'il ne fallait pas importer les données depuis Excel, bien au contraire, j'ai dit qu'il fallait configurer les données sur Excel avant leur importation.
Donc la question que je pose est de savoir si l'importation est périodique ou ponctuelle.
Sinon, la différence entre la méthode que te propose Blux, et celle que je te propose, est que son code passe en revue le nom des champs des tables importées pour les changer grâce à une boite de dialogue, alors que je préconise plutôt d'examiner et modifier si besoin les entêtes de colonnes dans Excel avant toute manoeuvre d'importation et seulement après de procéder à l'importation.
la question est alors de savoir si cette opération peut être faite à la main ou bien automatiquement si cela doit être fait régulièrement.
A te lire.
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
3 mai 2013 à 13:53
J'avais bien compris votre méthode je me suis simplement mal exprimé.
En fait, l'entreprise pour laquelle je fais le module achète régulièrement des fichiers venant d'autre entreprises, certains champs auront donc des noms différents, existeront ou non... C'est pourquoi je dois réaliser un module permettant à l'utilisateur de choisir quel champ doit être attribué à quel champ de quelle table Access.
Je devrais donc crée deux zones de liste, une regroupant une liste des champs de la table l'autre regroupant les champs d'Excel (donc chaque case de la première ligne du fichier Excel correspondrait à un champ dans la zone de liste).
A chaque nouveau fichier les champs seront différents c'est pourquoi il faudrait que les champs soient choisis à chaque fois. Mon tuteur souhaite que je fasse ce module pour lui faciliter la tâche (actuellement il le fait à la main)
0
Re-...
Tu avais écrit:" le soucis c'est que les noms des champs sont présents mais ne sont pas identiques (Fichiers achetés)".

Alors je maintiens qu'il est beaucoup plus simple et facile de changer ces noms AVANT qu'après. Il suffit de décider les noms des champs qui serviront pour l'import et de les reproduire à chaque fois. Si les fichiers sont achetés et que les noms ne sont pas toujours les mêmes il faut se demander si l'écriture d'une macro dans Excel est malgré tout envisageable. Mais dans tous les cas, les utilisateurs sont généralement plus à même de modifier le nom des entêtes que celui des champs.

Lorsque je procède à mes importations régulièrement, je fais comme ceci:
1) Macro Excel Modifier les noms des Entêtes pour qu'elles soient uniformes et attribution d'un nom prédéfini (toujours le même) à la feuille
2) Importation de la Feuille Excel dans une nouvelle table Access. (La table prend le nom de la feuille, les champs prennent le nom des entêtes)
3) Requête Ajout de la table importée dans la table définitive
4) Boite de dialogue "Voulez-vous importer une nouvelle table?" et retour à l'étape 2 ou sortie.
les étapes 2 à 4 peuvent être automatisées sans difficulté.

Pour cela, il faut que tu saches que la requête Ajout donne automatiquement le nom du champ récepteur si ce nom est identique à celui de la table d'origine, l'ordre des champs de gauche à droite n'a aucune importance. C'est pour ça que j'insiste sur le fait qu'il est nécessaire de changer le nom des entêtes avant importation et non pas après.
Pour changer les noms des entêtes sur Excel, je te mets un exemple de début de code.
Sub RenommerEnTeteColonnes()  
On Error GoTo Sortie  
    l = ActiveCell.Row  'Détermine la ligne  
    c = ActiveCell.Column  'Détermine la colone  
    cell = ActiveCell.Value  'Détermine la valeur de la cellule  

Do Until IsNull(cell) Or IsEmpty(cell) Or cell = ""  'Parcourt le tableau jusqu'à ce qu'il rencontre une cellule vide  
    If cell = "Compte établissement" Or cell = "Compte" Or cell = "CPT. ETAB." Then  
        Cells(l, c) = "CompteEtabt" 'Modifie le nom de l'entête  
        Cells(l, c).EntireColumn.NumberFormat = "@"  'Modifie le format de la colone correspondante  

    ElseIf cell = "Code produit" Then  
        Cells(l, c) = "CodeProduit"  'Modifie le nom de l'entête          
    ElseIf cell = "Réf. com." Then  
        Cells(l, c) = "RefCom"  'Modifie le nom de l'entête   
    ElseIf cell = "Libellé référence commerciale" Then  
        Cells(l, c) = "LibelleRefCom" 'Modifie le nom de l'entête   
...  
...  
End If          
        c = c + 1    
        cell = Cells(l, c)  
    Loop  ' Passe à la colonne suivante  
ActiveSheet.Name = "MonNomDeMaFeuille"  
End Sub 


Je peux te donner les explications dont tu auras besoin.
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
3 mai 2013 à 14:59
J'ai bien compris Tessel, modifier les noms avant l'importation c'est justement ça que je n'ai pas trouvé comment faire (sur access j'ai trouvé) il me manquait le bout de code permettant de les modifier.

Activecell je suppose que c'est la cellule active ?
Ce qu'il me faudrait c'est un code qui parcourt toute les colonnes de la première lignes, les récupère pour les mettre dans une zone de liste sur Access et qui à chaque fois qu'on appuie sur un bouton sur access, remplace celui sélectionné dans la zone de liste par un autre de mon choix
Par exemple la première colonne de la première ligne s'apelle "Year", je sélectionne dans ma zone de liste "Year" dans une seconde zone de liste contenant les noms des champs de ma table "Année" et ça remplacerait dans Excel "Year" par "Année", ensuite j'importerais et je répartirai où je le souhaite.
0
"Activecell" est bien CelluleActive.
Mais je ne comprends vraiment pas pourquoi tu tiens tant à récupérer les noms dans Access puisque c'est toi qui les imposes à Access. Une fois que les noms de tes champs ont été attribués dans Access, tu n'en changes plus, ce sera tjrs les mêmes.
Je t'ai envoyé un morceau de code que j'ai utilisé par le passé, il te dit:
"Si NomCellule ="Tatata" ou "Tititi" alors NomCellule ="TTT"
__ suivant
Si NomCellule = ...
"

Càd que tu entres tes noms d'entêtes dans ton code et tu ne t'en occupes plus, ils sont fixés définitivement.
Ou bien qqch m'échappe.
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
3 mai 2013 à 15:17
Reprenons mon exemple de tout à l'heure avec "Year", j'avais dit qu'il était en position 1, le problème c'est qu'il peut très bien être aussi en position 2 3 4 5 6 7 8 9.... Je ne sais pas où il est et donc je ne peux pas dire "Colonne1=Annee ...."
0
j'avais écrit:
" il faut que tu saches que la requête Ajout donne automatiquement le nom du champ récepteur si ce nom est identique à celui de la table d'origine, l'ordre des champs de gauche à droite n'a aucune importance. C'est pour ça que j'insiste sur le fait qu'il est nécessaire de changer le nom des entêtes avant importation et non pas après. "
Et de même pour changer le nom des entêtes, la modification se fait d'après le nom initial et non pas son ordre, col1, col2, etc.
La seule chose qui importe alors est de savoir si l'origine des fichiers est très variée avec une foultitude de noms d'entête ou bien si ce sont toujours les mêmes qui reviennent.
Sinon je viens d'avoir une idée qui d'avoir une liste de choix préétablie avec boite de dialogue directement dans Excel, ce qui faait que les noms des entêtes peuvent être sélectionner depuis Excel. Mais ça je ne sais pas faire; il faut demander sur CCM.Excel.
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
3 mai 2013 à 15:35
"La seule chose qui importe alors est de savoir si l'origine des fichiers est très variée avec une foultitude de noms d'entête ou bien si ce sont toujours les mêmes qui reviennent. " c'est bien ça, chaque achat se fait avec une entreprise différente donc des fois on aura des noms en anglais, des fois en français mais apellé autrement etc....

Vous ne pensez pas cela possible de récupérer ces champs (dans une table par exemple), de les mettre dans une zone de liste de faire cette requête qui remplacerait le nom si il est égal à celui de la zone de liste dans Excel ?
0
Là du coup je ne sais pas répondre.
Par contre ce qui est très facile c'est d'avoir une sorte de table Type sur Excel, avec les noms des champs qui devront être attribués comme nom d'entête et de construire une boite de dialogue à partir de cette tableType pour être certain que les entêtes reprennent exactement le nom des champs de la table définitive de Access.
Mais je connais bcp moins bien les capacités de Excel.
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
3 mai 2013 à 15:50
C'est bien mon problème à moi aussi :(
Donc ce que vous me conseilleriez ça serait de faire une table sur Excel où je devrais mettre le nom des champs Access et en dessous la personne mettrai le nom du champ tel qu'il est dans Excel ?
0
blux Messages postés 26001 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
3 mai 2013 à 15:56
Regarde plutôt du côté de ce que j'ai proposé...
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
3 mai 2013 à 15:58
Je vais faire mon possible avec votre code blux, merci à vous :)
0
Non pas du tout.
Je verrais 2 possibilités
Soit un petit fichier Excel qui sert fichier de support pour les noms à garder en réserve avec une petite macro et un formulaire
Soit le même type de fichier Excel ou les utilisateurs iraient piocher les noms voulus par Copier/Coller. Au besoin ils décaleraient la 1ère ou 2ème ligne vers le bas le temps de la manip' en copiant/collant toute la ligne pour faciliter le choix et l'attribution des noms, et puis suppression de la ligne inutile
0
Uryon Messages postés 73 Date d'inscription lundi 29 avril 2013 Statut Membre Dernière intervention 21 janvier 2015
6 mai 2013 à 16:02
Merci à vous pour votre aide, j'ai enfin réussi avec la méthode de blux !

A bientôt et encore merci.

Cordialement,
Uryon.
0
L'essentiel est que ça marche et que tu t'en sortes.
Bonne suite.
0