Importer données Excel vers Access par VBA

Pietrus -  
 cendo -
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...
Configuration: Windows 2000
Internet Explorer 6.0

16 réponses

  1. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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
    2
  2. Pietrus
     
    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
  3. Pietrus
     
    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
  4. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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+
    1
    1. cendo
       
      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
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Pietrus
     
    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
    1
  7. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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+
    1
    1. Pietrus
       
      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 ?
      0
  8. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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
  9. Pietrus
     
    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
    1
  10. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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
  11. Pietrus
     
    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
    1
  12. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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
    1
    1. Pietrus
       
      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 ??
      0
  13. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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
    1
    1. Pietrus
       
      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
      0
    2. Pietrus
       
      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
      0
    3. Pietrus
       
      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
      0
  14. Pietrus
     
    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
  15. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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
    1
  16. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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 : https://vb.developpez.com/telecharger/index/categorie/353/Codes-sources-VB-VBS

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

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

    then
    skip
    end if

    Wend
    0
    1. Pietrus
       
      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...
      0
  17. Jean_Jacques Messages postés 1045 Date d'inscription   Statut Membre Dernière intervention   112
     
    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+
    0