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

Bonjour à tous,
Depuis un classeur* je cherche à copier/exporter des données sur un cla=
sseur fermé (afin de statistiques et de journalisation).
A cet effet, je me suis inspiré de l'Excel-entissime site de M. Boisgonti=
er, 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 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 = "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, adLockOpti=
mistic
rs.AddNew
rs(0).Value = [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èle de Factures.xltm dont je voudrais garder tous les =
montants facturés (à 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 ?
Je vous remercie d'avance pour votre aide et conseils.
Cordialement,
Emile
Depuis un classeur* je cherche à copier/exporter des données sur un cla=
sseur fermé (afin de statistiques et de journalisation).
A cet effet, je me suis inspiré de l'Excel-entissime site de M. Boisgonti=
er, 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 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 = "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, adLockOpti=
mistic
rs.AddNew
rs(0).Value = [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èle de Factures.xltm dont je voudrais garder tous les =
montants facturés (à 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 ?
Je vous remercie d'avance pour votre aide et conseils.
Cordialement,
Emile
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 :
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
É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
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
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
'--------------------------------------------
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"
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
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 ]
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!
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.. :-(
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é! :-)
Oui
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
Pour l'instant il n'y a que moi qui le manipule
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