Base de donnée access depuis feuille excel.

Base de donnée access depuis feuille excel. - VB/VBA/VBS - Programmation

Marsh Posté le 10-06-2010 à 14:55:09    

Bonjour,  
après plusieurs heures de recherche, je fais appel à une âme charitable.
Voilà le topo :
je dispose de plusieurs fiches clients sous excel avec des informations un peu éparpillées dans tous les sens et je souhaiterais créer une base de données sous access pour y voir plus clair.
Le gros problème, c'est que justement les info ne sont pas super ordonnées sous excel; je ne peux donc pas utiliser de façon brutale l'importateur de access pour fichier excel.
Je voudrais savoir s'il existe un moyen simple d'importer des cases précises excel dans un enregistrement de access. Si possible sans une programmation lourdingue ( je suis une quiche en VB) .
Merci par avance !

Reply

Marsh Posté le 10-06-2010 à 14:55:09   

Reply

Marsh Posté le 10-06-2010 à 15:00:16    

Le copier/coller fonctionne tres bien d'Excel a Access hein (pour peu qu'il y ait le meme nombre de colonne et de champ)
 
Le truc, c'est que ta question est tellement evasive, que la réponse est forcément oui, mais ca va pas t'avancer plus...
 
Faut etre explicite, exemple, screen a l'appui. Sinon on va se faire 35 messages de discussion pour comprendre ce que vraiment tu souhaites, pour finalement tomber sur un os...


Message édité par SuppotDeSaTante le 10-06-2010 à 15:00:37

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 10-06-2010 à 15:59:36    

Oui pour le copier mais 2 problèmes se posent :  
- j'ai beaucoup de feuilles excels à copier/coller  
- les données sont rangées à l'envers : les colonnes sont là où devraient être les lignes et vise-versa ( faudrait transposer )
 
Je vais détailler mon problème pour être plus explicite.
 
j'ai un fichier excel avec des infos ( type clients/ produits/ prix/ numéro divers ) qui ne sont pas bien rangées dans des colonnes ( genre A: liste des clients,  B : numero commande...) mais plutôt du style (  
A1 = Nom, B1 = Prenom,  
A2= commande 1,
A3 = Commande 2
A4 = Commande 3) et  chaque client est sur une feuille différente...
 
Je veux donc créer une table sous access avec les champs Clients, Commande et importer les cases A1 de toutes mes feuilles excels dans la colonnes "nom" de la table access, importer les cases A2 à An dans la colonnes "commande" etc.

Reply

Marsh Posté le 11-06-2010 à 11:39:23    

Re
 
Et le relationnel dans tout ca ? Le mieux c'est d'avoir deux tables liées entre elles. Une table Clients et une table Commandes.
On se créés une clé unique, moi je me suis basé sur un compteur (genre 1 pour Feuille1, 2 pour feuille2 etc) concatené avec le nom de la feuille.
Je le rajoute en C1 pour l'import du client, et dans la colonne B a partir de B2 pour les commandes.
Ca nous permettra derriere de faire le lien entre les commandes et les clients. Et ca c'est du relationnel.
 
Alors je me suis basé sur ton exemple.
 
Le fichier excel dont je me suis servi : http://dje69r.free.fr/Test.xls
La base Access qui importe : http://dje69r.free.fr/bd1.mdb
 
Tu peux regarder la "requete1" qui fait le lien entre les deux tables.
 
J'ai du faire comme je le sentais etant donné que tu ne m'as pas donné ni de screen, ni de fichier comme demandé precédemment. A toi de l'adapter.
 
 
 
Je mets le code ici si ca peut aider d'autres personnes :

