Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

389 views
Skip to first unread message

Emile63

unread,
Oct 13, 2015, 9:01:45 AM10/13/15
to
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:\Users\Emile\Documents\Temporaires\"
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

DanielCo

unread,
Oct 13, 2015, 9:44:47 AM10/13/15
to
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

unread,
Nov 7, 2015, 2:20:33 PM11/7/15
to
Bonjour DanielCo,
Et bonjour tout le monde.

Après un petit break, je reviens à la charge avec l'exportation d'une donné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

MichD

unread,
Nov 7, 2015, 3:00:29 PM11/7/15
to
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 :
569d126c-5a47-48cd...@googlegroups.com...

Emile63

unread,
Nov 7, 2015, 6:54:38 PM11/7/15
to
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 classeur 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=" & ThisWorkbook.Path & "\Base de données.xls;" & "Extended Properties=""Excel 12.0;HDR=Yes"";"

Mais pas celui-ci,
ou Fichier = "C:\Users\MonProfil\Documents\sauvegarde\Mon FichierTest pour 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

MichD

unread,
Nov 8, 2015, 6:18:35 AM11/8/15
to
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
'--------------------------------------------


Emile63

unread,
Nov 8, 2015, 7:04:29 AM11/8/15
to
Bonjour Michel,
Et merci pour ton support.


Ma variable contient l'ensemble du chemin et du nom.
Autrement dit, le chemin complet.

Emile63

unread,
Nov 8, 2015, 9:18:25 AM11/8/15
to
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épertoires 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, cela 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 Integer, MonFichier As String
On Error GoTo ErrorHandler

MonFichier = "C:\Users\sae\Downloads\Base 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

MichD

unread,
Nov 8, 2015, 11:00:44 AM11/8/15
to
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!

Emile63

unread,
Nov 8, 2015, 12:12:02 PM11/8/15
to
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 disque réseau. Mais vu la sensibilité, rien qu'entre différents répertoires 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 +/-correctement. quand je les sépare, ça plante. J'ai l'impression que la procé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 la 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, notamment 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

MichD

unread,
Nov 8, 2015, 1:39:44 PM11/8/15
to
Message d'erreur :

| Ceux qui reviennent le + souvent: 13 incompatibilité de type
**** Ce type d'erreur est fréquent. Je te donne un petit exemple
Dim X As Long
Dans une procédure, tu essaies d'attribuer une chaîne de caractères à la variable X
X = "Toto"
Cela génère le type d'erreur que tu soulignes. Évidemment, ce n'est qu'un exemple...

Attention, si tu ajoutes des données d'un champ de la table qui est vide... où qui n'a
pas le bon type de données...

| quand il ne trouve pas [Table]
**** La "table" doit exister dans ledit fichier du répertoire. Regarde dans le fichier exemple que
j'ai joint
comment cela fonctionne... Tout le code est commenté et il fonctionne très bien...même s'il
n'a pas
été testé exhaustivement!

| Quand les 2 fichiers sont sur le même répertoire, cela
**** Dans le fichier exemple que je t'ai fourni, tu peux déplacer le fichier de destination des
données
dans un autre répertoire et cela fonctionne très bien!
Est-ce possible que le chemin + le nom du fichier représente une chaîne de caractères trop
longue?

Dans le fichier exemple, j'ai utilisé ceci pour faire ce test : (les 2 fichiers ont la
version Excel 2003)
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\Users\MichD\Documents\Base de données.xls;" & _
"Extended Properties=""Excel 8.0;HDR=YES;"""

Je peux difficilement en faire plus!

Un exemple non testé avec l'ouverture du fichier :

'-------------------------------------------------------
Sub test()
Dim Fichier As String, Feuille As String
Dim DerLig As Long, Wk As Workbook

Application.ScreenUpdating = False
Application.EnableEvents = False

Fichier = "c:\MonFichier.xlsm"
Feuille = "Données"

Set Wk = Workbooks.Open(Fichier)

With Wk
With .Worksheets(Feuille)
DerLig = .Range("A" & .Rows.Count).End(xlUp).Row + 1
'écrire les données que tu veux dans la feuille
.Range("A" & DerLig) = "X"
.Range("B" & DerLig) = "XX"
.Range("C" & DerLig) = "Y"
.Range("D" & DerLig) = "Z"
End With
End With
'Fermeture du classeur avec sauvegarde
Wk.Close True
Set Wk = Nothing
Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub
'-------------------------------------------------------

MichD

unread,
Nov 8, 2015, 1:43:35 PM11/8/15
to
Bonjour,


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

**** OUI


MichD

unread,
Nov 8, 2015, 1:50:29 PM11/8/15
to
Erreur 13, suppose que le champ Sexe contient un chiffre et l'erreur est générée.

Rst(4).Value = CStr([Sexe])


Rst(3).Value = CDate([Âge])
Si le champ "Âge" ne contient pas une date, la même chose

Pour tester la procédure, n'utilise pas de gestion d'erreur pour tester la procédure
cela va t'aider à identifier les problématiques sur les lignes de code qui pose
problème!

Il est toujours possible d'ajouter un IF... Else Then afin de t'assurer que le contenu
correspond bien au type de données du champ.

Emile63

unread,
Nov 8, 2015, 5:57:48 PM11/8/15
to
Ok, merci MichD,

Je regarde tous ça et je pars a la chasse aux erreurs. :-)
(J'ai déjà commencé a mettre un IF)
Merci pour tes solutions toujours très justes et pertinentes. ;-)
Cordialement,

Emile
0 new messages