Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA: Exporter un enregistrement d'un classeur ouvert à un classeur fermé (de sauvegarde)

15 réponses
Avatar
Emile63
Bonjour =E0 tous,
Depuis un classeur* je cherche =E0 copier/exporter des donn=E9es sur un cla=
sseur ferm=E9 (afin de statistiques et de journalisation).=20
A cet effet, je me suis inspir=E9 de l'Excel-entissime site de M. Boisgonti=
er, en utilisant le code ci-dessous, mais =E7a plantouille..=20
Avec cette description d'erreur :-/
=20
***MSG: Erreur d'=E9x=E9cution=20
Mise =E0 jour impossible.La base de donn=E9e ou l'objet est en lecture seul=
e.

'---------------------------------------
Sub AjoutEnregistrement()
'Code permettant d'ajouter un enregistrement en fin de fichier [Source: htt=
p://boisgontierjacques.free.fr/]

Dim MonRepertoire$, MonFichier$, Fichier$

MonRepertoire =3D "C:\Users\Emile\Documents\Temporaires\"
MonFichier =3D "MonFichierTestQuiRe=E7oitUnEnregistrement.xlsm"
Fichier =3D MonRepertoire & MonFichier
Set cnn =3D New ADODB.Connection
cnn.Open "Provider=3DMicrosoft.Jet.OLEDB.4.0;Data Source=3D" & Fichier & =
";Extended Properties=3DExcel 8.0;" ' [Erreur ICI]
Set rs =3D New ADODB.Recordset
rs.Open "SELECT * from [Feuil1$A1:C1000]", cnn, adOpenDynamic, adLockOpti=
mistic
rs.AddNew
rs(0).Value =3D [MaZone_a_Exporter] ' Il s'agit de la zone: A2,B2,C2,D2,E=
2, F2 de la Feuil1 du classeur actuel
rs.Update
rs.Close
cnn.Close
End Sub
'------------------------------------------

*Par exemple un mod=E8le de Factures.xltm dont je voudrais garder tous les =
montants factur=E9s (=E0 l'impression) sur une autre feuille pour le journa=
l de facturation du jour/semaine/mois.

-Est-ce que quelqu'un pourrait me venir en aide SVP ? =20
Je vous remercie d'avance pour votre aide et conseils.
Cordialement,
Emile

10 réponses

1 2
Avatar
DanielCo
Bonjour,
Remplace la ligne en erreur par :
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier &
";Extended Properties=Excel 12.0;"
(le changement est dû aux nouveaux formats de classeurs)
Daniel

Emile63 avait écrit le 13/10/2015 :
Bonjour à tous,
Depuis un classeur* je cherche à copier/exporter des données sur un classeur
fermé (afin de statistiques et de journalisation). A cet effet, je me suis
inspiré de l'Excel-entissime site de M. Boisgontier, en utilisant le code
ci-dessous, mais ça plantouille.. Avec cette description d'erreur :-/

***MSG: Erreur d'éxécution
Mise à jour impossible.La base de donnée ou l'objet est en lecture seule.

'---------------------------------------
Sub AjoutEnregistrement()
'Code permettant d'ajouter un enregistrement en fin de fichier [Source:
http://boisgontierjacques.free.fr/]

Dim MonRepertoire$, MonFichier$, Fichier$

MonRepertoire = "C:UsersEmileDocumentsTemporaires"
MonFichier = "MonFichierTestQuiReçoitUnEnregistrement.xlsm"
Fichier = MonRepertoire & MonFichier
Set cnn = New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Fichier &
";Extended Properties=Excel 8.0;" ' [Erreur ICI] Set rs = New
ADODB.Recordset rs.Open "SELECT * from [Feuil1$A1:C1000]", cnn,
adOpenDynamic, adLockOptimistic rs.AddNew
rs(0).Value = [MaZone_a_Exporter] ' Il s'agit de la zone: A2,B2,C2,D2,E2,
F2 de la Feuil1 du classeur actuel rs.Update
rs.Close
cnn.Close
End Sub
'------------------------------------------

*Par exemple un modèle de Factures.xltm dont je voudrais garder tous les
montants facturés (à l'impression) sur une autre feuille pour le journal de
facturation du jour/semaine/mois.

-Est-ce que quelqu'un pourrait me venir en aide SVP ?
Je vous remercie d'avance pour votre aide et conseils.
Cordialement,
Emile
Avatar
Emile63
Bonjour DanielCo,
Et bonjour tout le monde.

Après un petit break, je reviens à la charge avec l'exportation d'une d onnée dans un classeur fermé, car, malheureusement, cela ne fonctionne toujours pas.
Pour faire court, j'ai déposé mon exemple ci-joint:
http://www.cjoint.com/c/EKhtoTR3ice

Je vous remercie d'avance pour votre aide et conseils.
Cordialement,
Emile
Avatar
MichD
Bonjour,

Écrire dans un fichier fermé, ce n'est pas aussi simple
que de lire des données d'un fichier fermé. C'est souvent
beaucoup plus simple d'ouvrir le fichier est d'y insérer
la valeur.

Voici un vieil exemple que j'avais fait sur le sujet.
Il y a même un formulaire... de mémoire!
http://www.cjoint.com/c/EKhtWZTO8nG

Tu devras adapter le pilote si tu travailles avec
une version plus récente qu'Excel 2003 dans le code.

Exemple :
StConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
'Yes -> en-tête de colonne
'NO -> sans en-tête de colonne




MichD
---------------------------------------------------------------
"Emile63" a écrit dans le message de groupe de discussion :


Bonjour à tous,
Depuis un classeur* je cherche à copier/exporter des données sur un classeur
fermé (afin de statistiques et de journalisation).
A cet effet, je me suis inspiré de l'Excel-entissime site de M. Boisgontier,
en utilisant le code ci-dessous, mais ça plantouille..
Avec cette description d'erreur :-/

***MSG: Erreur d'éxécution
Mise à jour impossible.La base de donnée ou l'objet est en lecture seule.

'---------------------------------------
Sub AjoutEnregistrement()
'Code permettant d'ajouter un enregistrement en fin de fichier [Source:
http://boisgontierjacques.free.fr/]

Dim MonRepertoire$, MonFichier$, Fichier$

MonRepertoire = "C:UsersEmileDocumentsTemporaires"
MonFichier = "MonFichierTestQuiReçoitUnEnregistrement.xlsm"
Fichier = MonRepertoire & MonFichier
Set cnn = New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Fichier &
";Extended Properties=Excel 8.0;" ' [Erreur ICI]
Set rs = New ADODB.Recordset
rs.Open "SELECT * from [Feuil1$A1:C1000]", cnn, adOpenDynamic,
adLockOptimistic
rs.AddNew
rs(0).Value = [MaZone_a_Exporter] ' Il s'agit de la zone: A2,B2,C2,D2,E2,
F2 de la Feuil1 du classeur actuel
rs.Update
rs.Close
cnn.Close
End Sub
'------------------------------------------

*Par exemple un modèle de Factures.xltm dont je voudrais garder tous les
montants facturés (à l'impression) sur une autre feuille pour le journal de
facturation du jour/semaine/mois.

-Est-ce que quelqu'un pourrait me venir en aide SVP ?
Je vous remercie d'avance pour votre aide et conseils.
Cordialement,
Emile
Avatar
Emile63
Bonsoir MichD,
Merci pour ton aide. J'ai bien analysé ton exemple et m'en suis inspirer pour une proc. qui fonctionne.
Cependant y'a encore un truc qui cloche, car l'endroit ou se situe le class eur des données n'est pas le même que celui de la sauvegarde.

Avec cette partie de code ça fonctionne:
Conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWor kbook.Path & "Base de données.xls;" & "Extended Properties=""Excel 12. 0;HDR=Yes"";"

Mais pas celui-ci,
ou Fichier = "C:UsersMonProfilDocumentssauvegardeMon FichierTest pou r importer données.xlsm"
Conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";" & "Extended Properties=""Excel 12.0;HDR=Yes"";"

Saurais tu me dire ou est mon erreur stpl? ;-)
Merci d'avance.
Cordialement
Emile
Avatar
MichD
Dans mon exemple, la variable "SourceFile" contient le chemin du
répertoire où se retrouve le fichier + le nom du fichier incluant l'extension
du fichier.

Dans le code que tu as donné, que contient la variable "Fichier" ?

'--------------------------------------------
StConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & SourceFile & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes"";"
'Yes -> en-tête de colonne
'NO -> sans en-tête de colonne
'--------------------------------------------
Avatar
Emile63
Bonjour Michel,
Et merci pour ton support.


Ma variable contient l'ensemble du chemin et du nom.
Autrement dit, le chemin complet.
Fichier = "C:UsersMonProfilDocumentssauvegardeMon FichierTest pour i mporter données.xlsm"
Avatar
Emile63
Re-Bonjour MichD,

La version suivant semble fonctionner, mais n'est pas dépourvue de probl èmes. Ma feuille récéptrice semble parfois se bloquer (plante), et le système crée une version. 1 ce qui plantouille toute mon affaire...
D'autre part, je n'arrive pas à résoudre mon problème de répertoire s différents entre l'endroit ou se trouve le fichier émetteur et celui ou se trouve le récepteur. quand ils sont dans le même répertoire, ce la fonctionne avec le code ci dessous, mais plus si j'en déplace 1.

'----------------------------------------------
Sub NouvelleEntrée()
Dim Conn As Connection, Rst As New ADODB.Recordset, N As Variant, A As Inte ger, MonFichier As String
On Error GoTo ErrorHandler

MonFichier = "C:UserssaeDownloadsBase de données.xls"
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MonFichier & ";" & "Extended Properties=""Excel 12.0;HDR=Yes"";"
Rst.Open "Select * from [table]", Conn, adOpenKeyset, adLockOptimistic
Rst.AddNew
Rst(0).Value = CDbl([No] + 1)
Rst(1).Value = CStr([Prénom])
Rst(2).Value = CStr([Nom])
Rst(3).Value = CDate([Âge])
Rst(4).Value = CStr([Sexe])
Rst.Update
Rst.Close: Set Rst = Nothing
Conn.Close: Set Conn = Nothing
Exit Sub

ErrorHandler:
vtMessage = "Erreur détectée"
vtMessage = vtMessage & _
Chr(10) & _
Chr(10) & "Erreur Numéro: " & Err & _
Chr(10) & "Description: " & Error()
MsgBox vtMessage, vbInformation, ctByg
Rst.Close: Set Rst = Nothing
Conn.Close: Set Conn = Nothing
End Sub
'----------------------------------------------

Je te remercie d'avance pour ton aide et éventuelles explications.
Cordialement,
Emile
Avatar
benoit
Emile63 wrote:

Dim Conn As Connection, Rst As New ADODB.Recordset, N As Variant, A As
Integer, MonFichier As String On Error GoTo ErrorHandler

MonFichier = "C:UserssaeDownloadsBase de données.xls"



Juste une question : les caractères accentuées sont-ils acceptés dans
les strings ?

--
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La
pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et
personne ne sait pourquoi !" [ Albert Einstein ]
Avatar
MichD
Je suppose que les fichiers sont sur le disque dur et non sur une clé...

As-tu un message d'erreur? Si oui, lequel?

As-tu tous les droits sur le répertoire où tu veux inscrire des données dans ledit fichier ?
Qu'est-ce qui se passe si tu mets le fichier contenant la macro dans ce répertoire particulier?

Il faut faire attention au fichier qui reçoit les données à l'aide de la procédure. Si un usager
l'ouvre
et efface des lignes au lieu de les supprimer, cela va avoir un effet direct l'exécution de la
macro.
Si tu ouvres ce fichier manuellement, je te suggère fortement de ne pas modifier le contenu
de la feuille manuellement où être très prudent!

Je te l'ai dit, cela est faisable...mais pas aussi simple que ça dans la pratique!
Avatar
Emile63
Le dimanche 8 novembre 2015 17:00:44 UTC+1, MichD a écrit :
Je suppose que les fichiers sont sur le disque dur et non sur une clé.. .


Oui, c'est le même disque. Seul les répertoires diffèrent.
Le but, si cela fonctionne, étant que la sauvegarde se fassent sur un dis que réseau. Mais vu la sensibilité, rien qu'entre différents réper toires je commence à douter.. :-(
As-tu un message d'erreur? Si oui, lequel?


Parfois oui, parfois non, et ce n'est pas toujours les mêmes..
Ceux qui reviennent le + souvent: 13 incompatibilité de type
et quand il ne trouve pas [Table]. Là je faisait quelques tests, et tout d'un coup il fonctionne alors que il y a quelques minutes (la même proc.) elle plantait.. Curieux, alors que rien n'a changé, a part que j'ai aval é un petit café! :-)

As-tu tous les droits sur le répertoire où tu veux inscrire des donn ées dans ledit fichier ?


Oui
Qu'est-ce qui se passe si tu mets le fichier contenant la macro dans ce r épertoire particulier?


Quand les 2 fichiers sont sur le même répertoire, cela fonctionne +/-co rrectement. quand je les sépare, ça plante. J'ai l'impression que la pr océdure perd son chemin (alors qu'il est dans la variable).Car le msg qui reviens le + souvent, c'est qu'il ne trouve pas [Table], donc je pense qu' ill n'a pas ouvert le fichier cible

Il faut faire attention au fichier qui reçoit les données à l'aide de la procédure. Si un usager l'ouvre et efface des lignes au lieu de les supprimer, cela va avoir un effet direct l'exécution de la macro.
Si tu ouvres ce fichier manuellement, je te suggère fortement de ne pas modifier le contenu de la feuille manuellement où être très prudent!


Pour l'instant il n'y a que moi qui le manipule
Je te l'ai dit, cela est faisable...mais pas aussi simple que ça dans l a pratique!


Ouais, je vois bien. C'est assez instable. Je vais me raviser et suivre ton conseil en passant par une proc. qui ouvre le classeur, lui passe les donn ées et le re-ferme, ce serrait certainement plus fiable et stable, notamm ent si par hasard 2 utilisateurs venaient à y accéder en même temps.
Aurais-tu, Par chance, quelque chose en stock dans cet esprit-là? :-)
Merci encore pour ton support,
Cordialement
Emile
1 2