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 15/04/2011, 13h05   #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 Comment importer des données Excel vers Access avec VBA Access ?

Bonjour a tous,

Je vais vous exposer mon petit problème en bref :

Je dois trouver un programme VBA Access qui analyse, dans un dossier général, des sous-dossiers en les identifiants par leur nom et ensuite analyse leur contenu.
Dans chaque sous-dossier, il y a deux types de fichiers excel qui ont chacun une structure particulière. (type NAV et type Fonds où tous les fichiers excel NAV ont la mm structure et tous les fichiers Fonds aussi)
Si le fichier excel comporte le nom NAV : en extraire les données dans une table d'une base de données Access, en évitant les doublons.
Si le fichiers excel comporte le mot Fonds : en extraire les données dans une autre table de la même base de données, tout en évitant également les doublons.

En fait je ne demande pas de me faire tout ça, je cherche juste un moyen d'extraire des données de plusieurs fichiers excel vers Access (a partir de VBA Access) vers une base de données déja existante (c'est a dire a la suite des données de la base de données). Et si possible en évitant les doublons.

Je pensais faire une boucle avec la fonction TransferSpreadsheet, mais j'ai aucune idée de comment le faire ^^.

Quelqu'un pourrait-il m'aider?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 13h33   #2
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour.

Perso, je n'utiliserais pas de commande d'importation. Deux solutions de principe :

1. Rst sur claseur fermé. Si tes classeurs contiennent des données disposées proprement en tableaux, tu peux ouvrir un jeu d'enregistrement ADO ou DAO sur chaque classeur XL qui peut rester fermer.

La manipulation du jeu d'enregistrement te permettra de renseigner les tables.

2. Variable tableau avec classeur ouvert. Si tes données sont un peu dispersées, tu ne couperas pas à l'ouverture de chaque classeur. Tu peux utiliser des variables tableaux à 2 dimensions pour charger des zones de données.

La manipulation des variables tableaux te permettra de renseigner les tables.

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 14h15   #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
Ok, donc je pencherais plutôt vers la 1ère solution, les classeurs excel sont bien rangés par colonnes, chaque classeur ayant les mm colonnes (sauf pour les deux types différents bien sûr).
Il faudrait effectivement que je puisse extraire toutes les données en laissant les classeurs fermés.
Il faudrait alors que je fasse une boucle sur le nom du classeur(NAV ou Fond), en fonction de cela, les données seront placées dans l'une des deux tables Access. (en évitant les doublons dans les 2 cas)
Ensuite entourer ça d'une boucle qui "boucle" sur les sous-dossiers.

Dites-moi si vous voyez quelque chose qui n'irait pas dans mon raisonnement.

Maintenant je dois donc essayer de comprendre comment fonctionne les plateformes DAO ou ADO ^^. Ou bien y aurait-il une solution générale existante que je n'aurais pas encore vue sur le net(avec ADO ou DAO bien sûr)? (j'ai déjà fait le tour des forums pour trouver un "simple" programme VBA Access qui extrait un ensemble de données de plusieurs fichiers Excel vers Access, pas moyen d'en trouver un correct...)

Quelqu'un aurait-il déjà du code pour extraire un fichier? (ou plusieurs)
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 16h12   #4
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Re,

Sur DVP il y a beaucoup de ressources.
Regarde le tuto de SilkyRoad Lire et écrire dans des classeurs fermés

Reviens quand tu auras commencé ton code et si tu rencontres des pb.

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 09h29   #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
Bonjour,

J'ai commencé a taper du code pour utiliser ADO mais là je reste bloqué, je ne sais pas comment prendre des données excel et les mettre dans access...

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
 
Sub ExtractDataFromExcel()
    Dim Cn As ADODB.Connection
    Dim Fichier As String
    Dim NomFeuille As String, texte_SQL As String
    Dim Rst As ADODB.Recordset
 
    'Définit le classeur fermé servant de base de données
    Fichier = "C:\Users\qdeutschle\Desktop\Work\Données\Folder\picmod2.xls"
    'Nom de la feuille dans le classeur fermé
    NomFeuille = "Sheet4"
 
    Set Cn = New ADODB.Connection
 
    '--- Connection ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=" & Fichier & _
            ";Extended Properties=Excel 8.0;"
        .Open
    End With
    '-----------------
 
    'Définit la requête.
    '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
    texte_SQL = "SELECT * FROM [" & Sheet4 & "$]"
 
    Set Rst = New ADODB.Recordset
    Set Rst = Cn.Execute(texte_SQL)
 
 
 
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing
 
End Sub
J'aiemerais déja comprendre et réussir mon code pour une feuille excel après je réfléchirais comment faire avec plusieurs.

