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 :

Importer données excel vers access, avec des bases et des feuilles n'ayant pas la même structure


Sujet :

VBA Access

  1. #1
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut Importer données excel vers access, avec des bases et des feuilles n'ayant pas la même structure
    Bonjour à tous,

    Je vous explique ce que je dois faire :

    J'ai un fichier access avec 2 tables : LOV_FUND et HISTO_FUND.

    LOV_FUND est constitué de 10 colonnes : SC_ID, Fund_Name, Subfund_Name, Share_class, Representative SC_ID, Benchmark, Currency, Fund_Type, Sigma_lim et R2.

    Histo_Fund est constitué de 6 colonnes : SC_ID, Date_NAV, Official_NAV_Share, Nb_Shares, DividendperShare, NAV_SharewithoutDividend.

    J'ai un ensemble de fichier excel portant les noms : NAV_Fund_Name, des différents fonds de ma base.(certains ne sont pas encore dans la base)

    La structure des fichiers excel est la suivante :
    Une feuille Ident avec en colonne : Fund_Name, SubFund_Name, Benchmark, Currency, Fund_Type.
    Cette feuille comporte la liste des sous-fonds du fonds.
    J'ai ensuite plusieurs autres feuilles portant le nom des sous-fonds et ayant la forme suivante :
    Sur la 1ère ligne j'ai : Date_Nav et les noms des share_class.
    Sur les lignes suivantes j'ai une date à laquelle est associée un Official_NAV_Share (nombre).

    Mon problème est que je dois importer toutes les valeurs des NAV des share_class en identifiant les noms et les SC_ID, mais les SC_ID ne sont pas dans les feuilles excel et donc, lorsque j'importe les données, je dois juste importer les NAV mais en y associant les bon SC_ID par rapport aux bonnes share_class...

    J'ai pensé à 2 méthodes :
    - Importer l'ensemble des données dans une table temporaire et faire des requêtes dessus pour extraire les données (mais je ne sais absolument pas comment faire et cela m'a l'air très difficile).
    - Modifier la forme de mes feuilles excel pour qu'elles correspondantes à la forme de mes tables. (cad y ajouter la colonne SC_ID qui correspond à la bonne share_class)

    Pour commencer laquelle de ses 2 méthodes seraient la plus adéquates (bien sûr tout cela avec VBA Access)?
    Et connaisseriez-vous alors du code pour que je puisse avoir une base de travail?
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  2. #2
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bonjour, donc pour ceux qui ont déjà vu mes discussions sur ce site, j'utilise toujours le même programme pour extraire les données d'excel vers access, donc pour ne pas perdre les bonnes habitudes encore une fois le même ^^ :

    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
    Sub tranfertFeuilleClasseursFermes_VersAccess()
    Dim Cn As New ADODB.Connection
    Dim oProdRS As New ADODB.Recordset, oRS As ADODB.Recordset
    Dim oConn As ADODB.Connection
    Dim j As Integer
    Dim Fichier As String, Repertoire As String
     
    '------------------------------------------------------
    'Connection à la Base Access
    Set oConn = CurrentProject.Connection
     
    'les données seront placés dans Table1
    Set oRS = New ADODB.Recordset
    oRS.Open "Select * from HISTO_FUND", oConn, adOpenKeyset, adLockOptimistic
    '------------------------------------------------------
     
    'Boucle sur les classeurs Excel du répertoire cible
    Repertoire = "C:\Users\qdeutschle\Desktop\SRRI2\NAV_file_test\Test"
    Fichier = Dir(Repertoire & "\*.xls")
     
    Do While Fichier <> ""
        'Connection au classeur Excel
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Repertoire & "\" & Fichier & ";" & _
        "Extended Properties=""Excel 8.0;"""
     
        'Req = DLookup("[Representative_SC_ID]", "LOV_FUND", "[Subfund_Name] = ´ ICG Patrimoine ´")
     
        'requête pour extraire les données de la Feuil1
        oProdRS.Open "SELECT * FROM ['ICG Patrimoine$']", Cn, adOpenStatic
     
        ' --- Transfert des données dans la base ---
        Do While Not (oProdRS.EOF)
            oRS.AddNew
                For j = 1 To oProdRS.Fields.Count - 1
                oRS.Fields(0) = 449
                oRS.Fields(1) = oProdRS.Fields(0).Value
                oRS.Fields(2) = oProdRS.Fields(j).Value
                Next j
            oRS.Update
            oProdRS.MoveNext
        Loop
        '-------------------------------------------
     
        oProdRS.Close
        'Fermeture de la connection au classeur Excel
        Cn.Close
    Fichier = Dir
    Loop
     
    oRS.Close
    Set oRS = Nothing
    'Fermeture de la connection Access
    oConn.Close
    Set oConn = Nothing
    End Sub
    Alors j'ai donc réussit en incrémentant mon j à extraire les bonnes données.
    Les problèmes qui restent sont :
    - de faire une boucle sur les feuilles du classeur où je suis connecté(sauf la feuille ident)
    - de stocker les identifiants, correspondants aux noms de mes colonnes dans les classeurs excel(c'est-à-dire la 1ère colonne), dans une variable que je mettrais à la place de mon 449 dans mon code.(il faut donc checker le nom de ma colonne pour ensuite checker le SC_ID)

    Pour l'instant je ne vois rien d'autres ^^, alors si vous avez des propositions pour faire ces étapes, je suis preneur ^^!
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  3. #3
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bon j'ai trouvé comment faire une boucle sur le nom des feuilles, il me reste plus qu'à stocker l'Id.

    Voila ce que j'ai maintenant :
    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
    Do While Fichier <> ""
        'Connection au classeur Excel
        Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Repertoire & "\" & Fichier & ";" & _
        "Extended Properties=""Excel 8.0;"""
     
        Set oCat = New ADOX.Catalog
        Set oCat.ActiveConnection = Cn
     
        'Req = DLookup("[Representative_SC_ID]", "LOV_FUND", "[Subfund_Name] = ´ ICG Patrimoine ´")
     
        For Each Feuille In oCat.Tables
            FeuilName = Feuille.Name
            If FeuilName <> "Ident$" Then
                'requête pour extraire les données de la Feuil1
                oProdRS.Open "SELECT * FROM [" & FeuilName & "] ", Cn, adOpenStatic
     
                ' --- Transfert des données dans la base ---
                Do While Not (oProdRS.EOF)
                    oRS.AddNew
                        For j = 1 To oProdRS.Fields.Count - 1
                        oRS.Fields(0) = 0
                        oRS.Fields(1) = oProdRS.Fields(0).Value
                        oRS.Fields(2) = oProdRS.Fields(j).Value
                        Next j
                    oRS.Update
                    oProdRS.MoveNext
                Loop
     
                oProdRS.Close
            End If
        Next Feuille
     
        'Fermeture de la connection au classeur Excel
        Cn.Close
    Fichier = Dir
    Loop
    Alors le problème est le suivant :

    J'ai le nom des shareclass en colonne dans mes feuilles excel (sauf la 1ère qui est la date).
    Dans ma DB j'ai les champs : SC_ID, Fund_Name(qui est aussi le nom des fichiers excel), SubFund_Name(qui est le nom de mes feuilles), Share_class(nom de mes colonnes excel), Representative_SC_ID.

    Alors le truc c'est que je dois importer dans ma DB que les share_class des representative_SC_ID.
    En gros chaque fichier excel est un fonds, dans chaque fonds j'ai plusieurs sous fonds et dans chaque sous fonds j'ai plusieurs share_class mais à chaque fois j'ai qu'une seule representative share_class. Et c'est elle que je veux importer.

    Pour cela il faudrait que je check son SC_ID dans la DB.
    Le problème est que dans ma DB j'ai (par exemple) pour le mm fonds, mm sous-fonds :
    SC_ID : 449, 450, 451, 452
    Share_class : SC1, SC2, SC3, SC4 (ce sont aussi les noms des colonnes dans les feuilles excel)
    Rep_SC_ID : 450, 450, 450, 450

    Le but est de stocker 450 dans une variable afin d'importer seulement la colonne portant le nom SC2.

    Et là je bloque, une proposition ? (je sais utiliser les requêtes sur Access, je sais utiliser la fonction Dlookup pour extraire une valeur, mais ici je ne sais pas comment faire)

    Merci d'avance pour vos réponses.
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

  4. #4
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bon bin rebonjour, voila j'ai trouvé comment faire, j'ai plus qû'a faire une gestion des fonds non existants, sous-fonds non existants et share_class non existantes ^^.

    Je pense réussir tout seul, ce que j'ai fait depuis le début de cette discussion lol!
    Bon bin merci quand même pour ceux qui se sont donnés la peine de réfléchir un petit peut à mon problème, je met le bout de code que j'ai modifié et je post en résolu !

    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
                Do While Not (oProdRS.EOF)
                    oRS.AddNew
                        For j = 1 To oProdRS.Fields.Count - 1
                            ColName = oProdRS.Fields(j).Name
                            IdColName = DLookup("[SC_ID]", "LOV_FUND", "[Share_Class] = '" & ColName & "' ")
                            RepIdColName = DLookup("[Representative_SC_ID]", "LOV_FUND", "[Share_Class] = '" & ColName & "' ")
                            If IdColName = RepIdColName Then
                                oRS.Fields(0) = IdColName
                                oRS.Fields(1) = oProdRS.Fields(0).Value
                                oRS.Fields(2) = oProdRS.Fields(j).Value
                            End If
                        Next j
                    oRS.Update
                    oProdRS.MoveNext
                Loop
    Pourquoi faire aujourd'hui ce que l'on peut remettre à demain ?

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

Discussions similaires

  1. [AC-2007] importé" d'excel vers access avec mise a jour
    Par gwaheb dans le forum VBA Access
    Réponses: 5
    Dernier message: 17/06/2011, 13h43
  2. Réponses: 2
    Dernier message: 01/06/2011, 12h14
  3. Réponses: 25
    Dernier message: 26/04/2011, 13h58
  4. Importations données Excel vers Access
    Par olivier777 dans le forum IHM
    Réponses: 12
    Dernier message: 26/05/2009, 17h51
  5. [A-00] Importer des données Excel vers Access
    Par Slici dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/03/2009, 12h56

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