Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, faq, codes sources, astuces pour VBA
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 19/06/2007, 14h56   #1
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Par défaut [Sources] [VBA] Importation sélective Excel -> Access sans doublons

Bonjour à tous !

Alors, ce code résume la discussion que j'ai eu avec totofe et présente les dernières avancées auxquelles nous sommes arrivés, grâce à son entière contribution.
Vu que c'est un thème assez abordé et que l'importation Excel -> Access est souvent utilisée, j'ai pensé que proposer ce code dans les sources pourrait aider pas mal de développeurs en herbe .

Le code permet de copier les plages de cellules voulues d'un fichier Excel vers les champs voulus d'une table Access, en évitant le doublons.

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
Private Sub Commande1_Click()
'Ici l'importation se déclenche en cliquant sur le bouton "Commande1"
'mais on peut aussi mettre ce code à l'ouverture d'un formulaire
Dim oApp As Excel.Application
Dim oWkb As Excel.Workbook
Dim oWSht As Excel.Worksheet
 
Set oApp = CreateObject("excel.application")
Set oWkb = oApp.Workbooks.Open("chemin_du_fichier_xls") 'mettez ici le chemin vers votre fichier Excel
Set oWSht = oWkb.Worksheets("nom_de_la_feuille_concernée_par_limportation") 'mettez ici le nom de la feuille qui contient les données à importer
 
'première ligne ou commence l'import
i = 11
 
'pour éviter les messages lors de l'ajout des enregistrements
DoCmd.SetWarnings False
 
'tant qu'on n'est pas arrivés à la ligne 600 du tableur
While i < 600
'on peut aussi arrêter l'importation lorsque le programme rencontre une case
'vide en remplaçant la ligne du While par :
'While oWSht.Range("I" & i).Value <> "" '(où I représente la colonne et i la ligne)
 
'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
If DCount("*", "[nom_da_la_table_destination]", "[nom_du_champ_destination_qui_ne_doit_pas_avoir_de_doublons] LIKE '" & oWSht.Cells(i, 9) & "'") = 0 Then
'le numéro 9 correspond au numéro de la colonne source, tel que : A=1, B=2, C=3 ...
 
'requète SQL (avec en paramètre la ligne i et le numéro de la colonne comme précisé au-dessus)
cSQL = "insert into [table_destination] ( [champ1], [champ2] ) values (" & Chr(34) & oWSht.Cells(i, 13) & Chr(34) & ", " & Chr(34) & oWSht.Cells(i, 11) & Chr(34) & ");"
'ici, on ne prend que les colonnes M (=13) et K (=11).
 
'exécute la requète
DoCmd.RunSQL cSQL
 
End If
 
'on incrémente la variable i pour passer à la ligne suivante
i = i + 1
 
Wend
 
'on réactive les messages d'erreurs
DoCmd.SetWarnings True
Set oWSht = Nothing
Set oWbk = Nothing
Set oApp = Nothing
End Sub
Bon, tous les commentaires ne sont là que pour la compréhension du code, mais si vous aviez toutefois des questions, n'hésitez pas
azertix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/06/2007, 15h56   #2
Rédacteur
 
Avatar de Lou Pitchoun
 
Christophe Lessirard
Inscription : février 2005
Messages : 5 029
Détails du profil
Informations personnelles :
Nom : Christophe Lessirard
Âge : 33
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2005
Messages : 5 029
Points : 6 000
Points : 6 000
Envoyer un message via MSN à Lou Pitchoun
Salut,

Si tu mets
Code :
DoCmd.SetWarnings False
il faut à la fin remettre
Mais il y a peut être plus simple pour importer une partie des données Excel vers Access
__________________

Access : Les Cours, Les Sources et Les FAQs Office
Avant de poster : les choses importantes à lire pour la bonne tenue du forum.
sinon

Ma boite à MPs n'est pas l'annexe du forum Le complément BouleDeCristal n'existe pas encore !!!
Lou Pitchoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2008, 14h34   #3
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Citation:
Envoyé par Lou Pitchoun Voir le message
Salut,

Si tu mets
Code :
DoCmd.SetWarnings False
il faut à la fin remettre
Message édité !
J'avais oublié le End Sub, aussi
azertix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2008, 16h13   #4
Invité de passage
 
Inscription : mai 2008
Messages : 1
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 1
Points : 1
Points : 1
Désolé d'arriver si tard mais estce que le bouton se place dans le fichier excel ??
boubouch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2008, 09h56   #5
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Non, personnellement, je l'ai placé sur un formulaire sous Access
__________________
Si ma réponse vous a été utile pensez à voter Pour

Avant de poster sur le forum Access :
FAQ > SOURCES > COURS > FORUM > GOOGLE
Pas de question par MP ou je mords

azertix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 09h59   #6
Invité régulier
 
