Connextion VBA Acces excel

Résolu
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009 - 8 juil. 2008 à 21:30
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 - 9 juil. 2008 à 10:00
Bonjour,
j'ai une application acces où je centralise toutes les données que j'ai dans un fichier excel (plusieurs onglet).
je veux automatiser l'importation de ces fichiers à partir d'acces "sans l'intervention de l'utilisateur"
le contrainte que j'ai est que le fichier excel que j'ai garde toujour la meme strecture mais pas toujour la même nomination des champs et des onglets (des fois y'a un S en plus, des fois y'a un - au lieu de _...)
donc je peux pas faire une importation avec l'aide des macros puis que j'aurai des message d'erreurs champs inconnue, fuille inexistante...


pour cela, je veux creer un code vba qui filtre les champs et le nom des onglets (feuilles) puis il stock les donnnées dans un tableau virtuel puis il les rajoute dans la table concerné.


j'ai essayé ce permier code :
    Dim i, j, k As Long
   
    Dim xlApp As Excel.Application
    Dim xlSheet As Excel.Worksheet
    Dim xlBook As Excel.Workbook


   
    'Tranche Colis
    'Code Région
    'N° Commande
    'Qté Validé"
    'Date sortie de stock
    'Code Destinataire Préparation
    'Code Destinataire Expédition
    'Code article
    Dim spx_exp(), bdx_rec, spx_rec, n_serie, control_1, control_2 As Variant
    Dim bdx_exp_Tranche_Colis(65000) As Variant
    Dim bdx_exp_Code_Région(65000) As Variant
    Dim bdx_exp_N_Commande(65000) As Variant
    Dim bdx_exp_Qté_Validé(65000) As Variant
    Dim bdx_exp_Date_sortie_de_stock(65000) As Variant
    Dim bdx_exp_Code_Destinataire_Expédition(65000) As Variant
    Dim bdx_exp_Code_article(65000) As Variant
   
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open("C:\Documents and Settings\adil\Desktop\BouygTel\Copie de DETAIL FACTURATION PRESTATION AVRIL 2008.xls")
    'xlApp.Sheets("BDX_EXP_DETAIL").Select
    'xlSheet = xlBook.Sheets("BDX_EXP_DETAIL").Select
    xlSheet.Name = "BDX_EXP_DETAIL"


       i = 2
       Do While xlSheet.Cells(i, 1) <> ""
        bdx_exp_Tranche_Colis(i) = xlSheet.Cells(i, 1)
        bdx_exp_Code_Région(i) = xlSheet.Cells(i, 2)
        bdx_exp_N_Commande(i) = xlSheet.Cells(i, 3)
        bdx_exp_Qté_Validé(i) = xlSheet.Cells(i, 4)
        bdx_exp_Date_sortie_de_stock(i) = xlSheet.Cells(i, 5)
        bdx_exp_Code_Destinataire_Expédition(i) = xlSheet.Cells(i, 6)
        bdx_exp_Code_article(i) = xlSheet.Cells(i, 7)
       
        i = i + 1
        Loop
mais j'ai une erreur dans la ligne "    xlSheet.Name = "BDX_EXP_DETAIL"" me dit; variable obget ou variable with non définie.


je vourai savoir d'abord est ce qu'il existe un moyen plus facile pour se connecter et recuper des données d'excel à partir d'acces??


pour quoi le scribte que j'ai developpé beug?
Merci pour votre aide

Un problème = des solutions
programation .....

3 réponses

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
8 juil. 2008 à 23:43
Waooou !

Salut,

deja supprime la ligne qui te pose probleme elle ne sert a rien, d'ailleur elle fait reference a une variable(xlsheet) sans assignement prealable !
Supprime aussi la ligne : 'xlApp.Sheets("BDX_EXP_DETAIL").Select
De plus je vois une quote en debut de la ligne : '
xlSheet = xlBook.Sheets("BDX_EXP_DETAIL").Select
Ce que je comprend c'est que cela ne marche pas donc tu as mis cette ligne en commentaire. C'est normale que cette lgne ne marche pas ! xlsheet est une variable objet. Quand on veut assigner un objet a une variable objet, cette derniere doit etre precedee de Set. Enfin on ne selectionne pas un objet au moment de son assignement.Donc :

Set xlSheet = xlBook.Sheets("BDX_EXP_DETAIL")

