VBA Excel mise à jour fichier sans l'ouvrir
danielc0 Messages postés 2053 Date d'inscription Statut Membre Dernière intervention -
J'ai actuellement 2 fichiers excel qui ont des intitulés de colonne identiques. Le premier est une extraction d'une application autre qu'excel et le second un fichier avec macro VBA Classique.
Ma demande : y'a-t-il une astuce pour copier les lignes du premier fichier vers le second sans ouvrir les fichiers, et cela, tous les matins à la même heure?
Je vous remercie par avance de l'attention que vous porterez à ma question!
- Vba ouvrir un fichier excel sans l'afficher
- Comment ouvrir un fichier epub ? - Guide
- Comment ouvrir un fichier bin ? - Guide
- Comment ouvrir un fichier docx ? - Guide
- Ouvrir un fichier .dat - Guide
- Comment réduire la taille d'un fichier - Guide
8 réponses
La solution technique principale consiste à utiliser une connexion ADO pour lire ou écrire dans un fichier Excel fermé afin de copier des lignes d'un fichier source vers le fichier cible sans les ouvrir manuellement. Il faut activer la référence Microsoft ActiveX Data Objects dans l’environnement de développement et configurer la connexion avec un fournisseur adapté (par exemple Jet.OLEDB et Extended Properties=Excel 8.0). Des exemples existent pour effectuer des opérations de lecture et d’écriture dans des classeurs fermés, ce qui permet d’automatiser le transfert à une heure précise chaque jour. Des alternatives évoquées incluent des stratégies basées sur des liaisons Office ou des macros sans ADO, mais leur implémentation varie selon l’environnement et la version d’Excel.
Tu peux utiliser une connexion ADO pour lire ou ecrire dans un fichier Excel fermé.
Sub ADOcnx_XL_Close()
'Cochez la ligne "Microsoft ActiveX Data Objects x.x Library".
'dans Outils > Références...
Dim Cnx As ADODB.Connection
Dim Fichier As String
'Définit le classeur fermé servant de base de données (mettre le chemin complet)
Fichier = "C:\monClasseur.xls"
Set Cnx = New ADODB.Connection
'--- Connexion ---
With Cnx
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & Fichier & _
";Extended Properties=Excel 8.0;"
.Open
End With
'Extended Properties=Excel 8.0 est utilisé pour les versions d'Excel 97, 2000 et 2002.
'
'... la requête ...
'
'--- Fermeture connexion ---
Cnx.Close
Set Cn = Nothing
End Sub
;o)
il y aura toujours un fichier ouvert: celui où il y a la macro de commznde... donc, je suggèrerais d'effectuer une lecture simple du fichier "source" vers le 2° où il il ya déjà du VBA
vous pourrez trouver ci joint exemples de liaisons office (excel-access-word) en technologie ADO avec lecture-écriture dans un excel fermé...fichier de commande: home_ado.xls
http://www.cijoint.fr/cjlink.php?file=cj200902/cijpjc7JtG.zip
(depuis pas mal de choses se sont améliorées)
toutefois, par rapport à cette démo, on peut éviter d'avoir à cocher la référence ADO dans les références
ce qui évite de param^trer chaque ordi.
dim source as object
dim requete as object
'chemin et fichier sont ici des variables globales venant d'ailleurs
Set Source = CreateObject("ADODB.Connection")
Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & Chemin & "\" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
Set Requete = CreateObject("ADODB.Recordset")
....
requete.close
source.close
set requete=nothing
set source=nothing
HDR=NO est utilisé quand il n'y a pas d'étiquettes (ou nom de champ), si tel est le cas, il faut préciser l'onglet- feuille et la plage de cellule par exemple:
Set requete = source.Execute("SELECT * FROM `" & onglet & "$" & zone & "` WHERE '" & champ & "' <>"""";")
non précisé ADO cherchera les étiquettes (HDR=Header)
Quelquesoit la version WIN-office utilisée laisser extended properties à 8.0; ADO comprendra dans des versions postérieures...
Je tiens à citer
http://frederic.sigonneau.free.fr/
site incontournable pour tout excelien accro!
Maintenant, si tu n'as pas beaucoup de données-cellules à transfèrer tu pêux utiliser la macro dite de Walkenbach sans faire appel à ADO
autre exemple (le nom de fichier était dans un combobox):
' modèle pour écrire param='C:\mes documents\riri\[Classeur1.xls]Classeur1Feuil3'!L1C1 param = "'" & chemin & "\[" & Me.CbxClasseur.Value & "]" & onglet & "'!R1C1" ' macro dite de John Walkenbach champ = ExecuteExcel4Macro(param)
mais il faut soit boucler, soit écrire autant de lignes qu'il y a de cellules
sur DVP.com AUTEUR: Silkyroad
https://silkyroad.developpez.com/VBA/ClasseursFermes/#LIV-B
'Met à jour la valeur du "Champ4" si le "Champ2" correspond à la variable "leNom"
strSQL = "UPDATE [" & Feuille & "$] SET " & _
"Champ4 = " & PrixUnit & " WHERE Champ2 = '" & leNom & "'"
Ca dépend de ton 1er fichier, quel est sa provenance, sont type ? c'est un calsseur excel ?
Donne des explications plus détaillées
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionCa m'intérèsserais de savoir comment écrire dans le classeur fermer :-)
a) Remplacer une ligne.
b) Ajouter après la dernière ligne.
A la place ou tu a mis .. la requête
Merci d'avance.
A+
Voilà un exemple pour ajouter une ligne
Sub InsertRecord(ByVal nom As String, Byval prenom As String, ByVal age As Integer)
Dim Cnx As ADODB.Connection
Dim Fichier As String, Feuille As String, strSQL As String
Fichier = "C:\maBase.xls" 'chemin complet du fichier fermé
Feuille = "Adhérants" 'Onglet où les données doivent être insérées
Set Cnx = New ADODB.Connection
With Cnx
.Provider = "MSDASQL"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
"DBQ=" & Fichier & "; ReadOnly=False;"
.Open
End With
'Les données doivent être indiquées dans le même ordre que les champs dans la base de données.
strSQL = "INSERT INTO [" & Feuille & "$] " _
& "VALUES ( '" & nom "', '" & prenom & "', " & age & ")"
Cnx.Execute strSQL
Cnx.Close
Set Cnx = Nothing
End Sub
On peut également modifier une donnée dans une cellule selon un critère. La requête aurait cette forme :
strSQL = "UPDATE [" & Feuille & "$] SET " & _
"Champ4 = " & age & " WHERE Champ2 = '" & nom & "'"
;o)
J'avais déja trouver pour lire mais je ne parvenais pas à écrire dans le classeur fermer.
J'ai aussi trouver le dernier lien donné par Michel mais je ne voulais pas encore mélanger ADO et SQL, une chose à la fois :-)
Encore merci à vous deux.
A+
De rien, c'est aussi en m'aidant du lien donné par Michel que je me suis fait un module permettant de lire et écrire dans un classeur fermé. Il faut néanmoins que le classeur fermé soit cohérent. Par exemple, pas de cellules fusionnées, les données insérées doivent être du même type que le format des cellules du classeur fermé etc ...
Bon dimanche.
;o)
j'ai un classeur qui contient plusieur feuille et je veux chaque feuille contient un ou plusier tableaux et je veux selectioné un champ par exemple "B9" dans la feuille "productionjour" et l'affiché dans une interface que j'ai la créer moi meme avec vb 6 si quelqu'un peut me donné la procedure je serai reconnaissant
Bonjour,
Je n'arrive pas à utiliser les références ADO elles ne sont peut-être pas activer sur mon poste et je ne trouve pas comment le faire
Il y a écrit dans les références du projet et de cocher la case réference ADO mais aucun moyen de le trouver.
Merci pour votre aide
Bonjour,
Coche la référence :
Microsoft ActiveX Data Objects x.x
Daniel