Sinon j'avais trouvé une autre sorte de code pour extraire des données, mais là encore je suis bloqué car je n'arrive pas à sélectionner la colonne entière au lieu des cellules :

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
 
Private Sub importExcelData()
 
Dim xlApp As Excel.Application
Dim xlBk As Excel.Workbook
Dim xlSht As Excel.Worksheet
Dim dbRst As Recordset
Dim dbs As Database
Dim SQLStr As String
 
Set dbs = CurrentDb
Set xlApp = Excel.Application
Set xlBk = xlApp.Workbooks.Open("C:\Users\qdeutschle\Desktop\Work\Données\Folder\picmod2.xls")
Set xlSht = xlBk.Sheets(1)
 
SQLStr = "CREATE TABLE excelData(columnOne TEXT, columnTwo TEXT)"
 
DoCmd.SetWarnings False
 
DoCmd.RunSQL (SQLStr)
 
Set dbRst = dbs.OpenRecordset("excelData")
 
dbRst.AddNew
 
xlSht.Range("A2").Select
 
dbRst.Fields(0).Value = xlSht.Range("A2").Value
 
xlSht.Range("B2").Select
 
dbRst.Fields(1).Value = xlSht.Range("B2").Value
 
dbRst.Update
 
dbRst.Close
 
dbs.Close
 
xlBk.Close
 
End Sub
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 10h56   #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
Sinon j'ai trouvé cette procédure, mais je n'arrive pas à la faire tourner...
Elle est censer faire ça :
boucle sur tous les classeurs d'un répertoire sans les ouvrir et transfert les données de la Feuil1 vers une table Access (Table1).

L'exemple suppose que
Tous les onglets portent le même nom.
Les classeurs sont structurés comme une vraie base (pas de données éparpillées) et de structure identique à la base Access (nombre de colonne et type de données adaptés:date,texte,numerique...etc...)

la procédure nécessite d'activer la référence Microsoft ActiveX Data Objects x.x Library

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
 
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 = New ADODB.Connection
oConn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
"Data Source= 'C:\maBase.mdb';"
 
'les données seront placés dans Table1
Set oRS = New ADODB.Recordset
oRS.Open "Select * from Table1", oConn, adOpenKeyset, adLockOptimistic
'------------------------------------------------------
 
'Boucle sur les classeurs Excel du répertoire cible
Repertoire = "C:\Documents and Settings\mimi\dossier\general\excel\Nomdossier"
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;"""
 
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [Feuil1$]", 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
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 12h13   #7
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour.

Dans ta première prcédure ADO tu as un jeu d'enregistrement Rst qui contient les données du classeur XL fermé. Il te reste à ouvrir un autre jeu d'enregistrement sur la table Access pour y ajouter les données de Rst.

Ce que tu fais dans le dernier code que tu montres. EN plus ce nouveau code balaie tous les classeurs d'un répertoire. Ce code semble correct. Quel est le problème que tu rencontres?

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 13h49   #8
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
Je te donne le code modifié avec mes données :

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
 
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 = New ADODB.Connection
oConn.Open "Provider='Microsoft.ACE.OLEDB.12.0';" & _
"Data Source= 'Libraries\Documents\Database2.mdb';"
 
'les données seront placés dans Table1
Set oRS = New ADODB.Recordset
oRS.Open "Select * from Sheet3", oConn, adOpenKeyset, adLockOptimistic
'------------------------------------------------------
 
'Boucle sur les classeurs Excel du répertoire cible
Repertoire = "C:\Users\myname\Desktop\Work\Données\Folder"
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;"""
 
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [Sheet4$]", 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

Je met en fait ce programme dans un module sous access avec les références : Microsoft ActiveX Data Objects.6.0 Library
Microsoft ADO Ext.6.0 for DDL and Security
J'ai déja essayé en enlevant la 2ème référence que je t'ai donné mais ça me fait la même erreur qui est :

run-time error '-2147467259(80004005)' :
'C:\users\myname\documents\libraries\documents\database2.accdb' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.

En fait, ce code est dans un module de ma base access que je voudrais enrichir avec les fichiers excel. J'ai déja une table avec les mm noms que les colonnes de mes fichiers excel.(ici tout est dans database2, le code et la table)

Je viens d'essayer autre chose, j'ai remplacé :
'Libraries\Documents\Database2.mdb'
Par :
'C:\Users\myname\Desktop\Database2.accdb'

Et cela me donne cette erreur :
run-time error '-2147467259(80004005)' :
The database has been placed in a state by user 'Admin' on machine 'LUACGL8781' that prevents it from being opened or locked.

Voila, je ne sais vraiment pas a quoi cela correspond...Merci d'avance pour ton aide !
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h13   #9
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 plus les même messages d'erreur qui apparaissent, j'ai maintenant :

