OVH Cloud OVH Cloud

ecrire dans un fichier fermé avec ADO

12 réponses
Avatar
Xoco
Bonjour a tous,=20

Je cherche a ecrire dans un fichier ferm=E9 mais a un=20
emplacement dynamique, comme la derniere ligne...

grace a la macro de Rob Bovey, je sais ecrire dans un=20
fichier ferm=E9 en utilisant la connexion ADO, mais je ne=20
sais comment faire pour me positionner a la derniere ligne=20
du fichier ferm=E9
voici le code de Rob Bovey


' 2 - Ecrire dans un classeur ferm=E9

Sub EcritDatas()
Dim Fich$, cell As Range
=20
Fich =3D "d:\TestAdo.xls" '=E0 adapter
=20
'=E9crit dans le classeur ferm=E9 la valeur des cellules=20
A1:A5
'du classeur actif
For Each cell In ActiveWorkbook.Sheets("Feuil1").Range
("A1:A5")
SetExternalDatas Fich, "Feuil1", cell.Address(0, 0),=20
cell.Text
Next
=20
'=E9crit en A6 la date et l'heure de l'op=E9ration
SetExternalDatas Fich, "Feuil1", "A6", "mise =E0 jour du "=20
& Now
=20
'on regarde le r=E9sultat
DoEvents
Workbooks.Open Fich
=20
End Sub

'=E9crit DataToWrite dans la cellule DestCellAdr
'de la feuille DestFeuille du classeur ferm=E9 DestFile
Sub SetExternalDatas(DestFile As String, _
DestFeuille As String, _
DestCellAdr As String, _
DataToWrite As Variant)
Dim oConn As ADODB.Connection
Dim oCmd As ADODB.Command
Dim oRS As ADODB.Recordset
Dim RangeDest
'd'apr=E8s Rob Bovey, mpep

' Open a connection to the Excel spreadsheet
Set oConn =3D New ADODB.Connection
oConn.Open "Provider=3DMicrosoft.Jet.OLEDB.4.0;" & _
"Data Source=3D" & DestFile & ";" & _
"Extended Properties=3D""Excel 8.0;HDR=3DNo;"";"

' Create a command object and set its ActiveConnection
Set oCmd =3D New ADODB.Command
oCmd.ActiveConnection =3D oConn

' This SQL statement selects a cell range in=20
the "feuilleTest" worksheet.
'1 S=E9lection pour =E9crire dans une seule cellule
RangeDest =3D DestCellAdr & ":" & DestCellAdr
oCmd.CommandText =3D "SELECT * from `" & DestFeuille & "$"=20
& RangeDest & "`"

' Open a recordset containing the worksheet data.
Set oRS =3D New ADODB.Recordset
oRS.Open oCmd, , adOpenKeyset, adLockOptimistic

' Update last row
oRS(0).Value =3D DataToWrite
oRS.Update
=20
'Close the connection
oConn.Close
Set oConn =3D Nothing
Set oCmd =3D Nothing
Set oRS =3D Nothing

End Sub


Si vous avez une idee,=20
Meilleurs salutations...
Xoco

2 réponses

1 2
Avatar
xoco
Merci mille fois Denis, je m'en suis sorti, et je t en
suis bien reconnaissant...
A+
Xoco



-----Message d'origine-----
En supplément, Si tu veux avoir des étiquettes de
colonnes qui soit du texte dans la première ligne, formate

expressément la
deuxième ligne avec le type de données que doit contenir
cette colonne ( chacune des cellules doit avoir un

format) , et ces
formats seront respectés lors de l'exportation des
données. Cependant, les données débuteront en ligne 3 et

non en ligne 2.

Salutations!



"Denis Michon" <denis a écrit dans le
message de news:eL9Ab.19794$

Bonsoir Xoco,

Voici un exemple :

Pour exporter la plage de cellules A1:C10 de la feuille 2
du classeur actuel dans lequel se trouve cette procédure

dans le
classeur suivant qui est fermé : "C:Excel.Ado.xls"

