IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Insertion données en nombre; Excel vers Access [Toutes versions]


Sujet :

VBA Access

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut Insertion données en nombre; Excel vers Access
    Bonjour à tous,

    Je me pose une question dans le cadre de l'importation de données de Excel vers Access.

    J'ai un tableau Excel et je souhaite ajouter à une table existante (donc qui contient déjà des informations) toutes les lignes de mon tableau Excel. Pas de souci de structure puisque la table a été conçu pour mon tableau.

    Je me demande donc quelle est la solution la plus efficace pour faire cela ?
    J'étais parti pour parcourir mon tableau Excel ligne à ligne et faire une insertion pour chaque ligne mais cela me semble fastidieux et je suppose qu'il y a beaucoup plus efficace.

    Merci d'avance pour votre aide

    Ps: j'ai hésité entre le forum Excel et Access donc veuillez m'excuser si je ne suis pas au bon endroit

  2. #2
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    Bonjour,

    Au niveau de ton importation, elle doit se faire de manière automatisé via un formulaire Access sur clic bouton ? As tu plusieurs feuilles à importer depuis ton fichier Excel ?

    Voila la solution que j'utilise pour importer mes données issu d'excel vers Access :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    '---------------------------------------------------------------------------------------
    ' Sur clic bouton
    '---------------------------------------------------------------------------------------
     
     
    Private sub MonBoutonCmd_Click()
    Dim oApp As Object
    Dim oWkb As Object
    Dim oWSht As Object
    Dim fDlg As Office.FileDialog, strFichier As String
    Dim NomFeuille As String, Onglet As String
    Dim i As Long
     
    ' --------------------------
    ' Selection du fichier Excel
    ' --------------------------
    Set fDlg = Application.FileDialog(msoFileDialogOpen)
    ' Définition du ou des filtres
    fDlg.Filters.Clear
    fDlg.Filters.Add "Fichier Excel", "*.xl*"
    ' Dossier de départ
    fDlg.InitialFileName = CurrentProject.Path
    ' Type d'affichage
    fDlg.InitialView = msoFileDialogViewList
    If fDlg.Show Then
       strFichier = fDlg.SelectedItems(1)
    End If
    Set fDlg = Nothing
    ' Si l'utilisateur a cliqué sur Annuler quitter la procédure
    If Len(strFichier) = 0 Then
    Exit Sub
    Else
    DoCmd.Hourglass True
     
    ' --------------------------
    ' Ouverture du fichier Excel
    ' --------------------------
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open(strFichier)   'Fichier sélectionné par l'utilisateur
     
    ' Feuille excel 1
    Onglet = oWkb.Worksheets.item(1).Name
     
    ' dernière du tableau contenant les données (colonne A)
    i = oWSht.Range("A65536").End(xlUp).Row
     
    ' Sélection des données à importer
    ' Change AF par la dernière colonne de ton tableau
    NomFeuille = Onglet & "!A1:AF" & i
     
     'Copie les données de excel vers la base, table "TMP" = Remplace TMP par le nom de ta table
     DoCmd.TransferSpreadsheet acImport, 8, "TMP", strFichier, false, NomFeuille
    DoCmd.Hourglass false
    End If
    end sub
    Je ne sais plus si les données se copieront à la suite de celle déjà présente mais normalement oui. Dans le cas ou il y aurait un problème utilise une table temporaire pour copier tes données puis utilise une requête insert qui ajoutera tes données de la table temporaire TMP vers la table concernée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    with DoCmd
    .TransferSpreadsheet acImport, 8, "TMP", strFichier, True, NomFeuille
    .RunSQL "INSERT INTO "Le nom de ta table" SELECT TMP.* FROM TMP"
    .RunSQL "DROP TABLE TMP"
    end with
    Si je me trompe pas, TMP va se créer automatiquement avec TransferSpreadsheet

    Pour plus d'infos sur TransferSpreadsheet, dans visual basic editor, selectionne le puis tape pour ouvrir l'aide Access.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut
    Bonjour

    Tout d'abord merci pour ta réponse.
    J'étais justement entrain de m'orienter vers la solution TransferSpreadsheet

    La seul différence est que j'ai placé le code côté Excel mais je peux très bien le mettre sous access (je suis assez libre puisqu'il s'agit d'une nouvelle appli que je suis entrain de créer)

    Mon souci est que le transfert ne fait pas et je n'ai pas de message d'erreur.
    Rien qu'y puisse m'aider à comprendre pourquoi il ne se passe rien ..

    Pour info, voici le code concerné :

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      Set db = OpenDatabase("C:\Dev\Factures.mdb")
      path = ActiveWorkbook.path & "\" & ActiveWorkbook.name
     
      ActiveWorkbook.Close
     
     
      '==========Insertion dans la table temporaire ==========
      DoCmd.TransferSpreadsheet acImport, 8, _
      "Facture_Temp", path, True, "table_tmp_excel"
     
      '==========Insertion dans la vrai table ==========
      db.QueryDefs("insertionNouvelleFacture").Execute
     
      '==========Raz de la table temporaire facture ==========
        db.QueryDefs("razTabTemp").Execute

    je vais essayé de le faire depuis Access pour voir si ça solutionne mon problème (d'ailleurs c'est plus logique)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut
    Ok merci; j'avais pourtant lu qu'en incluant la librairie Microsoft Access; j'avais accès à DoCmd.
    D'ailleurs l'autocompletion me le proposant suite à cette ajout, je ne me suis pas poser plus de question que ça.

    Pour le coup, j'ai une erreur "Vous devez ouvrir une base de données pour exécuter cette opération" pourtant j'ai bien la base ouverte et OpendDatabasee devrait suffir

    Bref, je compte de toute manière faire le script sous Access. Je pense que c'est plus logique.

    Du coup, à partir de ton code, j'ai un souci pour le calcul de la dernière ligne:
    "Erreur définie par l'application ou par l'objet"

    il me semble que tu as oublié d'initialiser l'objet OWsht donc je l'ai fais mais toujours le problème
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ' --------------------------
    ' Ouverture du fichier Excel
    ' --------------------------
    Set oApp = CreateObject("excel.application")
    Set oWkb = oApp.Workbooks.Open(strFichier)   'Fichier sélectionné par l'utilisateur
     
    ' Feuille excel 1
    Onglet = oWkb.Worksheets.Item(1).Name
     
    Set oWSht = oWkb.Worksheets(Onglet)
     
    ' dernière du tableau contenant les données (colonne A)
    dernierLigne = oWSht.Range("A65536").End(xlUp).Row

    PS : Onglet a bien la bonne valeur, strFichier aussi


    EDIT : je crois que c'est xlUp qui n'est pas reconnu puisque lorsque je passe la sourie, c'est indiqué comme vide

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    Oui et c'est normal, je me suis un peu précipiter dans mon message... Tu as besoin d'ouvrir la base sous Access et non sous DAO bref le mieux pour toi n'est pas de perdre du temps sous Excel mais de le faire sous Access, ca posera moins de problème !

    Oublie mon dernier post, le code n'est pas opérationnel.

  6. #6
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    essaye avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dernierLigne = oWSht.Cells(65536, 1).End(xlUp).Row
    Si ca ne marche toujours pas le code si dessous devrais fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    While Not IsEmpty(oWSht.Cells(dernierLigne, 1))
    dernierLigne= dernierLigne + 1
    Wend

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Points : 451
    Points
    451
    Par défaut
    Ok merci beaucoup
    En fait; il me manquait la référence vers Microsoft Excel pour avoir xlUp de défini

    ca fonctionne bien et ça ajoute à la fin pour info

    Merci encore. Pour le reste, je devrais m'en sortir

  8. #8
    Membre habitué
    Inscrit en
    Juillet 2010
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 230
    Points : 129
    Points
    129
    Par défaut
    Ah oui ca y est je comprend mieux. Comme tu as pu le voir dans mon message dessus, la méthode utilisé dans le code est le Late Binding. Il n'y a donc normalement pas besoin de déclarer la librairie Excel dans les références.

    Cela amène donc à ne pas utiliser les constantes Excel comme XlUp par exemple.

    Tu peux faire le test en décochant la référence à Excel et en remplacant XlUp par -4162

    Pour trouver la valeur des constantes prédéfini dans Excel vas dans l'explorateur d'objet (F2) et Tape dans notre cas xlup puis entrée. tu sélectionne XlUp et tu verras en bas la valeur de la constante (=-4162).

    Déclarer la librairie Excel dans les références permet donc d'utiliser les constantes prédéfini. A toi de voir quelle solution tu souhaites utiliser, chacune ayant ses avantages et inconvénients.

    EDIT : Le Early Binding est ce qu'il faut utiliser = cocher les références.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb importation donnée numérique d'excel vers access
    Par rob1son76 dans le forum VBA Access
    Réponses: 3
    Dernier message: 06/09/2011, 11h50
  2. Transfert de données excel vers access
    Par Isabelle27 dans le forum Access
    Réponses: 3
    Dernier message: 22/03/2007, 07h11
  3. transférer donnée excel vers access
    Par tomas dans le forum Access
    Réponses: 2
    Dernier message: 13/12/2006, 08h48
  4. Réponses: 5
    Dernier message: 11/07/2006, 20h57
  5. [VBA-E]Exporter des données d'Excel vers Access
    Par Mut dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/06/2006, 15h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo