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 22/11/2010, 18h51   #1
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 0
Points : 0
Par défaut Importer fichier Excel dans Access avec contrôle sur champ numérique

Bonjour à tous,

Avant toute chose, je m'excuse si ma question est triviale (je suis débutant). Voilà mon problème:

- je dispose d'une base de donnée Access avec une table ayant les colonnes 1- Clef primaire "ID" / 2- Champs texte "Nom" / 3- Champs numérique "Nº de série"

- je dispose d'un fichier Excel possédant 2 champs 1- Champs texte "Nom" / 2- Champs texte "Nº de série"

- je souhaite importer le fichier Excel dans ma table Access avec les règles de gestion suivantes. 1) rejeter les lignes dont le contenu du nº de série est déjà dans l'Access 2) créer les autres lignes (avec génération automatique de la clef primaire par Access)


Pouvez vous me confirmer avant tout de chose que c'est possible? Et si quelqu'un a le courage de m'expliquer...


Merci beaucoup!
chumo2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 21h36   #2
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
Bonsoir,
C'est possible en 2 temps
1) Importer les données de la feuille Excel dans une table ou lier la feuille Excel
2) Créer une requête Ajout qui doit ressembler à ça
Code :
1
2
 
INSERT INTO Table1 ( nom, ID ) SELECT Feuil1.nom, Feuil1.ID FROM Feuil1 LEFT JOIN Table1 ON Feuil1.nom = Table1.nom WHERE (((Table1.nom) Is Null));
helas est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/11/2010, 21h38   #3
Modérateur
 
Homme René MAROT
Inscription : octobre 2005
Messages : 5 443
Détails du profil
Informations personnelles :
Nom : Homme René MAROT
Localisation : Canada

Informations forums :
Inscription : octobre 2005
Messages : 5 443
Points : 7 514
Points : 7 514
Oui c'est possible, ce qui m'intrigue dans ta question c'est le
Citation:
(avec génération automatique de la clef primaire par Access)
Souhaites-tu
  1. que Access donne un numéro de série ou
  2. qu'il récupère celui que tu lui donnes lors de l'importation.

Si c'est 2) comme je le pense, le plus simple est de définir ta table et d'indiquer que le numéro de série est la clef primaire de ta table. (En mode design, choisir le champ NoSerie et appuyer sur l'icône clef).

Une clef primaire est TOUJOURS unique donc si tu essayes de mettre 2 fois le même numéro de série Access va rejeter ton energistrement. Il te suffira d'ignorer les erreurs et tu auras une table 'propre'.

Si c'est 1), cela va être un peu plus complex.

A+
__________________
Vous voulez une réponse rapide et efficace à vos questions téchniques ? Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
marot_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 08h35   #4
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 0
Points : 0
Bonjour. Avant tout, merci pour vos premières réponses.

En fait ce n'est ni 1) ni 2). Dans ma base Access, j'ai 3 champs:
- une clef primaire gérée par Access (qui s'incrémente automatiquement lorsque je crée une nouvelle entrée dans ma base)
- un champ Nom (description du produit)
- un champ Nº de série qui n'est pas une clef. De fait, il n'est pas unique dans ma table access (je peux avoir un même nº de série sur plusieurs entrées).

L'Excel comporte 2 colonnes: le nº de série et un nom. Je souhaite qu'à l'import le contrôle soit fait entre le champ nº de série de l'Excel et nº de série de l'Access (qui n'est pas une clef). C'est jouable?
chumo2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 10h10   #5
Membre régulier
 
Inscription : juillet 2010
Messages : 230
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 230
Points : 82
Points : 82
Bonjour chumo,

J'ai également eu besoin d'importer des données d'excel vers access. et je devais respecter l'ordre des colonnes...

Je vais te donner mon code qui permet d'importer facilement tes données.


tu peux également aller voir sur ce post : ICI


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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Private Sub LeNomDUBoutonCmd_Click()
 
Dim oApp As Excel.Application
Dim oWkb As Excel.Workbook
Dim oWSht As Excel.Worksheet
Dim i As Long, strTrc As String
Dim db As DAO.Database, rsDest As DAO.Recordset
Dim fDlg As Office.FileDialog, strFichier As String
 
On Error GoTo ErrH:
 
' --------------------------
' Selection du fichier Excel
' --------------------------
Set fDlg = Application.FileDialog(msoFileDialogOpen)
' Définition du ou des filtres
fDlg.Filters.Clear
fDlg.Filters.Add "Fichier Excel", "*.xl*"
' Dossier de départ
fDlg.InitialFileName = CurrentProject.Path
' Type d'affichage
fDlg.InitialView = msoFileDialogViewList
If fDlg.Show Then
   strFichier = fDlg.SelectedItems(1)
End If
Set fDlg = Nothing
' Si l'utilisateur a cliqué sur Annuler quitter la procédure
If Len(strFichier) = 0 Then Exit Sub
 
 On Error GoTo ErrH:
' --------------------------
' Ouverture du fichier Excel
' --------------------------
Set oApp = CreateObject("excel.application")
Set oWkb = oApp.Workbooks.Open(strFichier)   'Fichier sélectionné par l'utilisateur
Set oWSht = oWkb.Worksheets("Feuil1") 'mettre ici le nom de la feuille excel qui contient les données à importer
 
' On ouvre un recordset sur la table dans laquelle on veut
' ajouter des enregistrements
Set db = CurrentDb
Set rsDest = db.OpenRecordset("T_ImportExcel", dbOpenDynaset)
 
'première ligne ou commence l'import 
'(ligne 2 car les titres des colonnes se trouvent sur la ligne 1 dans mon cas)
i = 2
 
'Tant que la colonne 1 (A) n'est pas vide
While Len(oWSht.Cells(i, 1).Text) > 0
 
    'condition de remplissage de la table => eviter les doublons
    'si l'enregistrement existe déjà dans la table destination,
    'on passe à la ligne suivante sans l'importer 
    '(Dans ce cas : Ma table de destination ([T_import excel] et  le champ [N° de DOSSIER] ) 
   'si la donnée de la la colonne 7 de mon fichier excel est en doublon 
   ' avec le champ de ma table alors pas d'importation de l'enregistrement
    If DCount("*", "[T_ImportExcel]", "[N° de DOSSIER] = " & oWSht.Cells(i, 7)) = 0 Then
 
 
    'le numéro 1 correspond au numéro de la colonne source, tel que : A=1, B=2, C=3 ...
       rsDest.AddNew
       strTrc = "Champ [Nom]" ' <-- champ de ta table
         rsDest("NOM") = oWSht.Cells(i, 1) '<--Nom de la colonne dans excel
 
       strTrc = "Champ [NUMERO dossier]"
         rsDest("DOSSIERNum") = oWSht.Cells(i, 2)
 
'tu répètes ces 2 lignes ci dessus au temps de fois que tu as de colonnes à importer (dans cet exemple j'importe la colonne 1 et 2)
 
       strTrc = "Sauver Nouvel Enregistrement"
       rsDest.Update
    End If
    strTrc = ""
    'on incrémente la variable i pour passer à la ligne suivante
    i = i + 1
Wend
 
Sortie:
Set oWSht = Nothing
If Not (oWkb Is Nothing) Then oWkb.Close False
Set oWkb = Nothing
If Not (oApp Is Nothing) Then oApp.Quit
Set oApp = Nothing
If Not (rsDest Is Nothing) Then rsDest.Close
Exit Sub
DoCmd.OpenQuery "requetajout"
ErrH:
Select Case Err.Number
    Case 3022 ' Risque de doublon - Violation Clé/Index unique
         ' on annule l'ajout et on continue
         rsDest.CancelUpdate
         Resume Next
    ' Erreur ignorées. Pour les prendre en compte, mettre en commentaire
    ' l'instruction Resume Next
    Case 3163 ' Le champ est trop petit pour accepter la quantité de données que vous voulez ajouter
         Resume Next
    Case 3349 ' Dépassement de capacité sur un champ numérique
         Resume Next
    Case 3421 ' Erreur de conversion de type
         Resume Next
    Case 3075
         Resume Next
End Select
 
MsgBox "Erreur No. " & Err.Number & " : " & Err.Description, , _
       "Ligne " & i & ". " & strTrc
Resume Sortie
 
End Sub
en espérant t'aider

cordialement
Chagui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 12h36   #6
Invité de passage
 
Inscription : novembre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 3
Points : 0
Points : 0
Genial. Je teste tout ça et vous tien au courant. Merci!!
chumo2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h00.


 
 
 
 
Partenaires

Hébergement Web