Comme la selection d'une feuille ne sert pas a grand chose non plus, la partie suivante se suffit a elle meme

       i = 2
       Do While xlSheet.Cells(i, 1) <> ""
        bdx_exp_Tranche_Colis(i) = xlSheet.Cells(i, 1)
        bdx_exp_Code_Région(i) = xlSheet.Cells(i, 2)
        bdx_exp_N_Commande(i) = xlSheet.Cells(i, 3)
        bdx_exp_Qté_Validé(i) = xlSheet.Cells(i, 4)
        bdx_exp_Date_sortie_de_stock(i) = xlSheet.Cells(i, 5)
        bdx_exp_Code_Destinataire_Expédition(i) = xlSheet.Cells(i, 6)
        bdx_exp_Code_article(i) = xlSheet.Cells(i, 7)
       
        i = i + 1
        Loop

En suite tu dis avoir des problemes sur la syntaxe des noms de fichier et les noms de feuilles et tu ecris tout en dure dans le code ?!?
Une feuille excel cela peut s'utiliser a partir de son nom certe, mais aussi a partir de son numero d'item, sa position autrement dit. Tu dis que la structure de tes fichier xls est toujours la meme donc je suppose que la position des feuilles aussi. Voici un exemple :
Set xlSheet xlBook.Sheets.item(1) ou bien : Set xlSheet xlBook.Sheets(1)

Enfin le "Waooou"du debut etait pour tes variables tableaux declarées en variant et en fixe a 65000 lignes ! tu as de la memoire a revendre sur ton PC ?
Cela m'etonnerai beaucoup que toute les feuilles de tout tes fichiers soient remplies de la premiere a la derniere ligne. Donc apprend a declare tes variables tableaux en dynamique en fonction du nombre de donnés dans tes feuilles.Regarde du coté de la fonction Redim.

je connais pas le contenu de tes cellules mais aux vues des noms de variable je peux imaginer quelque chose comme ça :

Dim bdx_exp_Tranche_Colis() As String
    Dim bdx_exp_Code_Région() As Integer
    Dim bdx_exp_N_Commande() As Integer <--- si il n'y a que des chiffres sinon en string
    Dim bdx_exp_Qté_Validé() As Integer
    Dim bdx_exp_Date_sortie_de_stock() As Date
    Dim bdx_exp_Code_Destinataire_Expédition() As Integer <--- si il n'y a que des chiffres sinon en string
    Dim bdx_exp_Code_article() As Integer <--- si il n'y a que des chiffres sinon en string

Note aussi que sur cette ligne : Dim spx_exp(), bdx_rec, spx_rec, n_serie, control_1, control_2 As Variant, seul la derniere variable est reelement decarée en variant !

Voila une longue liste de remarque mais que cela ne te decourage pas

Pour le reste je ne suis pas un specialiste des bases de donnés mais il y a effectivement une autre façon de faire qui ne demande pas l'ouverture des fichiers excel. Vois du coté des commande ADO. Maintenant a savoir si c'est plus rapide ? seul les specialiste te repondraient oui

A+
3
zen69 Messages postés 584 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 29 avril 2010 1
8 juil. 2008 à 23:05
Pour importer des données dans Excel avec vb le plus facile c'est de
1. récupérer les données avec ADO
2. Les copiers dans ton fichier excel avec la commande :
  xlApp.Range("A1").CopyFromRecordset [tonRecordSet ADO]

<hr size="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]
0
Molenn Messages postés 797 Date d'inscription mardi 7 juin 2005 Statut Membre Dernière intervention 23 février 2011 7
9 juil. 2008 à 10:00
Si ton fichier Excel a toujours la même structure, tu peux peut être faire plus simple, amis là, c'est à voir en fonction de tes besoins : dans ACCESS, il y a la possibilité d'utiliser DoCmd.TransferSpreadsheet
Tu regardes dans l'aide (F1) pour les options qui t'intéressent, ça te permet d'importer en 2 lignes de code l'intégralité d'une feuille EXCEL dans une table ACCESS.

Après, comme tu as toujorus la même structure, tu peux récupérer les champs qui t'intéresse en utilisant leur index etc ...

Mais bon, pas forcément pratique à utiliser si tu n'as besoin que de 3 cellules.

Molenn
0
Rejoignez-nous