Run-time error '-2147467259(80004005)':
Unrecognized database format 'C:\Users\qdeutschle\Desktop\ExtractADO.accdb'

Code :
1
2
3
4
 
Set oConn = New ADODB.Connection
oConn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
"Data Source= 'C:\Users\qdeutschle\Desktop\ExtractADO.accdb';"
Voila ce que j'ai changé par rapport au code d'avant (il ne connaissait pas le provider que je lui donnais alors j'ai gardé celui du code de base)
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h22   #10
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour.

Si ton code est dans la BD, tu remplaces
Code :
1
2
3
4
'Connection à la Base Access
Set oConn = New ADODB.Connection
oConn.Open "Provider='Microsoft.ACE.OLEDB.12.0';" & _
"Data Source= 'Libraries\Documents\Database2.mdb';"
Par
Code :
Set OConn = CurrentProject.Connection

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/04/2011, 15h46   #11
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
Super merci beaucoup !

Le programme fonctionne très bien ^^ !

Bon je vais maintenant tenter de faire mes gestions d'erreur et mes boucles sur les folder et éviter les doublons seul ^^ (sauf bien sûr si vous avez quelques conseils à me donner)

Encore merci pour votre aide,

Cordialement,

Nitromard
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 19h12   #12
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonsoir.

Il faudrait savoir comment tu définis les doublons, c'est-à-dire quels champs ont des valeurs identiques : 1, 2, n, tous?

Après ce n'est pas trop difficile.

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 08h44   #13
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 je n'ai pas de clé primaire dans ma table, pour l'instant ce n'est pas dans mon objectif de créer une clé primaire, donc les doublons ne sont pas supprimés automatiquement.
Ensuite j'ai ma 1ère colonne date qui est identique 642 fois(et il faudrai que je la garde pour plus tard car j'aurais des dates différentes mais qui se répèteront aussi bcp de fois), ensuite une colonne code service avec 3 ou 4 différents codes. Une colonne sécurity name qui peut être répétée plusieurs fois.
Ensuite une quantité qui est souvent différente mais qui peut aussi se répéter.
Une date de maturité qui n'existe pas toujours.
Un code pays qui se répète aussi.
Une valeur marchée qui change souvent mais qui peut aussi être identique.
Un strike souvent nul.
Et enfin deux dernière colonne qui peuvent se répéter aussi.
En gros, toute mes colonnes se répètent ou sont susceptibles de se répéter, mais je pense que chaque ligne est indépendante.

Donc le mieux serait soit de comparer une ligne a toute les autres pour voir si elle se répète, ou bien de faire une clé primaire...

Je pencherais du coup pour la clé primaire : plus rapide et consomme moins de temps j'imagine.

Qu'en pensez-vous?

Cordialement,

Nitromard
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 09h50   #14
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour.

DOnc pour toi 2 enregistrements constituent 1 doublon si tous leurs champs contiennent des valeurs identiques? Autrement dit, 2 enregistrements qui contiennent des valeurs diffrentes dans 1 champ ne sont pas des doublons?

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 10h12   #15
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 c'est exactement ça.
En fait j'ai fait quelques tests :
-Si j'ai une clé primaire : le programme s'arrête lorsqu'il trouve un doublon et il ne prends pas les données qui viennent ensuite.

-Si je n'ai pas de clé primaire : le programme prend toutes les données mm les doublons (comme définis à mon sens). Et donc je veux éviter ces doublons ou bien faire une clé pour chaque ligne.

Mais cela comporte un risque de faire une clé, en fait comme c'est le client qui envoi les données et que je crée une clé pour chaque ligne, si lui a commis une erreur et a recopier 2 fois la mm ligne alors si je ne le vois pas j'aurais un doublon a proprement dit mais qui aura une clé différente de son jumeau...
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 15h35   #16
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour.

Avant d'ajouter un enregistrement à la table, tu dois t'assurer que ce n'est pas un doublon, c'est-à-dire que le n-uples des nouvelles valeurs n'est pas déjà en table.
Pour cela, il suffirait de faire une Find sur le jeu d'enregistrements de la table. Le problème c'est que le recordset ADO n'accepte pas les recherches multicritères.

Une solution serait donc d'ouvrir plutôt une jeu d'enregistrements ADO qui lui permet ces recherches. (He oui, DAO a aussi des vertus!)
Une autre solution est d'utiliser la méthode Filter du jeu d'enregistrements ADO. Cette solution donnerait
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
57
58
59
60
61
62
63
64
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, sCritere 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 Sheet3", oConn, adOpenKeyset, adLockOptimistic
'------------------------------------------------------
 
