Mises à jour réciproques BDD Excel<-->Acces

Itu -  
 Itu -
Bonjour Bonjour,

Je viens vous demander d'éclairer ma lanterne déffectueuse...

Je suis en stage informatique dans une entreprise.
Dans cette entreprise chaque employé dispose d'une feuille Excel sur le serveur local contenant ses clients, à celà s'ajoute une feuille commune ou toutes les adresses sont stockées après être saisies par chacun d'entre eux (d'abord sur leur feuille perso, puis celle-ci).

J'essaye de tout automatiser, dans le sens ou après avoir saisi son client dans sa feuille Excel, soit automatiquement ajoutée l'adresse entrée dans la page Excel commune, ainsi que dans la BDD Access sur sa table perso et sur la table commune.

Je n'ai pas l'habitude de travailler entre Access et Excel, mais d'après ce que j'ai pu trouver c'est largement fesable. Il faudrait que régulièrement (donc via des triggers je suppose) chaque feuille perso mette à jour la feuille commune et une fois cette maj effectuée (côté Excel comme Access), la nouvelle soit copiée pour chaque employé, remplaçant ainsi l'ancienne non à jour. J'ai fait les requête de recherche de doublons etc sans problème, mais pour les mises à jour et vas et viens je suis perdu.

Si quelqu'un a un tuto expliquant ce principe, ou saurait m'expliquer comment faire... Je lui en serais grandement reconnaissant.

Merci et bonne journée!

Itu
Configuration: Windows Vista / Firefox 3.0.18