Inscription : mai 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 16
Points : 8
Points : 8
Bonjour. Désolé de déterrer ce post mais comme il m'a servi pour un projet, je tiens à faire part d'une remarque, tout fonctionne correctement mais ne serait-il pas judicieux de libérer la mémoire utilisée par les variables objet à la fin de la fonction?
Code :
1
2
3
Set oWSht = Nothing
Set oWbk = Nothing
Set oApp = Nothing
shuggy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 10h37   #7
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Citation:
Envoyé par shuggy Voir le message
Bonjour. Désolé de déterrer ce post mais comme il m'a servi pour un projet, je tiens à faire part d'une remarque, tout fonctionne correctement mais ne serait-il pas judicieux de libérer la mémoire utilisée par les variables objet à la fin de la fonction?
Code :
1
2
3
Set oWSht = Nothing
Set oWbk = Nothing
Set oApp = Nothing
En effet. J'étais tout jeune développeur à l'époque de ce code, je faisais ça crado

Par contre il semblerait que l'on ne puisse pas éditer un message trop ancien ?
__________________
Si ma réponse vous a été utile pensez à voter Pour

Avant de poster sur le forum Access :
FAQ > SOURCES > COURS > FORUM > GOOGLE
Pas de question par MP ou je mords

azertix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 16h28   #8
Responsable
Office & Excel

 
Avatar de Pierre Fauconnier
 
Homme Pierre Fauconnier
Formateur et développeur informatique indépendant
Inscription : novembre 2003
Messages : 8 200
Détails du profil
Informations personnelles :
Nom : Homme Pierre Fauconnier
Âge : 45
Localisation : Belgique

Informations professionnelles :
Activité : Formateur et développeur informatique indépendant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 8 200
Points : 14 403
Points : 14 403
Envoyer un message via Skype™ à Pierre Fauconnier
Salut.

Il serait peut-être judicieux de rédiger le code de façon à le rendre générique. En gros, il faudrait retirer les variables "externes" (chemin du fichier, plages, etc...) et les passer en paramètres.

Cela permet une réutilisation aisée du code, sans devoir se poser la question de savoir où on la place (Excel ou Access, déclenchement par bouton ou "en direct", etc)...
__________________
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------

Ma nouvelle vidéo: comparer des listes via une MFC - Mes articles sur DVP
Vous souhaitez rédiger pour DVP? Contactez-moi
Amoureux de la langue française? Venez corriger nos ressources
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
N'oubliez pas de VOTER (en bas à droite d'un message)

---------------
Pierre Fauconnier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 16h11   #9
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Citation:
Envoyé par Pierre Fauconnier Voir le message
Salut.

Il serait peut-être judicieux de rédiger le code de façon à le rendre générique. En gros, il faudrait retirer les variables "externes" (chemin du fichier, plages, etc...) et les passer en paramètres.

Cela permet une réutilisation aisée du code, sans devoir se poser la question de savoir où on la place (Excel ou Access, déclenchement par bouton ou "en direct", etc)...
Bonjour Pierre.
Le problème c'est qu'on ne peut pas entièrement rendre ce code "générique" puisque qu'il s'agit d'une importation sélective.
Il y aura dans tous les cas des modifications à faire dans le code.
De plus, bien que le découpage d'un projet en sous-procédures et fonctions soit la bonne méthode de coder, je crains qu'un débutant ne soit pas familier avec leur utilisation (appel, arguments, retour...).

À toutes fins utiles, voici ce que je peux fournir rapidement :
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
Function ImportXL(xlPath As String, wsName As String, startRow As Integer, pKeyCol As String, acTable As String, pKey As String) As Boolean
'-> La fonction renvoie vrai si l'import réussit et faux dans le cas contraire
'xlPath : chemin du fichier Excel
'wsName : nom de la feuille Excel qui contient les données à importer
'startRow : ligne du fichier Excel où commence l'import
'pKeyCol : colonne du fichier Excel qui est la clé primaire de la table Access
'acTable : table Access qui reçoit les données
'pKey : nom du champ "identifiant"
 
    'active la routine de gestion d'erreur.
    On Error GoTo erreur
 
    'déclaration des variables
    Dim app As Excel.Application
    Dim wkb As Excel.Workbook
    Dim wks As Excel.Worksheet
 
    'initialisation des variables
    Set app = New Excel.Application
    Set wkb = app.Workbooks.Open(xlPath)
    Set wks = wkb.Worksheets(wsName)
 
    Dim i As Integer, cSQL As String
    i = startRow
 
    'pour éviter les messages lors de l'ajout des enregistrements
    DoCmd.SetWarnings False
 
    With wks
        'arrêter l'importation lorsque l'on rencontre une case vide
        While .Range(pKeyCol & i).Value <> "" '(où pKeyCol représente la colonne et i la ligne)
 
            '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
            If DCount("*", acTable, pKey & " LIKE '" & .Range(pKeyCol & i).Value & "'") = 0 Then
 
                'requête SQL (ajouter autant de champs que nécessaire)
                cSQL = "INSERT INTO " & acTable & " ( [champ1], [champ2] ) VALUES (" & Chr(34) & .Range("E" & i) & Chr(34) & ", " & Chr(34) & .Range("G" & i) & Chr(34) & ");"
                'exemple avec les colonnes E et G
 
                'exécute la requète
                DoCmd.RunSQL cSQL
 
            End If
 
            'on incrémente la variable i pour passer à la ligne suivante
            i = i + 1
        Wend
 
    End With
 
    'on réactive les messages d'erreurs
    DoCmd.SetWarnings True
 
    'libération variables
    Set wks = Nothing
    Set wkb = Nothing
    Set app = Nothing
 
    MsgBox "Import du fichier Excel réussi.", vbInformation + vbOKOnly, "Opération terminée..."
 
    ImportXL = True
    Exit Function
 
