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

Modélisation Discussion :

Combiner 2 tables en une seule


Sujet :

Modélisation

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 55
    Points : 43
    Points
    43
    Par défaut Combiner 2 tables en une seule
    Bonjour,
    J'essaie de faire une requête pour combiner deux tables nommées "DOWNLOAD1" et "DOWNLOAD2" dans une nouvelle table.

    DOWNLOAD 1:
    DOWNLOAD2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ChampB1       ChampsB2
    1                4
    2                5
    3                6
    Je voudrais que le résultat soit :
    Nouvelle table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ChampsA1              ChampB1            ChampB2
    a                         1                  4
    b                         2                  5
    c                         3                  6
    Malgré que ça m'a semblé simple au début, je n'ai réussi à trouver dans l'Internet que des manipulations compliquées pour combiner des tables, alors que je ne veux que placer les colonnes cote à cote.

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    740
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 740
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    ca ne peut pas etre simple, puisqu'il s'agit d'un insert suivi d'un update et le probleme est que tu n'as pas de lien entre les 2 tables; il semble que seul l'ordre de tri des 2 tables (alpha dans une table, numerique dans l'autre), permette de faire le lien

    si c'est du one-shot et pas trop de donnees, tu peux toujours copier/coller vers Excel et reimporter de excel, toujours en copier/coller
    si c'est du recurrent, il faut a mon avis, soit reconcevoir le modele, soit faire un peu de code

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Merci pour ta réponse. J'avais en fait mes données dans Excel au tout début et je les importe dans Access à l'aide de la macro ci-dessous. Je ne peux pas modifier le fichier Excel parce qu'il ne m'appartient pas. En faire une copie est un processus trop long pour être répété à chaque fois qu'il y a un changemement dans fichier original. J'ai voulu importer seulement les colonnes qui m'intéressent pour diminuer le temps d'importation. Malheureusement, je n'ai pas pu toutes les importer avec une seule ligne de code puisque les colonnes ne sont pas contigues. Je les importe donc en quatre temps d'où ma question de pouvoir les regrouper dans une seule table par la suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Test_TranferSpreadsheet()
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "DOWNLOAD1", " F:\donnees financieres 2013-2014.xlsm", True, "DOWNLOAD!A:A"
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "DOWNLOAD2", " F:\donnees financieres 2013-2014.xlsm ", True, "DOWNLOAD!Q:AB"
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "DOWNLOAD3", " F:\donnees financieres 2013-2014.xlsm", True, "DOWNLOAD!AO:AZ"
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "DOWNLOAD4", " F:\donnees financieres 2013-2014.xlsm", True, "DOWNLOAD!BE:BE"
    MsgBox "Processus terminé"
    End Sub

  4. #4
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 870
    Points : 3 449
    Points
    3 449
    Par défaut
    Bonjour Lune1,

    Comme te mentionnait accessisgood si tu n'as pas de clé unique qui te permet de faire le lien (jointure) ça risque d'être compliqué et la marge d'erreur est grande.

    Si c'est une routine qui est appelé à être lancé souvent, il y a moyen de parcourir un fichier Excel et d'importer seulement les colonnes désirées dans une table Access. Si tu veux plus de détails met un exemple du fichier Excel en indiquant quelles colonnes tu veux importer et je te ferai un exemple.

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Oui, on va importer les données à chaque mois. Est-ce que la méthode dont parle pour parcourir le fichier Excel et importer seulement les colonnes desirées est par programmation? Parce que j'ai déjà essayé d'importer en utilisant le menu "Données externs", mais c'était assez long. J'ai lu dans Internet que c'est plus rapide en utilisant DoCmd.TransferSpreadsheet. C'est pour cette raison que j'essaie de le faire par programmation. Je ne peux pas partager le fichier parce qu'il est confidentiel, mais grosso modo: toutes les colonnes que je veux importer sont sur la meme feuille Excel, et je veux importer les colonnes A, Q à AB, AO à AZ et BE (chaque colonne a des données sur environ 64826 lignes).

  6. #6
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 870
    Points : 3 449
    Points
    3 449
    Par défaut
    Bonjour Lune1,

    Oui c'est par programmation, mais pour 65000 lignes ça risque d'être assez long. Sans l'avoir testé je dirais plus de 15 minutes au moins. Voici le code:
    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
    Public Function fuRecProduit()
    On Error GoTo Err_fuRecProduit
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rst As DAO.Recordset
        Dim oApp As Object
        Dim oWkb As Excel.Workbook
        Dim oWSht As Excel.Worksheet
        Dim i As Long
     
        DoCmd.Hourglass True
        strSQL = "SELECT T_EXCEL.* FROM T_EXCEL"
        Set rst = db.OpenRecordset(strSQL)
        Set oApp = CreateObject("excel.application")
        Set oWkb = oApp.Workbooks.Open("Le fichier")  'Ici c'est le chemin complet + le nom du fichier + l'extention
            Set oWSht = oWkb.Worksheets("La feuille") 'Ici c'est le nom de la feuille
            i = 1  'Ici c'est la première ligne
            With oWSht
                While .Cells(i, 1) <> ""  'Ici c'est tant qu'il y a des données
                    rst.AddNew
                        rst("Colonne A") = .Cells(i, 1)
                        rst("Colonne Q") = .Cells(i, 17)
                        'Et ainsi de suite
                    rst.Update
                    i = i + 1
                Wend
            End With
        oWkb.Close
        Set oWSht = Nothing
        Set oWkb = Nothing
        Set oApp = Nothing
        rst.Close
        Set rst = Nothing
        Set db = Nothing
     
        DoCmd.Hourglass False
        MsgBox "Importation terminée!" & Chr(13) & "Vous venez d'importer " & i & " lignes dans la table T_EXCEL"
     
    Exit_fuRecProduit:
        Exit Function
     
    Err_fuRecProduit:
            MsgBox Err.Description & " " & Err.Number
            Resume Exit_fuRecProduit
    End Function
    Si tu importes la totalité des colonnes dans une table temporaire et qu'a partir de la table temporaire tu fais un insert des colonnes que tu veux dans la table serait peut-être une meilleure solution.

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Bonjour Robert1957,
    Merci pour le code. Ça semble assez long. J'ai exécuté le code, mais je n'ai pas attendu jusqu'à la fin parce que c'était trop long. J'aime ton idée d'importer la totalité des colonnes dans une table temporaire, mais j'ai une colonne qui semble poser problème. Quand j'importe de la colonne A à la colonne E, ça fonctionne. De la colonne G à la colonne BE, ça fonctionne aussi, mais quand j'essaie d'importer de la colonne A à BE, il y a un message d'erreur: Run-time error '3709'. The search key was not found in any record. Pourtant cette colonne F est simplement du texte. Je n'ai rien remarqué de particulier en comparaison avec les autres colonnes. Le texte n'est pas très long non plus.

  8. #8
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 870
    Points : 3 449
    Points
    3 449
    Par défaut
    Bonjour Lune1,

    Voici ce que nous dit Microsoft pour cette erreur: https://support.microsoft.com/en-us/kb/302525

    Bonne journée
    Ce qui se conçoit bien s’énonce clairement et les mots pour le dire arrivent aisément. Nicolas Boileau
    Si tout est OK, n'oubliez pas de cliquer sur

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Bonjour,
    Il a dû y avoir quelque chose dans les premières lignes d'Excel qui causait l'erreur "Run-time error 3709" puisque dès que j'ai sélectionné les lignes du tableau qui m'intéressait (A7:BE57285), ça a réglé le problème. Voici mon code pour ceux que ça intéresse:

    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
    Sub Importer_tout()
     
    Dim StartTime As Double
    Dim MinutesElapsed As String
     
    StartTime = Timer
     
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "ImporterTout", "F:\donnees financiers 2013-2014.xlsm", True, "DOWNLOAD!A7:BE57285"
     
     
      MinutesElapsed = Format((Timer - StartTime) / 86400, "hh:mm:ss")
     
     
      MsgBox "Importation réussie en " & MinutesElapsed & " minutes", vbInformation
     
     
    End Sub
    J'ai aussi trouvé une autre façon d'importer, cette fois par requête. Cette methode est plus rapide et permet d'importer seulement les colonnes voulues:

    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
    Sub Importer_par_requête()
    Dim StartTime As Double
    Dim MinutesElapsed As String
     
    StartTime = Timer
     
    strSQL = "SELECT F1 AS DEPT, F17 AS DEP_MAR, F18 AS DEP_FEV, F19 AS DEP_JAN, F20 AS DEP_DEC, F21 AS DEP_NOV, " & _
    "F22 AS DEP_OCT,  F23 AS DEP_SEP, F24 AS DEP_AOU,  F25 AS DEP_JUL, F26 AS DEP_JUN,  F27 AS DEP_MAI, F28 AS DEP_AVR, " & _
    "F41 AS BUD_MAR, F42 AS BUD_FEV, F43 AS BUD_JAN, F44 AS BUD_DEC,  F45 AS BUD_NOV, F46 AS BUD_OCT, F47 AS BUD_SEP, " & _
    "F48 AS BUD_AOU, F49 AS BUD_JUL, F50 AS BUD_JUN, F51 AS BUD_MAI, F52 AS BUD_AVR,  F57 AS BUD_LAST_YR " & _
    "INTO MyNewTable " & _
    "FROM [Excel 8.0;HDR=No;database=F:\donnees financiers 2013-2014.xlsm;].[DOWNLOAD$A8:BE57285];"
     
    Set qdfNew = CurrentDb.CreateQueryDef("ImporterExcel", strSQL)
     
    DoCmd.OpenQuery "ImporterExcel"
     
     
     
      MinutesElapsed = Format((Timer - StartTime) / 86400, "hh:mm:ss")
     
      MsgBox "Importation réussie en " & MinutesElapsed & " minutes", vbInformation
    End Sub
    Merci à tous pour votre aide.

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

Discussions similaires

  1. (Performance) Deux tables ou une seule?
    Par Norin dans le forum Access
    Réponses: 26
    Dernier message: 24/06/2006, 20h43
  2. Lier trois tables dans une seule requête ?
    Par tempirate dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/06/2006, 19h27
  3. Réponses: 4
    Dernier message: 08/06/2006, 20h06
  4. plusieurs tables dans une seule table
    Par scully2501 dans le forum Access
    Réponses: 1
    Dernier message: 10/10/2005, 09h19
  5. plusieurs petite tables ou une seule grande table
    Par aaronw dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 19/05/2005, 09h22

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