12 réponses

  1. D_D_Du_06 Messages postés 81 Date d'inscription   Statut Membre Dernière intervention   86
     
    Bonjour,

    je n'ai pas tout compris.

    Combien de feuilles excel? quels liens avec Acces?

    Chaque commercial:
    une feuille excel dans lequel il entre ses clients (nom + adresse)?

    Pour tous:
    Une feuille excel qui collecte l'ensemble des infos (noms + adresses)?

    Quels liens entre ses feuilles?
    Quel rapport avec ACCES?
    Quel va et vient souhaités ?

    etc...

    A+
    D D Du 06
    0
    1. Itu
       
      Désolé je n'ai pas été très précis.

      Il s'agit d'un seul fichier Excel, mais compartimenté en plusieurs onglets (un par employé + un global regroupant les données de tous les autres).

      Je souhaiterais qu'une fois qu'un onglet propre à un employé est modifié par une nouvelle saisie, l'onglet général soit mis à jour. J'aimerais aussi que cet onglet général soit lié avec une table dans une BDD Access pour sauvegarder les données en annexe.

      Et régulièrement une fois la BDD sur Access mise à jour, la copier dans chaque onglet pour que chaque employé dispose de sa feuille à jour (avec les données des autres).
      0
      1. Itu > Itu
         
        Up!

        "Chaque commercial:
        une feuille excel dans laquelle il entre ses clients (nom + adresse)?

        Pour tous:
        Une feuille excel qui collecte l'ensemble des infos (noms + adresses)? "

        Je n'avais pas fait attention...
        Oui chaque commercial entre le nom, l'entreprise, l'adresse et le mail.

        Pour tous : même champs.
        0
  2. Itu
     
    Up, que ce sujet ne tombe pas dans les abysses!
    0
  3. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    Lors de la saisie par un empolyé, s'agit d'un nouveau client ou d'une modification de données du client (par ex chg de n° de téléphone)

    Mais il faudrait:
    que tu dises le nom de la base et le dictionnaire de la table ( il y a t il le nom de l'employé émetteur?),
    que tu nous montres la structure de l'onglet employé et de l'onglet recap
    que tu nous dises si on est en classeur partagé ou non

    Cette architecture classeur unique avec un récapitulatif t'est elle imposée ?

    pour ma part, j'emploierais une autre méthode (access en dorsal-frontal) et classeur XL particulier (aller-retour avec access) pour chaque employé mais....
    0
    1. Itu
       
      Hello!

      "Lors de la saisie par un empolyé, s'agit d'un nouveau client ou d'une modification de données du client (par ex chg de n° de téléphone)"

      ==> il s'agit de la saisie d'un nouveau client.


      "que tu dises le nom de la base et le dictionnaire de la table ( il y a t il le nom de l'employé émetteur?)"

      =>L'onglet principal s'appel CarnetFusion, les autres CarnetXY (X et Y étant respectivement la première lettre du nom ainsi que du prénom). Sur chaque onglet il y a le même dictionnaire de données à savoir : NomEntreprise, Nom Client, Adresse, Mail.
      La BDD ACCESS s'appelle Clients, avec en table CarnetFusion.


      "que tu nous montres la structure de l'onglet employé et de l'onglet recap"

      ==> NomEntreprise NomClient Adresse Mail
      Machine Nom1 Adr1 Mail1
      Truc Nom2 Adr2 Mail2
      -----------
      Tous les onglets ont cette structure.
      J'ai vu que par exemple si je selectionne un champ donné dans CarnetFusion (disons A1:D4) et que je mets "= " , puis en changeant d'onglet je selectionne le champ de mon CarnetAB(A1:D4) , lorsque je fais Ctrl + Enter j'obtiens ce genre de formule : =CarnetAB!A2:D4 .
      Mais cela donne une copie d'une zone DÉTERMINÉE sur une autre zone DÉTERMINÉE.
      J'ai l'impression qu'il faut que je fasse quelque chose de ce genre, mais plutot en passant par le VB pour que cela soit automatique à chaque nouvel ajout.


      "que tu nous dises si on est en classeur partagé ou non"

      ==> Oui le classeur est partagé par tous les employés.

      Cette architecture classeur unique avec un récapitulatif t'est elle imposée ?

      ==> Oui, sinon je serais passé par SQL/PhP MyAdmin pour faire beaucoup plus simple. Mais je regrette pas au moins j'apprends :)

      Merci de ton intérêt michel_m!
      0
  5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    sinon je serais passé par SQL/PhP MyAdmin

    là on passerait par aussi par du sql (insert....) mais je maintiens que la solution "classeur partagé" est, dans ce cas, casse-g...

    je regarde dans mon grenier si j'ai un exemple de mise à jour d'une mdb à partir d'XL.. (sois patient mais tu peux déjà te documenter sur la technologie ADO en VBA sur developpez.com)
    0
    1. Itu
       
      là on passerait par aussi par du sql (insert....)
      ==>Pas un problème j'aime bien le SQL ;)

      tu peux déjà te documenter sur la technologie ADO en VBA
      ==> Merci je vais voir ça!
      0
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Re,

    Ci joint une proposition( que j'avais fait il y a x temps sur ce forum) d'inscription dans une base access et/Ou un classeur XL fermé
    Pas terrible mais ca te donnera un exemple...
    https://www.cjoint.com/?dloncbQnR1

    tu peux aussi utiliser ADO-SQL pour écrire dans ton onglet "recap"... tu fais signe si ca t'intéresse

    pour lire d'access m^me type de connexion et requ^te du type SELECT
    et pour restituer par ex dans A2 dans l'onglet concerné
    range ("A2").copyfromrecorset nomdetarequete

    enfin, fais attention les patois Mysql et ADO-SQL sont quelquefois différents (sinon ce serait pas drôle!)
    0
    1. Itu
       
      Je venais justement de tomber sur ce post ya 5 minutes : https://forums.commentcamarche.net/forum/affich-11148857-vba-excel-mise-a-jour-fichier-sans-l-ouvrir .

      Je vais voir ça avec ta proposition.

      Mais effectivement je pense qu'ADO-SQL pourrait être sympa, je ne connais pas encore. En revanche sur développez.com, le seul lien dans la prtie "VB" qui dirige vers l' "ADO" est sur une aide ADO entre Exel et Word. Ca fonctionne de la même façon entre Excel et Access?

      Merci de ton aide en tout cas :)
      0
      1. Itu > Itu
         
        Je suis reparti de ton code pour essayer de l'adapter à mon cas.

        Au départ j'avais une erreur de type pour les dates (je me suis planté les Adresses c'est sur un autre fichier qui n'a rien à voir avec celui-ci). Mais une fois des guillemets rajoutés dans le tableau,plus de message d'erreur lors de l'exécution de la macro. Pourtant, rien ne se passe O_O

        https://www.cjoint.com/?dlpA0NvDs2

        J'essaye mon code sur ce jeu de test avant de le refaire sur les vraies feuilles excel. Mais les noms de champ sont les mêmes.
        0
  7. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Désolé, je n'extrais pas .rar, merci de passer en.zip et éventuellement en format XL97-2003 si tu es en 2007

    "ADO" est sur une aide ADO entre Exel et Word. Ca fonctionne de la même façon entre Excel et Access?

    oui tu peux faire de l'ADO avec Wd,acc,XLentre eux; ppt, je ne sais pas
    0
    1. Itu
       
      Voilà le .zip !

      https://www.cjoint.com/?dlqWrG1SWU

      Je suis sous Office 2000 Pro malheureusement...Désolé.

      Et ok pour l'ADO, je me pencherais dessus ensuite. Merci!
      0
  8. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Dans ce cas, l'emploi toujours lourd d'ADO-SQL est inutile
    Tout simplement
    Sub maj_xl()
    Dim derlig As Long
    Dim tablo
    
    With ActiveSheet
        derlig = .Range("A65536").End(xlUp).Row
        tablo = .Range(.Cells(derlig, 1), .Cells(derlig, 4))
    End With
    With Sheets("carnetfusion")
         derlig = .Range("A65536").End(xlUp).Row + 1
         .Range(.Cells(derlig, 1), .Cells(derlig, 4)) = tablo
    End With
    
    MsgBox "Client mis à jour sur la feuille commune CarnetsFusion"
               
    End Sub
    


    il faut que l'employé mette à jour chaque fois qu'il inscrit un client
    0
    1. Itu
       
      Merci, ça marche bien. Mais peux tu m'expliquer ton code ou confirmer ce que j'ai compris?
      Je suis pas sûr de tout saisir et je veux pas recopier un code que je serais inccappable d'expliquer ou de refaire...
      a
      Sub mj_xl()
      Dim derlig As Long         'donc variable qui prend la dernière ligne ? entier long
      Dim tablo           'variable qui contient l'ensemble du tableau contenant la saisie que l'on va faire passer sur l'autre feuille?

      With ActiveSheet
      derlig = .Range("A65536").End(xlUp).Row           'ici la dernière ligne s'arrête à la dernière case saisie?
      tablo = .Range(.Cells(derlig, 1), .Cells(derlig, 4))           'donc si je dis pas de betises le tableau commence 1ere colonne à la dernière ligne saisie, et finit 4e colonne à cette même ligne
      End With
      With Sheets("carnetfusion")          'lien avec la feuille qui m'intéresse
      derlig = .Range("A65536").End(xlUp).Row + 1          'et là je suis plus sûr de suivre l'incrémentation me fait perdre le fil
      .Range(.Cells(derlig, 1), .Cells(derlig, 4)) = tablo
      End With

      MsgBox "Client mis à jour sur la feuille commune CarnetsFusion"

      End Sub


      Pardon si mes questions semblent stupides, mais j'ai du mal avec excel et je ne connais peu de ses fonctions... Merci pour ton aide :)
      0
  9. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    j'aurais pu prendre une autre variable que derlig dans "carnetsfusion" mais cela m'évite de stocker en mémoire une variable supplémentaire car les valeurs affectées à derlig dans "carnetx" sont dans le tablo: donc après je peux réaffecté derlig avec une autre valeur
    derlig = .Range("A65536").End(xlUp).Row + 1

    si je ne met pas +1 dans "carnetfusion", je vais écrire le nouveau client sur la dernière ligne écrite

    on aurait pu écrire la macro ainsi (c'est d'ailleurs plus clair pour la maintenance, donc à adopter)

    Sub maj_xl()
    Dim derlig As Long, ligvide as long
    Dim tablo
    
    With ActiveSheet
        derlig = .Range("A65536").End(xlUp).Row
        tablo = .Range(.Cells(derlig, 1), .Cells(derlig, 4))
    End With
    With Sheets("carnetfusion")
         ligvide= .Range("A65536").End(xlUp).Row + 1
         .Range(.Cells(ligvide, 1), .Cells(ligvide, 4)) = tablo
    End With
    
    MsgBox "Client mis à jour sur la feuille commune CarnetsFusion"
               
    End Sub


    0
    1. Itu
       
      Ok, merci pour tes réponses.

      Par contre un truc me chiffonne :
      Ce code devrait etre valable pour toutes mes pages

      Sub maj_xl()
      Dim derlig As Long, ligvide As Long
      Dim tablo

      With ActiveSheet
      derlig = .Range("A65536").End(xlUp).Row
      tablo = .Range(.Cells(derlig, 1), .Cells(derlig, 4))
      End With
      With Sheets("carnetfusion")
      ligvide = .Range("A65536").End(xlUp).Row + 1
      .Range(.Cells(ligvide, 1), .Cells(ligvide, 4)) = tablo
      End With

      MsgBox "Client mis à jour sur la feuille commune CarnetsFusion"

      End Sub


      Puisqu'il sélectionne ce qui est écrit sur LA PAGE ou l'on travaille pour l'envoyer sur la feuille commune CarnetsFusion

      .
      En revanche, le code lié au bouton qui effectue cette action

      Private Sub CommandButton1_Click()
      For Each c In Worksheets("CarnetA").Range("A1:D3").Cells     'c'est ici que je suis censé modifier la page
      c.FormulaR1C1 = "=VLOOKUP(RC[-2],base,2,FALSE)"
      Next
      End Sub


      Devrait changer sur chaque page (là ou indiqué en commentaire). Et cela fait tout planter. Il n'envoie rien sur CarnetsFusion, et efface les premières données de ma premiére page annexe (celle ou le code fonctionnait pour envoyer les dernières données saisies sur la page CarnetsFusion).

      Je ne comprends pas tout là... x_O
      0
  10. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Private Sub CommandButton1_Click()
    For Each c In Worksheets("CarnetA").Range("A1:D3").Cells     'c'est ici que je suis censé modifier la page
    c.FormulaR1C1 = "=VLOOKUP(RC[-2],base,2,FALSE)"
    Next
    End Sub 


    C'est quoi ce code?
    jusqu'ici tu disais qu'un employé validait son nouveau client dans carnetfusion ==> 1 bouton par page... pourquoi A1:D3

    en VBA, sauf pour quel cas bien précis, formulaRICI dénote une mauvaise conception du classeur; je n'ai jamais entendu parler de la plage "base" dans tes demandes

    Bref!
    Bon WE
    0
    1. Itu
       
      Gniih, en fait j'arrive pas à être clair on dirait, j'en suis désolé.

      Avec ce que ça donne là je voulais que :

      -chaque employé rentre son client sur sa page perso CarnetAX (sachant qu'il y en a 7/8),
      -il clique sur le bouton qui copie/colle ce dernier client entré sur la page CarnetFusion,
      -par la suite chercher à faire un bouton sur la page CarnetFusion pour régulièrement exporter cette page (CarnetFusion) sur ma BDD Access afin de la maintenir à jour.

      Enfin je vais essayer de faire dans l'ordre et commencer par faire marcher cette mise à jour entre feuilles Excel déjà...
      0
      1. Itu > Itu
         
        Ah et ce code, ben il s'est généré automatiquement donc je croyais que c'était normal et qu'il fallait que je le re adapte pour chaque page individuelle. x_O

        Bon Week End à toi aussi!
        0
      2. Itu > Itu
         
        Ca fonctionne.

        Un bouton sur chaque page qui met à jour sur la page commune.
        L'erreur venait du codé généré (pourquoi, bonne question), une fois supprimé et l'appel du bouton avec la bonne dénomination sur chaque page effectué ça marche nickel.

        Je passerai le sujet en résolu quand j'aurais trouvé la suite pour Access et la posterai ici si jamais ça peut aider quelqu'un :)

        Merci pour ton aide Michel_m.
        0
  11. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Autrement dit, la pièce jointe en post 11 c'est peanuts ?

    Vraiment lassant ce forum...
    0
    1. Itu
       
      Autrement dit, la pièce jointe en post 11 c'est peanuts ?

      Ben ça m'a montré comment appeler un module (je ne savais pas..je rappelle que je n'ai quasiment jamais touché à Excel), et d'après ce que j'ai pu comprendre je vais avoir besoin de fonctionner en ADO pour insérer les valeurs contenues dans mes champs dans une table ACCESS, donc ta pièce jointe m'est utile pour voir comment se fait la connexion, l'initialisation des requêtes et leur éxecution (dont j'aurais aussi besoin pour faire une recherche de doublons).

      Vraiment lassant ce forum...
      J'ai dit quelque chose qui ne fallait pas...?
      0