Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/05/2011, 11h16   #1
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 17h20   #2
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 :
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 ^^!
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/05/2011, 11h00   #3
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 :
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.
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 11h39   #4
Membre actif
 
Homme Quentin D.
Étudiant
Inscription : avril 2011
Messages : 175
Détails du profil
Informations personnelles :
Nom : Homme Quentin D.
Âge : 25
Localisation : France, Moselle (Lorraine)

Informations professionnelles :
Activité : Étudiant
Secteur : Finance

Informations forums :
Inscription : avril 2011
Messages : 175
Points : 165
Points : 165
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 :
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
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h51.


 
 
 
 
Partenaires

Hébergement Web