Menu

Importer données Excel vers Access par VBA [Fermé]

- - Dernière réponse :  cendo - 13 juil. 2009 à 13:28
Bonjour à tous,

Voila je suis un peu embété.
on m'a demandé de faire un travail sous access et je ne sais pas trop comment m'y prendre
voila j'ai un fichier excel comportant plusieurs colonnes dont deux en particulier (col A et col C) que je veux transferer sous access.
Puis je veux compléter une table Access qui comporte col A et Col B en rajoutant l'information col C.
En gros une sorte de RechercheV adapté a Access.

Je pensais faire ca en code VBA mais je ne trouve pas

Etant débutant en ACCESS si qq pouvait m'envoyer un bout de code VBA, ca m'aiderait bcp...
Afficher la suite 

16 réponses

Meilleure réponse
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
2
Merci
Bonjour Pietrius,
Si l'opération n'a pas vocation à être répétée, il y a une méthode manuelle plutôt simple :
1/ Faire une sauvegarde auparavant pour le cas où ....

- Créer dans la table ACCESS les 2 champs manquants puis réduire la fenêtre ACCESS.
- Faire un copier de la colonne Excel A (Sélection en cliquant dans l'en-tête de colonne)
- Mettre ACCESS en plein écran
- Activer la 1 ère colonne créée (En activant l'en-tête/nom par un clic)
- Puis Clic droit/coller
- Répéter la manip pour la 2 éme colonne


Cordialement

Dire « Merci » 2

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 38839 internautes nous ont dit merci ce mois-ci

1
Merci
Merci pour votre réponse Jean-Jacques

En fait c'est une opération qui sera répétée regulièrement sur un grd nombre de données.

L'idéal serait une macro VBA qui me fasse le rechercheV en allant chercher l'info complémentaire dans la feuille excel
ou si c'est plus facile, une macro qui importe et une deuxième qui fait un rechercheV en allant chercher les infos dans la table importée.

PS: ci dessous un petit exemple de ce que je veux faire.

sous access j'ai une colonne A qui doit me servir d'argument pour le rechercheV() et d'autres colonnes d'information :
col A col B et d'autres colonnes
001 (vide)
002 (vide)
003 ....
004
...

sous Excel j'ai:
col A col B
001 x
003 y
004 y
008 z
0015 x
...


et comme résultat je cherche à faire qq chose sous Access du type:
col A col B ....et d'autres colonnes
001 x
002 (vide)
003 y
004 y
005 (vide)
006 (vide)
007 (vide)
008 z
...
1
Merci
Merci pour votre réponse Jean-Jacques

En fait c'est une opération qui sera répétée regulièrement sur un grd nombre de données.

L'idéal serait une macro VBA qui me fasse le rechercheV en allant chercher l'info complémentaire dans la feuille excel
ou si c'est plus facile, une macro qui importe et une deuxième qui fait un rechercheV en allant chercher les infos dans la table importée.

PS: ci dessous un petit exemple de ce que je veux faire.

sous access j'ai une colonne A qui doit me servir d'argument pour le rechercheV() et d'autres colonnes d'information :
col A col B et d'autres colonnes
001 (vide)
002 (vide)
003 ....
004
...

sous Excel j'ai:
col A col B
001 x
003 y
004 y
008 z
0015 x
...


et comme résultat je cherche à faire qq chose sous Access du type:
col A col B ....et d'autres colonnes
001 x
002 (vide)
003 y
004 y
005 (vide)
006 (vide)
007 (vide)
008 z
...
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
1
Merci
Pietrius,

Si la base de données ACCESS et le fichier Excel sont sur le même serveur/ordinateur, il serait bien plus simple d'utiliser le fichier EXCEL comme table attachée. Est-ce le cas ?
L'avantage : La base ACCESS est alors mise à jour dynamiquement. C.à.d. : toute modification dans Excel est aussitôt connue dans la base ACCESS liée.

A+
s'lut , j'ai un problème av la procedure archive , c-a-d je veux couper les donneés d'une table et les coller dans une autre , mais chaque fois que je clic sur mon bouton archiver qui exécute cette procédure un message de débloquage s'affiche signalant l'erreur sur le code Movefirst, voir la procedure que j'ai effectué

Dim enr As Recordset
Set enr = CurrentDb.OpenRecordset("T_saisie")

Set TabArch = CurrentDb.OpenRecordset("T_Archive_operation", dbOpenDynaset)

TabArch.MoveLast
TabArch.AddNew


TabArch![site_theorique] = Forms("form_Interface_gestion_des_optimisations").[site théorique].Value
TabArch![Type_d_operation_ utilisateur] = Me.[Type d'opération utilisateur].Value
TabArch![Poin_d_entree_BRA_futur] = Me.[Point d'entrée BRA futur].Value
TabArch![XC] = Me.XC.Value
TabArch![GCR] = Me.GCR.Value
TabArch![Semaine_de_planification] = Me.[Semaine de planification].Value
TabArch![Nbres_de_Planification] = Me.[Nbres de Planification].Value
TabArch![DRU] = Me.DRU.Value
TabArch![Date DRU] = Me.[Date DRU].Value
TabArch![Gaston] = Me.Gaston.Value
TabArch![Date_Gaston] = Me.[Date Gaston].Value
TabArch![Num_demande_Gaston] = Me.[Num_demande_Gaston].Value
TabArch![Memo_CPT] = Me.[Memo CPT].Value
TabArch![Date_Memo_CPT] = Me.[Date Memo CPT].Value
TabArch![BCM] = Me.BCM.Value
TabArch![Date_BCM] = Me.[Date BCM].Value
TabArch![Liberation_IP] = Me.[Liberation @IP].Value
TabArch![MAJ_Ping] = Me.[MAJ Ping].Value
TabArch![Commentaires] = Me.Commentaires.Value
TabArch![RNC_ actuel] = Me.[RNC actuel].Value
TabArch![RNC_ futur] = Me.[RNC futur].Value
TabArch![Nbres_de_Mic] = Me.[Nbres de Mic].Value
TabArch![déjarretiérage] = Me.[déjarretiérage].Value
TabArch![Programme_upgrade] = Me.[Programme_upgrade].Value


'Mise à jour et fermeture de la table T_archive
TabArch.Update
TabArch.Close
Set TabArch = Nothing

'supprime l'enregistrement en cours dans la table T_saisi
enr.Delete


Set enr = Nothing

enr.Movefirst



End Sub
1
Merci
OUi les deux fichiers sont sur le meme ordinateur.
Le fichier excel est mis a jour regulièrement et à chaque fois il faut completer la table Access avec les informations du fichier Excel

Que voulez vous dire par "table attaché" ?
Cela reveindrai a automatiquement mettre a jour une table sous ACCESS correpondant au fichier Excel ?
Mais ensuite comment faire un rechercheV entre les deux tables pour completer la premiere ?

Merci encore
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
1
Merci
Pietrius,

C'est de bon augure, mais il y a une contrainte incontournable.
Il faut que la table ACCESS et le fichier EXCEL aient un champ commun.
C.à.d. : "N° de commande" par exemple.

Si cest bon faire : Fichier/Données externes/lier les tables ..... ensuite c'est en pas à pas assez bien fait ..


A+
Bonjour Jean Jacque

je travaille toujours sur le meme projet et la je tente de le faire par une macro en automation
j'ai le bout de code suivant:

***********************
Private Sub Commande0_Click()
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("C:\Interventions\création.xls")
Set oWSht = oWkb.Worksheets("Tableau réseau BPS")
'premier ligne ou tu commence ton import
i = 2

'pour éviter les messages lors de l'ajout des enregistrements
DoCmd.SetWarnings False

'tant que la cellule n'est pas vide
While oWSht.Range("A" & i).Value <> ""

cSQL = "insert into [Nom de ta table] ( [NOM du champ de ta table] ) values (" &
Chr (34) & oWSht.Cells(i, 1) & Chr(34) & ")"

'exécute la requète
DoCmd.RunSQL cSQL


i = i + 1
Wend

DoCmd.SetWarnings True
End Sub
**********************


Mais qd je l'execute il me sort une erreur : type non defini par l'utilisateur
sais tu d'ou peut provenir cette erreur ?
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
1
Merci
Pietrus,

Je ne suis pas suffisamment expérimenté pour pouvoir vous aider
sur un point aussi spécifique .....

Un spécialiste ne devrait pas tarder à se manifester ....sur CCM on attend rarement en vain.

Toutefois, il est étrange que nom de la table soit <nom de la table> et nom du champ <Nom du champ de la table> ?????


Votre code ---> [Nom de ta table] ( [NOM du champ de ta table]


Cordialement
1
Merci
Bonjour Jean_jacques
Encore uen fois merci pour tes réponses rapides
Le bout de code copié ci dessous est un code type et il faut remplacer les champs Nom de Table par le nom de la table destination...etc
j'ai finalement reussi a faire fonctionner ma macro
Sais tu comment l'accrocher a un bouton sur un formulaire Access ?
etrangement je ne dois pas avoir la bonne demarche alors que je le fais regulierement sur Excel

Merci d'avance
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
1
Merci
Bonjour Pietrus,

NB : En accès on dit une procédure quand on utilise le code.

Pour créer la procédure événementielle sur clic, suivre la démarche suivante :
Ouvrir le formulaire qui contient le bouton
Se mettre en mode création
Sélectionner le bouton
Activer l'onglet Évènements
Se positionner sur la ligne sur clic
Grâce au petit bouton avec 3 petits points en bout de ligne, choisir procédure évènementielle
L'affichage suivant apparaît :

Private ... machin chose (début de procédure)

Saisir le code Ici ..... entre private et en end sub

En sub (Fin de procédure)

Fermer enregistrer et essayer

Bonne journée

1
Merci
Merci Jean Jacques

tout marche maintenant.
Petite question complementaire:
je ne trouve pas sur le forum le code pour supprimer un enregistrement d'une table access

je voudrai rajouter dans mon code une petite fonction avec des conditions IF qui supprimerait certains des enregistrements.

Merci d'avance
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
1
Merci
Bonjour Pietrus,

Attention danger
1 - En premier lieu, ne pas négliger de prendre des précautions. Faire des sauvegardes régulières, etc.

2 - A titre d'exemple, voici une syntaxe SQL qui permet de supprimer les enregistrements "âgés de plus d'un an"
- [La valeur contenue dans le [champ_date] est comparée à la valeur de la date en cours (now).
- Si l'écart (exprimé en nombre de jours) est supérieur à 365, les enregistrements concernés sont supprimés.


DoCmd.RunSQL "DELETE all FROM [<Table>] WHERE (((DateDiff('d',[<Champ_date>],Now()))>365));"

Cordialement
Merci Jean-jacques,

Cette commande marche bien
j'arrive effectivement a supprimer des enregistrements
Cependant je dois supprimer selon une condition un peu plus complexe

mes données dans ma table sont sous la forme:
colA colB
x 11
x 22
x 33
y 22
b 11
b 33
...

j'aimerai rajouter une fction qui me fasse un tri du type:
si on a (x ; 11) ,( x ; 22)et (x ; 33) (comme ci dessus) je veux lui dire de ne laisser que la ligne (x ; 11). car 11>22 et 11>33 par exemple.
En gros il me faudrait une boucle for poru parcourir toute ma table
et a chaque ligne jobserve:
Si la données colA de la logne i+1 est identique
Si c'est le cas alors si ds col B on a 11 à i et 22 à i+1 => on conserve celui avec 11 donc on supprime la ligne i+1

etc etc
j'ai 4 types d'information dans col B
classé ds un ordre du type 11>22>33>44

une idée ??
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
1
Merci
Bonsoir Pietrus,
Il est inutile de balayer chaque enregistrement de la table pour supprimer des enregistrement.
Chaque condition IF s'applique à l'ensembe de la table

Dans ton cas il faut faire quelque chose comme :
If <Nom=Champ_1> = 1 And <Nom=Champ_2> = "< >" Then


Voilà un exemple de squelette de condition IF
A toi de jouer pour l'adapter


If <Nom=Champ> = 1 And ((PrixUnitaire * Quantité) / 100 * 0.7) < 9.9 Then

Action SQL
End If

ElseIf <Nom=Champ> = 2 And ((PrixUnitaire * Quantité) / 100 * 0.7) < 9.9 Then
Action SQL

End If

ElseIf <Nom=Champ> = 1 And ((PrixUnitaire * Quantité) / 100 * 0.7) >= 9.9 Then
Action SQL
End If

ElseIf <Nom=Champ> = 2 And ((PrixUnitaire * Quantité) / 100 * 0.7) > 9.9 Then
Action SQL
End If
End If


Bonne soirée
Bonjour Jean Jacques

Je vais essayer en utilisant ton modèle
Je le découvre à l'instant
merci pour tes réponses

A plus tard
Bonjour Jean-Jacques

Et merci pour ton aide précieuse

Cependant je ne suis pas sur de comprendre comment utiliser ton code type

Comment interpreter cette ligne ?:
If <Nom=Champ_1> = 1 And <Nom=Champ_2> = "< >" Then 


que represente Nom=Champ_1 ? et le ="<>" ?

Ces questions doivent surement paraitre naive mais bon ca donne idée de mon niveau Access .
lol

Merci d'avance
Pour plus de précision sur mon code:

dans ma tablecible j'ai :
du numerique en colonne A et du texte en colonne B

soit un enregistrement a nimporte quel ligne si on trouve un autre enregistrement avec la meme
informartion en colonne A alors on doit supprimer un des deux enregistrements en fonction de le colonne B.

En fait j'ai du mal a visualiser comment lui dire d'aller chercher un autre enregistrement a une autre ligne.

comment lui dire de chercher ailleurs ?

j'ai du mal a etre clair.dsl

merci d'avance pour ton aide

Bonne journée
Bonjour Jean Jacques

Et merci pour ton aide

Cependant je ne suis pas sur de comprendre comment utiliser ton code type

Comment interpreter cette ligne ?:
If <Nom=Champ_1> = 1 And <Nom=Champ_2> = "< >" Then 


que represente Nom=Champ_1 ? et le ="<>" ?

Ces questions doivent surement paraitre naive mais bon ca donne idée de mon niveau Access .
lol

Merci d'avance
Pour plus de précision sur mon code:

dans ma tablecible j'ai :
du numerique en colonne A et du texte en colonne B

soit un enregistrement a nimporte quel ligne si on trouve un autre enregistrement avec la meme
informartion en colonne A alors on doit supprimer un des deux enregistrements en fonction de le colonne B.

En fait j'ai du mal a visualiser comment lui dire d'aller chercher un autre enregistrement a une autre ligne.

comment lui dire de chercher ailleurs ?

j'ai du mal a etre clair.dsl

merci d'avance pour ton aide

Bonne journée
1
Merci
Bonjour Jean Jacques

Et merci pour ton aide

Cependant je ne suis pas sur de comprendre comment utiliser ton code type

Comment interpreter cette ligne ?:
If <Nom=Champ_1> = 1 And <Nom=Champ_2> = "< >" Then 


que represente Nom=Champ_1 ? et le ="<>" ?

Ces questions doivent surement paraitre naive mais bon ca donne idée de mon niveau Access .
lol

Merci d'avance
Pour plus de précision sur mon code:

dans ma tablecible j'ai :
du numerique en colonne A et du texte en colonne B

soit un enregistrement a nimporte quel ligne si on trouve un autre enregistrement avec la meme
informartion en colonne A alors on doit supprimer un des deux enregistrements en fonction de le colonne B.

En fait j'ai du mal a visualiser comment lui dire d'aller chercher un autre enregistrement a une autre ligne.

comment lui dire de chercher ailleurs ?

j'ai du mal a etre clair.dsl

merci d'avance pour ton aide

Bonne journée
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
1
Merci
Bonjour Pietrus,

L'exemple donné n'a rien à voir avec ton cas.

If <Nom_Champ_1> = 1 And <Nom_Champ_2> = "< >" Then

....
endif

Mon but :
Montrer que la condition peut être activée sur une valeur numérique aussi bien que sur la valeur d'une chaîne de caractère.

NB : Voir aussi SKIP pour comparer des lignes


Bonne journée
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
0
Merci
Pietrus,

Mea culpa, j'ai été négligent dans la lecture de ta description. Il faut bien un balayage de la base associé avec une boucle comprenant des if . Il est vrai que ta démarche est insolite ..

Et il faut bien dire que j'ai franchi mon seuil de compétence. Je n'arrive plus à suivre.

Je te suggère de compulser le site de référence : http://vb.developpez.com/vbsources/

- Tout de même, je verrais bien quelque chose de ce genre :

While IsnotNull(Me![<Nom_champ>])
IF ... then

then
skip
end if

Wend
Beaucoup de mal a m'en sortir avec cette fonction

bref j'en viens au point ou je me dis qu'il faut avt tt que je presente rapidement un programme qui fonctionne

Ainsi j'ai une autre question:

sais tu si je peux faire ce que je souhaite (mon tri sur mon tableau avec la suppression de certaines lignes) peut-etre plus facilement sans passer par VBA ???

Je ne maitrise pas vraiment access

Merci d'avance

p-e faire une requete pour créer une nouvelle table...
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
134
0
Merci
Pietrus,

Désolé, je ne sais pas faire. Surtout à distance et sans voir l'écran.

L'idéal serait d'avoir un analyste sous la main. Quelqu'un capable de faire
le cahier des charges de tes besoins, de les décrire et de déceler les incohérences et
contradiction éventuelles.
Avec une bonne analyse de la structure le travail de codage est énormément facilité.

Concrètement, je te suggère de découper ton travail en étapes successives.
De cette manière tu progresserais tout en faisant avancer ton projet, tout
en faisant valoir des améliorations.

A+