Voici une façon de faire et quelques commentaires :

A ) Ça prend au moins une ligne de données dans la
feuille de destination du classeur. Cette première ligne

va délimiter le
nombre de champs contenu dans la requête.

B ) voici la requête : " Select * from [Feuil1$] "
comme j'ai utilisé la feuille au complet, toutes les
colonnes ne recevant pas de données doivent être libre de

formatage
.....sinon elle risque de faire parti de la requête et la
copie se fera pas au bon endroit.


C ) la première ligne de données que tu insères doit
avoir un TYPE de données qui correspond aux données de la

colonnes que
tu veux exporter.

D ) Tu dois ajouter à ton projet la bibliothèque
suivante :

"Microsoft activex objects 2.0 librairy"

E ) Cette façon de procéder, te permet d'ajouter des
données dans le classeur de destination, sur la feuille de

ton choix,
sans connaître quelle était la dernière ligne contenant
des données, et sans avoir besoin de spécifier une adresse

de
destination particulière.


'-------------------------------------
Sub Miseàjour()

Dim Conn As Connection, Rst As New ADODB.Recordset
Dim B As Integer, A As Integer, Rg As Range, Fichier As
String


Fichier = "C:excelADO.xls"

Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Fichier & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"""

Rst.Open "Select * from [Feuil1$] ", Conn, _
adOpenKeyset, adLockOptimistic

If Rst.RecordCount > 0 Then
Rst.MoveFirst
End If

With Worksheets("Feuil2")
Set Rg = .Range("A1:C10")
End With
B = Rg.Rows.Count
For A = 1 To B
Rst.AddNew
Rst.Fields(0) = Rg.Item(A, 1)
Rst.Fields(1) = Rg.Item(A, 2)
Rst.Fields(2) = Rg.Item(A, 3)
Rst.Update
Rst.MoveNext
Next
Rst.Close: Conn.Close
Set Rst = Nothing
Set Conn = Nothing

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


Salutations!




"Xoco" a écrit dans
le message de news:0d5e01c3bb47$493a8570

$
Bonjour a tous,

Je cherche a ecrire dans un fichier fermé mais a un
emplacement dynamique, comme la derniere ligne...

grace a la macro de Rob Bovey, je sais ecrire dans un
fichier fermé en utilisant la connexion ADO, mais je ne
sais comment faire pour me positionner a la derniere ligne
du fichier fermé
voici le code de Rob Bovey


' 2 - Ecrire dans un classeur fermé

Sub EcritDatas()
Dim Fich$, cell As Range

Fich = "d:TestAdo.xls" 'à adapter

'écrit dans le classeur fermé la valeur des cellules
A1:A5
'du classeur actif
For Each cell In ActiveWorkbook.Sheets("Feuil1").Range
("A1:A5")
SetExternalDatas Fich, "Feuil1", cell.Address(0, 0),
cell.Text
Next

'écrit en A6 la date et l'heure de l'opération
SetExternalDatas Fich, "Feuil1", "A6", "mise à jour du "
& Now

'on regarde le résultat
DoEvents
Workbooks.Open Fich

End Sub

'écrit DataToWrite dans la cellule DestCellAdr
'de la feuille DestFeuille du classeur fermé DestFile
Sub SetExternalDatas(DestFile As String, _
DestFeuille As String, _
DestCellAdr As String, _
DataToWrite As Variant)
Dim oConn As ADODB.Connection
Dim oCmd As ADODB.Command
Dim oRS As ADODB.Recordset
Dim RangeDest
'd'après Rob Bovey, mpep

' Open a connection to the Excel spreadsheet
Set oConn = New ADODB.Connection
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DestFile & ";" & _
"Extended Properties=""Excel 8.0;HDR=No;"";"

' Create a command object and set its ActiveConnection
Set oCmd = New ADODB.Command
oCmd.ActiveConnection = oConn

' This SQL statement selects a cell range in
the "feuilleTest" worksheet.
'1 Sélection pour écrire dans une seule cellule
RangeDest = DestCellAdr & ":" & DestCellAdr
oCmd.CommandText = "SELECT * from `" & DestFeuille & "$"
& RangeDest & "`"

' Open a recordset containing the worksheet data.
Set oRS = New ADODB.Recordset
oRS.Open oCmd, , adOpenKeyset, adLockOptimistic

' Update last row
oRS(0).Value = DataToWrite
oRS.Update

'Close the connection
oConn.Close
Set oConn = Nothing
Set oCmd = Nothing
Set oRS = Nothing

End Sub


Si vous avez une idee,
Meilleurs salutations...
Xoco



.



Avatar
Merci michel, ca marche enfin, et grace a ton aide...
Disons plutot que sans ton aide, ca aurait jamais marché,
alors je t envoie plein de mercis directement du pays des
mayas...
a+



-----Message d'origine-----
Et j'irai même plus loin, pour que ça marche, il faut
qu'au moins 1 ligne

contienne autant de valeurs que tu veux en écrire.
C'est à dire que si tu veux écrire dans 5 cellules, il
faut que la plage

A1:A5 contienne déjà des valeurs.
MP

"Michel Pierron" a écrit dans le
message de

news:u%
Encore moi;
Est-ce que par hasard, ton fichier est vierge ?
Il faut que dans le fichier dans lequel tu veux écrire,
qu'au minimum, la


cellule A1 contienne une valeur.
MP

a écrit dans le
message de


news:038301c3bb78$b10f37a0$
J'ai compris ca...
Mais il prends bien ors(0), mais des que j'essaie
d'affecter une valeur a ors(x) ou x>0, il plante en
disant


le message que je t'ai mis sur le message precedent.
Pt etre bien que c comme les tableau, et qu'il faut que
je


declare la taille de ors, mais je sais pas ou le
faire....


En tout cas, tu dois pas etre loin de te coucher, alors
Bonne nuit (ici, il est 15.40 alors on continue a
bosser :(


A+


-----Message d'origine-----
Re moi;
Lorsque tu précises oRS.AddNew, tu demandes à écrire
une



nouvelle ligne dans
laquelle oRS(0) est la première cellule, oRS(1) la
deuxième et ainsi de

suite sur la largeur de plage définie; ensuite,
oRS.Update entérine les

données que tu viens d'inscrire. Si tu veux ajouter une
nouvelle ligne, il

faut repréciser réitérer le processus avec oRS.AddNew
etc...

MP

a écrit dans le
message de

news:045a01c3bb72$0848a3f0$
Michel,

Premierement, je dois te dire que je maitrise pas trop
ni



Excel, ni ADO, et que je suis désolé de te demander
tout



ca, tu m'as deja bcp aidé et je t en remercie, parce
que



j'ai posté sur bcp de forum, et tu es le seul a m avoir
repondu...

Peux tu me donner encore une toute ptite info...
Effectivement, ca le fait,mais ce que je craignais
arriva,



a savoir, qu'il fait un movenext, et un addnew pour
chaque



element, or, moi je veux insérer une ligne entiere, et
non



un colonne...
En gros, il faudrait que je puisse definir une
condition



genre : "si c la premiere cellule du lot, addnew,
sinon,



insere dans la cellule a droite"

Si j'ai bien compris, pour inserer sur une seul ligne,
je dois utiliser ors(0),ors(1),etc...
Le pb, c qu'il me sort une erreur sur:
ors(1).valueÚtatowrite
en me disant En Francais (donc d'origine ODBC,
j'imagine



puisque je l'ai ajouté en francais,et que le systeme
est



espagnol)
"Impossible de trouver l'objet dans la collection
correspondant au nom ou a la reference ordinale (1)
demandé", en gros, il existe pas ors(1)...

Et moi, je m'y perds un peu, mais pire, je me sens un
peu



démuni :)
Bref, je continue, je continue, et merci pour ton
aide...



Julien




-----Message d'origine-----
Re;
C'est probablement ta définition de RangeDest qui
n'est




pas bonne; si tu
n'as qu'une feuille, laisse tomber DestFeuille et
essaie




avec:
oCmd.CommandText = "SELECT * FROM `A1:IV65536`"

MP

a écrit dans le
message de

news:01a101c3bb5d$27046d20$
Michel, ya quelque chose de bon avec ce que tu me dis,
dans la mesure ou sur mon premier test, il m'a
remplacé




une valeur, mais il a inséré la date la ou je voulais,
mais apres plus rien, et il me donne une erreur :
"No se puede expandir el intervalo con nombre" (je
suis




au
mexique),
ce qui signifie :
"On ne peut pas développer l'intervalle avec nom"
sur ton code que j'essaie d'adapter...
Mais je bataille grave sur cette erreur...
Merci pour tes conseils, j'espere y arriver dans pas
trop




longtemps...
a+
oRS.MoveLast
'oRS(0).Value = DataToWrite
oRS.Update
'* Add a new row
oRS.AddNew
oRS(0).Value = Date
'oRS(1).Value = DataToWrite
'oRS(2).Value = 9
oRS.Update




-----Message d'origine-----
Salut Xoco;
Essaie avec :

'* Update Row
oRS.MoveLast
oRS(0).Value = DataToWrite
oRS.Update
'* Add a new row
oRS.AddNew
oRS(0).Value = Date
oRS(1).Value = DataToWrite
oRS(2).Value = 9
oRS.Update

MP

"Xoco" a écrit
dans



le message de
news:0d5e01c3bb47$493a8570$
Bonjour a tous,

Je cherche a ecrire dans un fichier fermé mais a un
emplacement dynamique, comme la derniere ligne...

grace a la macro de Rob Bovey, je sais ecrire dans un
fichier fermé en utilisant la connexion ADO, mais je
ne





sais comment faire pour me positionner a la derniere
ligne


du fichier fermé
voici le code de Rob Bovey


' 2 - Ecrire dans un classeur fermé

Sub EcritDatas()
Dim Fich$, cell As Range

Fich = "d:TestAdo.xls" 'à adapter

'écrit dans le classeur fermé la valeur des
cellules





A1:A5
'du classeur actif
For Each cell In ActiveWorkbook.Sheets
("Feuil1").Range





("A1:A5")
SetExternalDatas Fich, "Feuil1", cell.Address(0,
0),





cell.Text
Next

'écrit en A6 la date et l'heure de l'opération
SetExternalDatas Fich, "Feuil1", "A6", "mise à jour
du "


& Now

'on regarde le résultat
DoEvents
Workbooks.Open Fich

End Sub

'écrit DataToWrite dans la cellule DestCellAdr
'de la feuille DestFeuille du classeur fermé DestFile
Sub SetExternalDatas(DestFile As String, _
DestFeuille As String, _
DestCellAdr As String, _
DataToWrite As Variant)
Dim oConn As ADODB.Connection
Dim oCmd As ADODB.Command
Dim oRS As ADODB.Recordset
Dim RangeDest
'd'après Rob Bovey, mpep

' Open a connection to the Excel spreadsheet
Set oConn = New ADODB.Connection
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & DestFile & ";" & _
"Extended Properties=""Excel
8.0;HDR=No;"";"






' Create a command object and set its
ActiveConnection





Set oCmd = New ADODB.Command
oCmd.ActiveConnection = oConn

' This SQL statement selects a cell range in
the "feuilleTest" worksheet.
'1 Sélection pour écrire dans une seule cellule
RangeDest = DestCellAdr & ":" & DestCellAdr
oCmd.CommandText = "SELECT * from `" & DestFeuille
& "$"


& RangeDest & "`"

' Open a recordset containing the worksheet data.
Set oRS = New ADODB.Recordset
oRS.Open oCmd, , adOpenKeyset, adLockOptimistic

' Update last row
oRS(0).Value = DataToWrite
oRS.Update

'Close the connection
oConn.Close
Set oConn = Nothing
Set oCmd = Nothing
Set oRS = Nothing

End Sub


Si vous avez une idee,
Meilleurs salutations...
Xoco


.




.




.







.







1 2