Code :
  1. Sub toto()
  2. 'Definition des variables
  3. Fichier = "C:\Test.xls"
  4. TableClient = "Clients"
  5. TableCommande = "Commandes"
  6. CPteur = 0 'Initialise notre compteur pour notre clé unique basée sur le nom de la feuille
  7. 'on supprime les tables pour les essais d'import, ces lignes sont a virées si tu as plusieurs fichiers Excel a importer _
  8. ca permettra de tout mettre a la suite dans les tables
  9. 'On Error Resume Next
  10. Set Db = CurrentDb
  11. For Each Tb In Db.TableDefs
  12.     If Tb.Name = TableClient Then DoCmd.DeleteObject acTable, TableClient
  13.     If Tb.Name = TableCommande Then DoCmd.DeleteObject acTable, TableCommande
  14.    
  15. Next
  16. 'Creation de l'objet Excel
  17. Set AppExcel = CreateObject("Excel.Application" )
  18. AppExcel.Visible = True
  19. With AppExcel
  20.     .Workbooks.Open Filename:=Fichier 'On ouvre le fichier
  21.     NbFeuilles = .ActiveWorkbook.Sheets.Count 'on compte le nb de feuilles
  22.    
  23.     'pour chaque feuille
  24.     For Each Feuilles In .ActiveWorkbook.Sheets
  25.        
  26.         CPteur = CPteur + 1 'on increment notre compteur pour notre clé unique
  27.         Clé = Feuilles.Name & CPteur 'notre clé sera le nom de la feuille et le compteur
  28.        
  29.         .Sheets(Feuilles.Name).Activate
  30.         DerLigneA = .Sheets(Feuilles.Name).Rows(.Range("A1" ).CurrentRegion.Rows.Count).Row 'Determine la derniere ligne utilisée en col A
  31.         .Sheets(Feuilles.Name).Cells(1, 3).Value = Clé 'On met le nom de la clé en C1
  32.         For i = 2 To DerLigneA 'on met le nom de la clé en colonne B pour toutes les commandes
  33.             .Sheets(Feuilles.Name).Cells(i, 2).Value = Clé
  34.         Next i
  35.         .ActiveWorkbook.Save
  36.        
  37.         'on importe dans notre table les Clients
  38.         DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, TableClient, Fichier, False, Feuilles.Name & "!A1:C1"
  39.         'on importe dans notre table les Commandes
  40.         DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, TableCommande, Fichier, False, Feuilles.Name & "!A2:B" & DerLigneA
  41.        
  42.     Next
  43.     AppExcel.Quit
  44.     Set AppExcel = Nothing
  45. End With
  46. End Sub



Message édité par SuppotDeSaTante le 11-06-2010 à 11:44:07

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 11-06-2010 à 13:58:21    

Bon, tout d'abord merci pour le code détaillé, ca me permet d'en apprendre plus sur le VB.
En revanche, je ne comprend pas bien l'intérêt particulier :  
- les données au départ sont déjà rangé par champs ( A1 : toto, An : les données )
- le programme ne fait que remplir la colonne B par F1, F2 ou F3.
Bon il est fort probable que je n'ai pas compris correctement le code ( encore une fois, je débute), mais bon, je pense qu'au départ on part mal en choisissant un fichier excel organiser comme Access.  

Reply

Marsh Posté le 11-06-2010 à 14:14:38    

Non le programme ne fait pas que ca, il créé deux tables et les alimentes avec toutes les infos contenu dans toutes les feuilles du classeur Excel.
Dans la table Clients seulement les info de A1:C1 et dans la table Commandes seulement les infos de A2:Bx.
Et ce pour toutes les feuilles.
 
L'interet de mettre F1, F2 et F3 c'est que derriere tu vas pouvoir lier les commandes a tes clients par l'intermediaire de cette clé. Comme le montre la Requete1 dans la base.
Comme on importe dans deux tables, il faut bien avoir un pointeur a un moment pour dire que tel client a telles commandes.
 
Tout est deja decrit dans mon précédent post.


Message édité par SuppotDeSaTante le 11-06-2010 à 14:17:04

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 15-06-2010 à 17:12:59    

Ok, ça marche !
Mais quand je veux sauvegarder il y a un problème.
Souvent, excel reste actif ( pas visible sur le bureau mais dans le gestionnaire oui) : est-ce normal ?
Et aussi, quand j'enregistre, je perd des données ! Voici ma procédure de fermeture.  
 
 
'Fermeture
                                                                         
                                                                           xlBook.Close
                                                                           xlApp.Quit
                                                                           ' désallocation mémoire
                                                                           Set xlSheet = Nothing
                                                                           Set xlBook = Nothing
                                                                           Set xlApp = Nothing

Reply

Marsh Posté le 15-06-2010 à 18:32:41    

Bon, j'ai résolu le problème de la perte de fichier ( erreur bête), mais j'aimerais bien que quelqu'un me dise si c'est normal qu'avoir un résidu d'excel et si mon processus de fermeture est correct ^^

Reply

Marsh Posté le 18-06-2010 à 14:16:16    

Bon, j'ai finalement réussi à résoudre mon problème :  
Il fallait sortir de la boucle les instructions :
Set xlApp = CreateObject("Excel.Application" )
Set xlApp = Nothing
voilà, merci pour ton aide dje69r.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed