[VBA] Envoyer données dans un autre classeur

[Résolu/Fermé]
Signaler
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
-
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
-
Bonjour les pros ;)

Je me dirige vers vous dans un premier temps pour savoir déjà, si ce que je souhaite effectuer est possible, et ensuite, si oui, comment il faut s'y prendre ;)

Donc j'explique un peu la situation : j'ai actuellement un classeur de suivi d'affaire. Dans ce classeur, j'ai une feuille nommée "Facture" par exemple. Lorsque l'affaire est livrée et terminée, je clique, sur cette feuille, sur un bouton qui me génère un numéro de facture de manière automatique ainsi que la date. (Numéro de facture obtenu grâce à une BDD Access).

Ma question est : lorsque je génère ce numéro de facture, est-il possible d'envoyer dans un classeur Excel fermé existant, des données de cette dite facture ? Comme par exemple la date de celle-ci, le numéro de commande client, le numéro de l'affaire ?

Pour moi qui bosse sur ce projet depuis pas mal de temps maintenant, ça me paraît clair énoncé de la sorte, mais si jamais vous avez besoin de plus d'infos, n'hésitez pas !

Je suis un peu perdu avec ce souci, je souhaite en effet faire un classeur qui recapitule toutes les factures éditées, avec des infos, et aussi les échéances pour avoir un suivi.

Merci par avance à ceux qui prendront le temps d'essayer de m'éclairer ;)

A bientôt !
Cordialement,
Talzatior.

18 réponses

Messages postés
16526
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
22 octobre 2021
3 231
Bonjour,

1/nom_plage="ecrit"
j'avais écris ça il y a 5 ans mais depuis ca a évolué!
écrit correspond à une plage nommée dans fermé_ado ce qui m'obligeait a créer une base de données (B1:B2)
mais il y a un autre moyen que je t'envoie ci dessous en indiquant lors de la connexion qu'il n'y a pas d'étiquettes dans le fichier fermé: HDR=NO (HDR=Header=etiquette)
il faut alors précisé l'onglet suivi d'un dollar et de la référence de cellule sous la forme "B2:B2"

ci joint modif suivant cette syntaxe
https://www.cjoint.com/?gykqmItMhD

2/ Pour la facturation Access est + adapté car tu conserves une mémoire de tes factures et avec l'intégrité référentielle, par exemple: tu ne peux pas enlever un client qui a passé une commande; tu peux également imprimer tes factures avec les états d'access etc.
Tu peux bien sûr extraire des données vers Excel pour des calculs et graphiques où XL est mieux adapté. Avec Word tu as la possibilité de cibler des courriers sur plusieurs conditions (par ex: région, sexe, csp...) bref , quand le traitement de textes est + adapté que les états access...

ci joint: un exemple de la table de relation d'une facturation (tioujours démo d'école)
https://www.cjoint.com/?gykLYfj5f0





1
Merci

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

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
16526
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
22 octobre 2021
3 231
Bonjour,
j'ai envie de te répondre que si tu utilises access, enregistre ces données dans access...
Autrement, c'est possible avec un classeur Excel restant fermé...
ci joint tite démo d'école montrant les import-export entre excelfermé, access
le fichier où sont situés les macros est "home.xls"
https://www.cjoint.com/?gxl4m5mMWm
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Merci je file voir cela de suite ;)
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Rebonjour ...

Super ton fichier, mais la subtilité suivante m'échappe ...

Que signifie exactement, dans la macro "écrire_fermé" :
nom_plage = "ecrit"


Je ne capte pas trop le truc là ...
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Encore une petite question bonus ;)

Si je fais comme tu me dis, alors que j'utilise une table access pour numéroter mes factures, est-il possible de récupérer au sein même de cette tables les infos que je souhaite ??

Après, si c'est le cas, dans mon classeur excel où je souhaite récupérer ces infos, il suffit que je fasse une mise en relation et c'est bon ...

En fait, je suis un peu perdu dans les mises en relations entre différents classeurs ou alors classeurs BDD ...
Messages postés
16526
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
22 octobre 2021
3 231
Je viens juste de rentrer;

Si tu peux attendre demain, merci. :-)
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Biensur, je te remercie ;) A demain, bonne soirée ;)
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Ok effectivement, si j'avais su cela et que les utilisateurs connaissaient Access, j'aurais sans doute fait comme tu me le proposes, ça a l'air beaucoup plus ... sensé ...

Par contre, je te communique mon fichier : https://www.cjoint.com/?gyk7PdumUf

Mon souci est que j'utilise Access, effectivement, mais uniquement en tant que numéroteur pour mes factures, mes BL et mes commandes sous Excel ...

Prenons l'exemple de la facture ... Lorsque je clique sur le bouton pour la générer, je "pompe" le numéro actuel de la BDD +1, et donc j'incrémente ce numéro ensuite dans cette BDD ...

Est-il possible, dans l'état actuel des choses (car honnêtement, je ne suis pas motivé pour tout recommencer ... ;) ), de récupérer des informations telles que N° facture, date facture, N° commande, Date commande, Nom client, montant HT, échéance (c'est ce qui me vient de suite à l'esprit ...) et de les "envoyer" lorsque je clique sur le bouton "transfert la facture dans la BDD", dans un classeur Excel ou alors dans ma BDD Access ??

J'espère que je suis clair lorsque je m'exprime ... parce que moi-même, cherchant depuis deux jours des solutions, et trouvant des infos mais que je ne comprends malheureusement pas, je perds mes cheveux !! ;)

En tous les cas, merci à toi pour ces informations ;)

A bientôt ;)
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
J'essaie d'exploiter ta macro pour l'adapter à mon utilisation ...

Pour voir si cela fonctionne ...

Peux-tu m'éclairer sur :
' travail demandé: insère dans le champ "report" de "db_ecrire" (cellules nommées) la valeur de "G2,"


Comment fais-tu pour que les cellules soient nommées champ1 ou champ2 ?
Messages postés
16526
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
22 octobre 2021
3 231
re,

il n'y a pas de pb pour transfèrer tes champs soit dans une nouvelle table de ta base access, soit dans un classeur XL
si table access, le n° de facture sera la clé de cette table

pour ton dernier message, utilise plutôt la procédure "écrire_db_fermé" qui correspond à ton cas et regarde dans fermé_ado les colonnes G & H de l'onglet écrire

fin après-midi , j'espère, je t'enverrrai une démo avec le cas access et le cas excel: tu verras que la différence est juste sur la connexion (ou presque)
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Merci beaucoup pour tout ce que tu fais, j'ai hâte de voir cela ;)

Et de réussir à comprendre comment cela fonctionne ... Parce que ça, c'est pas gagné !!
Messages postés
16526
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
22 octobre 2021
3 231
ci joint maquette archivage avec XL
https://www.cjoint.com/?gyo2BehrLy
nota: dans cette maquette la procédure employée (createobject)ne nécessite pas de cocher la référence ADO

archivage access + tard

macro à adapter:

Sub archiver_xl()
Dim conn As Object
Dim requete As Object
Dim f_num As Long, f_date As Date, c_num As String
Dim e_date As Date, totalHT As Double, texte_SQL As String

'collecte les infos de la facture
f_num = Range("A14")
f_date = Range("A16")
c_num = CStr(Range("C16"))
e_date = Range("H16")
totalHT = Range("F43")

'connexion à la base dans fichier archives.xls
classeur = "archives.xls" 'a adapter
fichier = ThisWorkbook.Path & "\" & classeur 'a adapter
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & _
                "data source=" & fichier & ";" & _
                "extended properties=""Excel 8.0;"""

                
' travail demandé: insère dans les champs de "T_archive les données collectées
texte_SQL = "INSERT INTO T_archive (num_fact,dat_fact,num_comm,echeance,montant_HT) VALUES ('" & (f_num) & "','" & (f_date) & "', '" & (c_num) & "','" & (e_date) & "', '" & (totalHT) & "')"
' éxécute le travail demandé
Set requete = CreateObject("ADODB.recordset")
Set requete = conn.Execute(texte_SQL)

Set requete = Nothing
Set conn = Nothing

MsgBox "archivage de la facture n° " & f_num & " effectué avec succès"

End Sub
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Honnêtement, si j'ai bien saisi le code, ne te casse pas la tête à le faire pour Access, je m'en sortirais avec un fichier archive sous Excel ;)

Je regarde cela et te tiens au courant demain ;)

Merci mille fois ;)