'Boucle sur les classeurs Excel du répertoire cible
Repertoire = "C:\Users\myname\Desktop\Work\Données\Folder"
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;"""
 
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [Sheet4$]", Cn, adOpenStatic
 
    ' --- Transfert des données dans la base ---
    Do While Not (oProdRS.EOF)
        'construction de la chaîne de critères par quelques exemples
            'champ numérique
            sCritere = "(" & oRS(0).Name &  " = " & oProdRS(0).value & ")"
            'champ texte
            sCritere = scritere & " And (" & oRS(1).Name & " = """ & oProdRS(1) & """)"
            'champ date
            sCritere = sCritere & " And (" & oRS(2).Name) & " = #" & Format(oProdRS(2),"mm/dd/yyyy") & "#)"
            'et ainsi de suite...
        oRS.Filter sCritere
        If oRS.recordCount = 0 then
            oRS.AddNew
                For j = 0 To oRS.Fields.Count - 1
                oRS.Fields(j) = oProdRS.Fields(j).Value
                Next j
            oRS.Update
        end if
        oRS.Filter = adFilterNone
        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
Il faut construire soigneusement la chaîne sCritere, en tenant compte du type de données. Le code ci-dessus n'est pas opérant, c'est une illustration de l'idée.

Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 15h51   #17
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
Donc si je comprends bien, je dois construire une chaîne sCritere en fonction de chacune de mes colonnes, du coup il me lira les fichiers excel à travers ce filtre?
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 15h54   #18
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
Donc ça c'est la solution (si elle fonctionne ^^) au problème de la talbe sans clé primaire.
Je pense que je serais quand même confronté au problème des tables avec clé primaire.
Quelle serait la démarche pour éviter que le programme ne se bloque sur chaque doublon? (j'imagine qu'il doit y avoir une commande ou une fonction qui permet ça?)
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 16h54   #19
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 voila ce que j'ai tapé du coup mais j'ai une erreur :

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
Option Compare Database
 
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, sCritere 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 Sheet3", oConn, adOpenKeyset, adLockOptimistic
'------------------------------------------------------
 
'Boucle sur les classeurs Excel du répertoire cible
Repertoire = "C:\Users\qdeutschle\Desktop\Work\Données\Folder"
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;"""
 
    'requête pour extraire les données de la Feuil1
    oProdRS.Open "SELECT * FROM [Sheet4$]", Cn, adOpenStatic
 
    ' --- Transfert des données dans la base ---
    Do While Not (oProdRS.EOF)
 
        'construction de la chaîne de critères par quelques exemples
            'champ numérique
            'sCritere = "(" & oRS(0).Name & " = " & oProdRS(0).Value & ")"
            'champ texte
            'sCritere = sCritere & " And (" & oRS(1).Name & " = """ & oProdRS(1) & """)"
            'champ date
            'sCritere = sCritere & " And (" & oRS(2).Name & " = #" & Format(oProdRS(2), "mm/dd/yyyy") & "#)"
            'et ainsi de suite...
 
            sCritere = "(" & oRS(0).Name & " = #" & Format(oProdRS(0), "mm/dd/yyyy") & "#)"
            sCritere = sCritere & " And (" & oRS(1).Name & " = """ & oProdRS(1) & """)"
            sCritere = sCritere & " And (" & oRS(2).Name & " = """ & oProdRS(2) & """)"
            sCritere = sCritere & " And (" & oRS(3).Name & " = " & oProdRS(3).Value & ")"
            sCritere = sCritere & " And (" & oRS(4).Name & " = #" & Format(oProdRS(4), "mm/dd/yyyy") & "#)"
            sCritere = sCritere & " And (" & oRS(5).Name & " = """ & oProdRS(5) & """)"
            sCritere = sCritere & " And (" & oRS(6).Name & " = " & oProdRS(6).Value & ")"
            sCritere = sCritere & " And (" & oRS(7).Name & " = " & oProdRS(7).Value & ")"
            sCritere = sCritere & " And (" & oRS(8).Name & " = " & oProdRS(8).Value & ")"
            sCritere = sCritere & " And (" & oRS(9).Name & " = " & oProdRS(9).Value & ")"
            sCritere = sCritere & " And (" & oRS(10).Name & " = " & oProdRS(10).Value & ")"
 
        oRS.Filter sCritere
        If oRS.RecordCount = 0 Then
            oRS.AddNew
                For j = 0 To oRS.Fields.Count - 1
                oRS.Fields(j) = oProdRS.Fields(j).Value
                Next j
            oRS.Update
        End If
        oRS.Filter = adFilterNone
        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
Compile error :
Invalid Use of property.

Il me met le .Filter en surbriance...
Nitromard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 17h33   #20
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Re,

Au temps pour moi, c'est :Je n'ai pas regardé le reste. Si tu as encore une erreur, fait un PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h11.


 
 
 
 
Partenaires

Hébergement Web