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

Fermé
Itu - 10 mars 2010 à 10:29
 Itu - 12 mars 2010 à 10:59
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
A voir également:

12 réponses

J'ai oublié de préciser...
J'ai vu que ce genre de sujet a déjà été abordé
cf : https://forums.commentcamarche.net/forum/affich-2263210-mise-a-jour-des-bases-access-via-excel
par exemple.

Seulement là je souhaiterais le faire en dur via le VB.
0
up! :)
0
D_D_Du_06 Messages postés 80 Date d'inscription jeudi 3 janvier 2008 Statut Membre Dernière intervention 10 mars 2010 84
10 mars 2010 à 13:22
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
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
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
Up, que ce sujet ne tombe pas dans les abysses!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
11 mars 2010 à 09:56
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
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
11 mars 2010 à 12:20
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
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
11 mars 2010 à 14:18
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
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
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
11 mars 2010 à 16:08
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
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
11 mars 2010 à 17:43
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
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
11 mars 2010 à 19:05
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
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
12 mars 2010 à 09:51
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
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
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
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
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 311
12 mars 2010 à 10:51
Autrement dit, la pièce jointe en post 11 c'est peanuts ?

Vraiment lassant ce forum...
0
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