Juste petite question ... Cette macro, insère-t-elle les numéros de facture à la suite les uns des autres ? Je veux dire par là, si je génère ma facture 1, quand je génère ma facture 2 elle sera sur une autre ligne ?
Ma question peut paraître idiote, mais en fait, je ne vois pas la partie de programmation qui envoie à la ligne suivante ou à la première ligne libre ...

Merci pour tout ;)
Messages postés
16526
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
22 octobre 2021
3 231
re,
et voilà la version avec le choix entre access et excel
https://www.cjoint.com/?gyrmenVMIk

dans acees, tu crées une nouvelle table ("T_archive" dans la maquette) avec les champs que tu désires archiver, le num de facture étant la clé.
l'avantage d'access est que l'on interdit facilement un double enregistrement;
a toi de voir pour d'éventuelles protections (fichiers ouvert, champs non remplis...)
que ce soit Excel ou Access j'ai tout converti en texte pour éviter des crise de nerfs traditionnelles avec la syntaxe SQL et comme c'était pour archiver mais tu peux changer...

pour ma part, la solution access a ma préférence, mais c'est TON appli :-)

Ci dessous,la macro excel vers access (tu vois qu'il n'y a pas trop de différences à part la gestion de l'erreur "doublon"

Sub archiver_Access()
Dim conn As Object
Dim requete As Object
Dim f_num As Long, f_date As Date, c_num As String, e_date As Date, totalHT As Double
Dim base_ac As String, fichier As String, texte_SQL As String

'collecte les infos de la facture
f_num = Range("A14")
f_date = Range("A16")
c_num = CStr(Range("C16"))
e_date = Range("H16")
totalHT = Range("F43")

'connexion à la base dans fichier archives.xls
base_ac = "Suivi_affaire.mdb" 'a adapter
fichier = ThisWorkbook.Path & "\" & base_ac 'a adapter
Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & _
                "data source=" & fichier & ";"
                
' travail demandé: insère dans les champs de "T_archive les données collectées
texte_SQL = "INSERT INTO T_archive (num_fact,dat_fact,num_comm,echeance,montant_HT) VALUES ('" & (f_num) & "','" & (f_date) & "', '" & (c_num) & "','" & (e_date) & "', '" & (totalHT) & "')"
' éxécute le travail demandé
Set requete = CreateObject("ADODB.recordset")
On Error GoTo alerte 'cas où la facture (numéro) a déjà été enregistrée
Set requete = conn.Execute(texte_SQL)

'déroulement normal
MsgBox "archivage de la facture n° " & f_num & " effectué avec succès"
Set requete = Nothing
Set conn = Nothing
Exit Sub

' facture déjà enregistrée
alerte:
MsgBox "la facture n° " & f_num & " a déjà été enregistrée!", vbCritical
Set requete = Nothing
Set conn = Nothing
End Sub


Messages postés
16526
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
22 octobre 2021
3 231
et bing, une bosse!

pour répondre à ta question sur "en dessous": c'est oui

"pour piger"
quand il y a un enregistrement d'effectué:
tu va dans archives.xls
insertion nom et tu sélectionnes ech: tu as une magnifique formule "decaler"
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Bonjour Michel_m

Pas tout compris à ton message "pour piger" lol ;)

Mais en tous les cas, les infos que tu m'as donnée là sont réellement précieuses pour moi et je t'en remercie vraiment ;)

Je vois pour avancer avec cela, je reviens vers ce topic si jamais ;)

Merci Michel ;)
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
Ah oui, une question ...

J'ai besoin de stocker le fichier "archives.xls" dans le répertoire avant celui où se trouvent mes fiche affaire ;)

quelle est la commande pour aller au répertoire précédent, si elle existe ? Sinon, dois-je préciser le chemin complet du fichier ? ;)

Merci à vous ;)
Messages postés
42
Date d'inscription
lundi 14 janvier 2008
Statut
Membre
Dernière intervention
8 juillet 2009
1
texte_SQL = "INSERT INTO T_archive (num_fact,dat_fact,num_comm,echeance,montant_HT) VALUES ('" & (f_num) & "','" & (f_date) & "', '" & (c_num) & "','" & (e_date) & "', '" & (totalHT) & "')"


Dans le classeur que j'ai créé, il me fait une erreur me disant qu'il ne parvient pas à trouver "num_fact".
J'ai pourtant fait Insertion/Nom/Définir, pour nommer la colonne A "num_fact" ... mais je ne sais que faire d'autre ...

Merci pour votre aide ... HELP ;)