Ecrire dans un classeur fermé (idem Macro F. Sigonneau)
3 réponses
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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 .
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 ?
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 .
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 .
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" <anonymous@discussions.microsoft.com> a écrit dans le message de
news:034b01c3bb20$9625c0b0$a001280a@phx.gbl...
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 ?
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 .
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
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
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