erreur:    ' Routine de gestion d'erreur.
    MsgBox "Erreur: " & Err.Number & vbCrLf & Err.Description, vbOKOnly + vbInformation
    ImportXL = False
End Function
J'ai abondement commenté et ai ajouté un gestionnaire d'erreur.
Le code a été correctement compilé mais il n'a pas été testé.
__________________
Si ma réponse vous a été utile pensez à voter Pour

Avant de poster sur le forum Access :
FAQ > SOURCES > COURS > FORUM > GOOGLE
Pas de question par MP ou je mords

azertix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 14h56   #10
Invité de passage
 
Inscription : mai 2009
Messages : 5
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 5
Points : 3
Points : 3
Bonjour,
j'ai repiqué et adapté ce code, qui est très utile, par contre je rencontrais une erreur de type "définie par l'application..",
Je ne sais pas si c'est moi qui est mal ré-adapté mais en passant la variable Pkeycol en string, et en la definissant par sa lettre de colonne, ça passe...
A noter que mon stlyle de référence sous Excel n'est pas définie en L1C1, peut être cela venait de cela, je n'ai pas testé...Slts
princeflorizel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 09h49   #11
Membre émérite
 
Avatar de azertix
 
Homme Lanza Bertucci-Domergue
Développeur informatique
Inscription : juin 2007
Messages : 937
Détails du profil
Informations personnelles :
Nom : Homme Lanza Bertucci-Domergue
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : juin 2007
Messages : 937
Points : 995
Points : 995
Citation:
Envoyé par princeflorizel Voir le message
Bonjour,
j'ai repiqué et adapté ce code, qui est très utile, par contre je rencontrais une erreur de type "définie par l'application..",
Je ne sais pas si c'est moi qui est mal ré-adapté mais en passant la variable Pkeycol en string, et en la definissant par sa lettre de colonne, ça passe...
A noter que mon stlyle de référence sous Excel n'est pas définie en L1C1, peut être cela venait de cela, je n'ai pas testé...Slts
Il faut effectivement mettre cette variable en string au lieu d'integer.
Je viens de demander la modification.
Merci de l'avoir signalé

Edit : C'est bon, modif faite par Pierre Fauconnier.
__________________
Si ma réponse vous a été utile pensez à voter Pour

Avant de poster sur le forum Access :
FAQ > SOURCES > COURS > FORUM > GOOGLE
Pas de question par MP ou je mords

azertix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/01/2012, 15h50   #12
Membre du Club
 
Homme
Channel Support Coordinator
Inscription : avril 2011
Messages : 94
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 35
Localisation : Algérie

Informations professionnelles :
Activité : Channel Support Coordinator
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : avril 2011
Messages : 94
Points : 40
Points : 40
Envoyer un message via MSN à lakhdar16
bonjour,

cette discussion est très intéressante pour moi, ce code m'a beaucoup aidé à réaliser ce que je veux.

juste une petite question:

dans mon cas le code sert à importer des données de type numérique, texte, date et booléen dans ma base de données (dorsale/frontale), si le client fait une erreur de saisie dans le fichier Excel par exemple: il met une valeur de type texte au lieu de type numérique, ou il saisi une valeur avec un autre format, comment puis-je éviter l'erreur lors de l'importation en cas de erreur de saisie et convertir les format en cas de format différente dans le fichier Excel?

J'espère que j'été claire dans ma question.

merci à vous.
lakhdar16 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2012, 20h04   #13
Membre du Club
 
Homme
Channel Support Coordinator
Inscription : avril 2011
Messages : 94
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 35
Localisation : Algérie

Informations professionnelles :
Activité : Channel Support Coordinator
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : avril 2011
Messages : 94
Points : 40
Points : 40
Envoyer un message via MSN à lakhdar16
Bonsoir,

peut-on associer un progressBar avec cette fonction?

merci.
lakhdar16 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 22h17.


 
 
 
 
Partenaires

Hébergement Web