Se connecter avec
S'enregistrer | Connectez-vous

VBA importer une cellule Excel dans Access

Dernière réponse : dans Programmation
Partagez

Bon, quelqu'un pour lui dire, moi je n'en ai pas le courage :pfff: 
(Avant de passer pour un [censured], essaye de demander à google ce que signifient ces 4 lettres ;)  )

Sinon, il te suffit de correctement paramétrer la fonction TransferSpreadsheet.
Contenus similaires

ca j'avais trouvé mais le souci c'est que ma ligne est pas fixe donc je sais pas comment la récupérer la ligne qui contient la valeur "total" a la premiere colonne

Ceci expliquant cela, si tu nous avais expliqué toute la problématique on aurait répondu plus juste.

Pour faire cela tu as deux solutions :

- Soit tu importes toute la table excel, et tu fais des traitements après pour récupérer ta valeur.
- Soit tu ouvres le classeur et tu recherche grace au VBA Excel ce que tu veux :

Je te donne les billes pour la 2eme solution : (Il faut rajouter la référence Microsoft Excel 11.0 Object Librairy)

  1. Public AppExcel As Excel.Application
  2. Private wbFile As Excel.Workbook
  3.  
  4. Set AppExcel = CreateObject("Excel.Application") ' Ouverture d'excel
  5. If Not AppExcel Is Nothing Then
  6. Set wbFile = AppExcel.Workbooks.Open("c:\toto.xls", False, True) 'Ouverture du classeur
  7. if not wbfile is nothing then
  8. ' Traitement voulu...
  9.  
  10. ' Fermeture des élements
  11. wbfile.close
  12. AppExcel.Application.Quit
  13. Set appexcel = nothing
  14. end if
  15. end if

Donc la question n'est pas comment "récupérer une cellule" mais "comment analyser une feuille Excel pour y trouver une cellule en particulier puis ensuite l'importer dans Access".

