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, 14h00   #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 Créer une colonne dans un fichier excel et la remplir avec la valeur d'une requête

Bonjour à tous,

J'ai une base de données avec 2 tables.
LOV_Fund avec 2 colonnes : FUND_ID et FUND_Name.
PORTFOLIO avec un tas de colonnes dont en 1ère le FUND_ID.

J'ai des fichiers excel portant le nom de mes fonds.
Ces fichiers contiennent toute l'information qu'il me faut pour utiliser mon code d'import de fichier excel sauf la 1ère colonne FUND_Id que je n'ai pas dans les fichiers excel.
J'aimerais lorsque je me connecte à mon fichier excel dans mon code, créer une colonne FUND_ID et y insérer le FUND_ID correspondant au nom de mon fichier excel.(et cela pour le nombre de lignes portant des informations de ma feuille excel à partir de la 2nde ligne)

Voici mon code qui sert à importer tous les fichiers excel d'un répertoire :

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
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 PORTFOLIO", oConn, adOpenKeyset, adLockOptimistic
'------------------------------------------------------
 
'Boucle sur les classeurs Excel du répertoire cible
Repertoire = "C:\Users\qdeutschle\Desktop\LiquidityRisk\FundStock"
Fichier = Dir(Repertoire & "\*.xlsx")
 
Do While Fichier <> ""
    'Connection au classeur Excel
    Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=" & Repertoire & "\" & Fichier & ";" & _
    "Extended Properties=""Excel 8.0;"""
 
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [Sheet1$]", Cn, adOpenStatic
 
    ' --- Transfert des données dans la base ---
    Do While Not (oProdRS.EOF)
        oRS.AddNew
            For j = 0 To oRS.Fields.Count - 1
            oRS.Fields(j) = 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

Ma question est donc, comment faire pour sélectionner le Fund_Id correspondant au nom de mon fichier excel?
Je sais comment stocker le nom de mon fichier dans une variable :
Code :
Fich = Left(Fichier, Len(Fichier) - 5)
Je pensais faire une requête du genre :

Req = "Select Fund_Id from Lov_Fund where Fund_Name = Fich"

Ensuite mettre la valeur de Req dans toute la colonne que j'ajoute en 1ère position.
Mais comment faire cela correctement?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 14h57   #2
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 255
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 255
Points : 2 979
Points : 2 979
Re,

petites remarques :
1) attention au multipost pour le même sujet (ou quasi), c'est interdit.

2) Il a sur cette même page un post assez semblable au tien Avant de poster, il est bon de faire quelques recherches.

Bonne continuation.
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 15h08   #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
Euh, ce n'est pas vraiment la même chose, j'ai déjà ma méthode d'importation des données, ce n'est pas cela le problème.
Le problème est que j'ai une colonne supplémentaire dans ma base access par rapport à mon fichier excel. Je voudrais créer par le code dans mon fichier excel(qui reste fermé) une nouvelle colonne .
Et mettre dans cette colonne ( qui sera appelée Fund_Id) le résultat d'une requête (qui sera toujours qu'un seul nombre).

Voilà, je ne sais pas comment créer une colonne dans un fichier excel fermé et ensuite la remplir.
Et je ne sais pas comment stocker dans une variable le résultat d'une requête.
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 15h27   #4
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 255
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 255
Points : 2 979
Points : 2 979
Citation:
Euh, ce n'est pas vraiment la même chose, j'ai déjà ma méthode d'importation des données, ce n'est pas cela le problème.
As-tu au moins BIEN regardé le lien que je t'ai donné et le lien vers la FAQ qui s'y trouve ? Je doute !!

A vaincre sans combattre, on triomphe sans gloire !!!
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 15h55   #5
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
Oui je l'avais déjà vu cette FAQ mais il n'y a que Insertion d'une ligne :

Code :
xlSheet.Range("A" & i & ":H" & i).EntireRow.Insert Shift:=xlShiftDown
Du coup pour une colonne ça serait(en particulier insérer une colonne dans A) :

Code :
xlSheet.Range("A" & 1 & ":A" & i).EntireRow.Insert Shift:=xlShiftDown
??? Et i prend quelle valeur? Faut faire une boucle de i=1 à la longueur de ma colonne A -1 ?

Et j'aimerais surtout savoir comment stocker la valeur de ma requête dans une variable...

Code :
"Select FUND_ID From LOV_FUND Where FUND_NAME = '" & Fich & "'"
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 17h21   #6
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é un autre moyen en fin de compte ^^!
Au moins ce sera une victoire avec gloire lol!

Voila ce que j'ai modifié :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Fich = Left(Fichier, Len(Fichier) - 5)
    Req = DLookup("[FUND_ID]", "LOV_FUND", "[FUND_NAME] = '" & Fich & "'")
 
    'Connection au classeur Excel
    Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=" & Repertoire & "\" & Fichier & ";" & _
    "Extended Properties=""Excel 12.0;"""
 
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [Sheet1$]", Cn, adOpenStatic
 
    ' --- Transfert des données dans la base ---
    Do While Not (oProdRS.EOF)
        oRS.AddNew
            j = 0
            oRS.Fields(j) = Req
            For j = 1 To oRS.Fields.Count - 2
            oRS.Fields(j) = oProdRS.Fields(j - 1).Value
            Next j
        oRS.Update
        oProdRS.MoveNext
    Loop
Du coup je vais chercher avec Dlookup la valeur de mon FUND_ID.
J'incrémente ma boucle While Not de +1 afin de prendre tous mes champs sauf le premier. Et dans le premier j'y place ma requête.

Merci ^^!

Par contre j'ai un problème dans ma base de données, j'ai cette erreur :
The decimal field's precision is too small to accept the numeric you attempted to add.

Il me met ce message d'erreur pour des pourcentages...
J'ai des pourcentages sous excel que je veux importer en pourcentages sous access...Et avec le débbuger il me montre un nombre du genre : 2500000000000, alors que ce n'est que 2.5%.
Auriez-vous une solution?

Et j'ai encore un autre problème :
Operation is notallowed in this context.
Sur le oRS.Close... Mais je ne sais pas pourquoi...
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 09h41.


 
 
 
 
Partenaires

Hébergement Web