OVH Cloud OVH Cloud

Ecrire dans un classeur fermé (idem Macro F. Sigonneau)

3 réponses
Avatar
Sylvain
Bonjour,

J'utilise la macro de Fr=E9d=E9ric Sigonneau GetExternalData=20
dispos sur Excelabo.
Quelqu'un connait-il la m=EAme macro pour =E9crite dans un=20
classeur sans l'ouvrir ?

Merci par avance
Sylvain

3 réponses

Avatar
Maxence HUBICHE
Le seul moyen que tu aurais de faire cela serait
d'attaquer le fichier en Open binary, et de connaitre très
exactement les offset où tu peux écrire.

Le VBA, c'est le Visual Basic pour Application. Tu noteras
le POUR application. Donc, tu passes par l'application,
donc ton classeur, il serait bien de l'ouvrir.

Maintenant, tu peux utiliser OLE Automation pour créer une
nouvelle instance d'Excel invisible et ouvrir dans cette
instance ton classeur, si c'est juste une question de
visualisation.

Dim oxlApp as New Excel.Application
Dim oxlWkb as Excel.WorkBook
set oxlWKB=oxlApp.WorkBooks.Open("tonfichier.xls")

Et ensuite, tu utilises ta variable oxlWKB comme étant le
classeur à modifier.

oxlWkb.Save
oxlWKB.close
set oxlWKB=Nothing
oxlApp.Quit
set oxlApp=Nothing

Pour terminer.



-----Message d'origine-----
Bonjour,

J'utilise la macro de Frédéric Sigonneau GetExternalData
dispos sur Excelabo.
Quelqu'un connait-il la même macro pour écrite dans un
classeur sans l'ouvrir ?

Merci par avance
Sylvain
.



Avatar
Denis Michon
Bonjour Maxence, Sylvain,

Le seul bémol et il est important, c'est que la communication entre les 2 instances d'une même application excel n'est pas
évidente. L'utilisation des méthodes et propriétés des objets ne s'appliquent plus si on écrit du code faisant référence à un
objet de l'autre instance. Et c'est bien normal... puisque chaque instance qui est ouverte à son propre "moteur - pilote"
pour gérer l'application.

Un petit exemple simple pour illustrer le propos :

'Issue d'une instance
Set rg = ThisWorkbook.worksheets("Feuil1").range("A1:A10")

Issue d'un autre instance :

Set rg1= Workbooks(2).worksheets("Feuil1").range("A1")

Si on veut copier la plage Rg vers la plage rg1, on ne peut compter sur une ligne de code du type :

rg.copy rg1

Cela ne fonctionne pas



Salutations!






"Maxence HUBICHE" a écrit dans le message de
news:034b01c3bb20$9625c0b0$
Le seul moyen que tu aurais de faire cela serait
d'attaquer le fichier en Open binary, et de connaitre très
exactement les offset où tu peux écrire.

Le VBA, c'est le Visual Basic pour Application. Tu noteras
le POUR application. Donc, tu passes par l'application,
donc ton classeur, il serait bien de l'ouvrir.

Maintenant, tu peux utiliser OLE Automation pour créer une
nouvelle instance d'Excel invisible et ouvrir dans cette
instance ton classeur, si c'est juste une question de
visualisation.

Dim oxlApp as New Excel.Application
Dim oxlWkb as Excel.WorkBook
set oxlWKB=oxlApp.WorkBooks.Open("tonfichier.xls")

Et ensuite, tu utilises ta variable oxlWKB comme étant le
classeur à modifier.

oxlWkb.Save
oxlWKB.close
set oxlWKB=Nothing
oxlApp.Quit
set oxlApp=Nothing

Pour terminer.



-----Message d'origine-----
Bonjour,

J'utilise la macro de Frédéric Sigonneau GetExternalData
dispos sur Excelabo.
Quelqu'un connait-il la même macro pour écrite dans un
classeur sans l'ouvrir ?

Merci par avance
Sylvain
.



Avatar
Papyty
Bonjour @ tous et à Sylvain :
Quelqu'un connait-il la même macro pour écrite dans un
classeur sans l'ouvrir ?


J'ai deux soluces piochées sur le net mais pas testées donc à voir
Désolé pour les auteurs mais je ne peux les citer:
_________________________________________________
Sub ExportData()

fichDest = "D:OLE_Test.xls"
'Open the ADO connection to the Excel workbook
Set oConn = New ADODB.Connection
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & fichDest & ";" & _
"Extended Properties=""Excel 8.0;HDR=NO;IMEX=2;"""

'Add values to individual cells
oConn.Execute "Insert into Cible (F1) Values ('Fredo')"

'Close the connection
oConn.Close

'Open the workbook to examine the results
DoEvents
Workbooks.Open fichDest
End Sub
________________________________________________________________

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
___________________________________________________________
--
@+
Thierry
05/12/2003 22:39:15