Tu as plusieurs façons de faire.
Par exemple :
  • Instancier une session Excel via OLE, faire tes analyses de la feuille, y récupérer la valeur qui t'intéresse. L'instanciation se fait comme ça (vu dans ton message http://www.presence-pc.com/forum/ppc/Programmation/prob... )
    Set XL = CreateObject("Excel.Application" )

  • Récupérer une zone de la feuille Excel dans une table temporaire en passant par TransferSpreadsheet, analyser les données de cette table, y récupérer la valeur qui t'intéresse.

    Just grilled by Freeman. Encore une fois. Ca va effectivement sentir le roussi ;) 
  • [pinaillage=ON]
    Freeman» Rhoo l'erreur !
    Lignes 12 & 13, après le EndIf de la ligne 14. :o 
    Où est le Set wbFile = Rien :??: 

    darkspoilt» Deux fois les mêmes suggestions. A mon avis, c'est une bonne soluce ;) 

    Moi je suis pour la deuxieme solution de freeman et la premiere de zeb
    mais je vois complement l'algorithme pour voir ma ligne mais il me manque le code

    ca ferais un truc du genre

    1. tant que ligne(i).Colonne1 different de "total"
    2. {
    3. i++;
    4. }

    Traduction en ligne:

    tant que --> do while.. loop
    ligne(i).Colonne(1).Texte --> Cells(i, 1).Text
    .. different de "total" --> .. <> "total"
    i++ --> i = i + 1

    :D 

    lol ca change vraiment du C ou du java (le code dont j'ai l'habitude)
    Merci beaucoup en tout cas
    La prochaine fois je m'exprimerais mieux promis

    Bonjour,
    j'ai créer un code provisoire afin de tester ma fonction sur click lors d'un formulaire

    et il a une erreur lorsque je click sur le bouton il m'écrit

    "L"expression sur clic entrée comme paramètre de la propriété de type évènement est a l'origine d'une erreur Type défini par l'utilisateur non défini.
    Le résultat de l'expression n'est pas le nom d'une macro, le nom d'une fonction définie par l'utilisateur ou [Event procédure]

    Une erreur a peut être été commise lors de l'évalutation d'une fonction , d'un évène ment ou d'une macro"

    mon bouton est configuré sur procédure évènementiel
    Si quelqu'un voit l'erreur je le remercie d'avance


    1. Sub Commande0_Click()
    2. Dim l As Integer
    3. l = Ligne()
    4. DoCmd.TransferSpreadsheet acImport, , CA, "D:\Eric\dossier_projets\TDB\Chiffres-Affaires\a-Activité paiement porteurs CA an2007.xls", 0, "K" & i
    5.  
    6. End Sub
    7.  
    8. Public Function Ligne() As interger
    9.  
    10.  
    11. Public AppExcel As Excel.Application
    12. Private wbFile As Excel.Workbook
    13. Public i As Integer
    14.  
    15. Set AppExcel = CreateObject("Excel.Application") ' Ouverture d'excel
    16. If Not AppExcel Is Nothing Then
    17. Set wbFile = AppExcel.Workbooks.Open("c:\toto.xls", False, True) 'Ouverture du classeur
    18. If Not wbFile Is Nothing Then
    19.  
    20. Do While Cells(i, 1).Text <> "TOTAL"
    21. i = i + 1
    22. Loop
    23.  
    24. wbFile.Close
    25. AppExcel.Application.Quit
    26. Set AppExcel = Nothing
    27. End If
    28. End If
    29. End Function

    Citation :
    [pinaillage=ON]
    Freeman» Rhoo l'erreur !
    Lignes 12 & 13, après le EndIf de la ligne 14. :o 
    Où est le Set wbFile = Rien :??: 

    darkspoilt» Deux fois les mêmes suggestions. A mon avis, c'est une bonne soluce ;) 


    Le set wbfile = Rien risque de provoquer une incompatibilité de type :sol:  ou encore Variable inconnue :p 

    Plus sérieusement ton erreur dark vient dans le renvoi du résultat de ta fonction. Il faut dire explicitement à la fonction la valeur quelle renvoie.
    1. Public Function Ligne() As interger ' Integer c mieux :D

    Donc à la fin du code de ta fonction il te manque :
    1. Ligne = i


    Tu devrais mettre long plutot qu'integer (Et d'ailleur zeb va t'espliquer pourquoi :jap:  )et tu devrais tester aussi que la valeur de i soit la fin de ta boucle (cas ou tu ne trouves pas de ligne total).

    oui mais vu que j'utilise des fichier officiel ca devrait le faire mais bon on ne sait jamais et pourquoi je devrait utiliser long?

    Et j'ai un probleme de syntaxe il reconnait pas cette ligne

    1. DoCmd.TransferSpreadsheet acImport, , "CA", Chiffre, 0, "K" & i


    i est une variable

    Parce que c'est trop court !

    Questions:
  • Quelle est la plage du type Integer ?
  • Quelle est la plage du type Long ?
  • Combien y-a-t'il de lignes dans une feuille Excel ?

    ....

    C'est bon comme esplication ?


    HommeLibreXXIII > quelle est la différence entre Rien et Nothing ?
    Réponse: 3 fois rien :o 
  • Oki mais j'ai que 50lignes maximum dans mon tableau excel et ca risque pas de dépassé donc c bon non?? Sinon quel est la bonne syntaxe pour
    1. DoCmd.TransferSpreadsheet acImport, , "CA", Chiffre, 0, "K" & i

    i est une variable. de type integer ca a son improtance ou je dois convertir en String??
    Merci d'avance

    [:whatthefuck]
    Et demain, on t'envoye un gros fichier sur la semaine au lieu de la journée par exemple ou un truc comme ça !!!! Tu refais toutes tes macros !!!!! Une ligne, c'est un Long un point c'est tout. Et si le fichier XL ne contient pas de ligne Total (oubli, erreur, etc.), ta macro se vautre lamentablemnt. En passant, j'espère que tu gères cette erreur :o 


    "K" & i va bien donner "K12" pour i = 12. Oui je sais VB = caca. Pas besoin de conversion.


    Sinon, i n'est pas un Integer mais un Long puisque c'est un numéro de ligne :o 

    oki mais je travaille déja sur des fichiers de l'année donc ca c'est pas le souci je fais des économie mémoire (lol) mais une ligne = long ca je savais pas.
    Et même avec des long ca ne fonctionne pas. Donc ce n'est pas ca.

    Citation :
    Questions:
  • Quelle est la plage du type Integer ?
  • Quelle est la plage du type Long ?
  • Combien y-a-t'il de lignes dans une feuille Excel ?

  • Repose-toi ces 3 questions, tu verras, ce sera limpide. :o 
    Tiens, pour en être sûr, réponds donc. :) 
  • Ah, ça ne marche pas ?

    Essaye en dur avec une valeur dont tu es sûr : "K12", ou encore "K12:k12", en précisant le nom de la feuille: ... "Feuil1!K12" / "Feuil1!K12:K12"

    Désolé, je n'ai pas ACCESS sopus la main pour vérifier.

    Citation :
    HommeLibreXXIII > quelle est la différence entre Rien et Nothing ?
    Réponse: 3 fois rien :o 

    On en déduit Rien = Nothing/3 donc Nothing c moins que rien... :D 

    Si je reprends ton code avec les points bizzares.
    1. Sub Commande0_Click()
    2. Dim l As Long
    3. l = Ligne() ' Tu met le résultat dans l puis tu utilise i qui n'est pas utilisé ici ?
    4. DoCmd.TransferSpreadsheet acImport, , CA, "D:\Eric\dossier_projets\TDB\Chiffres-Affaires\a-Activité paiement porteurs CA an2007.xls", 0, "K" & i
    5.  
    6. End Sub
    7. Public Function Ligne() As Long
    8.  
    9. Dim AppExcel As Excel.Application
    10. Dim wbFile As Excel.Workbook
    11. Dim i As Long
    12.  
    13. Set AppExcel = CreateObject("Excel.Application" ) ' Ouverture d'excel
    14. If Not AppExcel Is Nothing Then
    15. Set wbFile = AppExcel.Workbooks.Open("c:\toto.xls", False, True) 'Ouverture du classeur désiré
    16. If Not wbFile Is Nothing Then
    17. Do While Cells(i, 1).Text <> "TOTAL"
    18. i = i + 1
    19. Loop
    20. wbFile.Close
    21. AppExcel.Application.Quit
    22. Set AppExcel = Nothing
    23. Set wbfile = Nothing ' Rien+Rien+Rien
    24. End If
    25. End If
    26. 'C'est une fonction qui doit renvoyer une donnée
    27. Ligne = i
    28. End Function


    Ca y est j'ai compris ou tu te trompes, En fait il faut comprendre ou existe tes variables et ou elle ne sont plus, Dans des fonctions ou sub les variables que tu créé existe seulement le temps de l'execution de ta fonction, donc il ne sert à rien de mettre des public ou private, on déclare simplement avec Dim.
    Le i contenu dans ta fonction est interne et invisible de l'exterieur de cette fonction c'est pour cela que tu créé une fonction renvoyant une valeur, afin que le résultat ne soit pas "perdu".
    Si dans la fenetre d'execution tu tapes ?Ligne et tu valide ca t'affichera le résultat de ton execution.

    C'est pour cela qu'il te faut une variable l qui récupère le résultat de ta fonction et après tu dois l'utiliser comme variable pour trouver ta ligne car i n'existe plus.

    Enfin j'espère que c'est pas du chinois. :jap: 

    1. DoCmd.TransferSpreadsheet acImport, , CA, "D:\Eric\dossier_projets\TDB\Chiffres-Affaires\a-Activité paiement porteurs CA an2007.xls", 0, "K" & i


    J'avais pas remarqué mais CA c'est le nom de ta table donc une string.

    1. DoCmd.TransferSpreadsheet acImport, , "CA", "D:\Eric\dossier_projets\TDB\Chiffres-Affaires\a-Activité paiement porteurs CA an2007.xls", 0, "K" & i

    On t'a donné toutes les billes pour pouvoir y arriver. Il faut peut être tout simplement que tu abandonnes le Transferspreadsheet... Et que tu utiles le code de la fonction ligne pour remplir directement ta table.

    Bah ligne est utiliser avec Excel pour localiser mon montant mais pas pour Access c'est pas la meme chose non?? en SQL je sais comment je pourais faire mais avec l'importation c'est possible transfertspreadsheet

    Mais justement tu ouvres un classeur excel, tu trouves la ligne voulue, après il ne parait pas difficile de récupérer la valeur de ton total et de l'ajouter dans ta table au lieu de renvoyer la position tu renvoie la valeur que tu ajoute directement dans ta table après. Maintenant si tu as plusieur valeur à récupérer sur ta ligne "total" dans ce cas il te suffit de tout faire directement par ligne.

    1. Public Sub MajBase()
    2. Dim AppExcel As Excel.Application
    3. Dim wbFile As Excel.Workbook
    4. Dim i As Long
    5. Dim trouve as boolean
    6.  
    7. Set AppExcel = CreateObject("Excel.Application" )
    8. If Not AppExcel Is Nothing Then
    9. Set wbFile = AppExcel.Workbooks.Open("c:\toto.xls", False, True)
    10. If Not wbFile Is Nothing Then
    11. trouve = false
    12. ' le test 65536 c à la rache il vaudrait mieux trouver le dernier enregistrement
    13. While i<= 65636 and not trouve
    14. if Cells(i, 1).Text <> "TOTAL" then
    15. trouve = true
    16. else
    17. i = i + 1
    18. end if
    19. Wend
    20. ' On verifie si on a trouvé la ligne
    21. if trouve then
    22. ' Traitement des valeurs et ajout dans les tables. exple non garanti :P
    23. Currentdb.execute "INSERT INTO CA(TOTAL) VALUES (" & Cells(i, 1) & ")"
    24. end if
    25. wbFile.Close
    26. AppExcel.Application.Quit
    27. Set AppExcel = Nothing
    28. Set wbfile = Nothing ' Rien+Rien+Rien
    29. End If
    30. End If
    31. 'C'est une fonction qui doit renvoyer une donnée
    32. End Function

    j'allais faire plus bourrin lol en fiat ma table est vierge donc l'initialiser mettre ma valeur dans une table temporaire et l'ajouter ma table vierge directement dans le champs c peut etre un peu tordu mais ca je saurais le faire après si il y a des solution plus imple je suis oki
    je ne connais pas les erreurs elle signifie quoi l'erreur 65536??

    Ben justement c'est la seule méthode dans ce cas.

    pour les erreurs tu tapes err.description dans la fenetre d'execution pour connaitre le texte de l'erreur.

    Une fois que tu as la bonne cellule dans Excel, il te suffit de faire un INSERT INTO ta_table (ta_colonne) VALUES (ta_valeur) [:spamafote]
    Posez votre question