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

5 réponses

1 2
Avatar
MichD
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:UsersMichDDocumentsBase 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
'-------------------------------------------------------
Avatar
MichD
Bonjour,


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

**** OUI
Avatar
MichD
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.
Avatar
benoit
MichD wrote:

Bonjour,


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

**** OUI



Faut pas crier, je ne suis pas sourd des yeux.

--
"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
Emile63
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
1 2