VBA Excel mise à jour fichier sans l'ouvrir

Rochelle13 -  
danielc0 Messages postés 1856 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

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!
A voir également:

8 réponses

Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Bonjour,

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)
2
Cha
 

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

0
danielc0 Messages postés 1856 Date d'inscription   Statut Membre Dernière intervention   229 > Cha
 

Bonjour,

Coche la référence :

Microsoft ActiveX Data Objects x.x

Daniel

0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 313
 
bonjour,

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
1
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 313
 
Pour modifier un enregistrement dans un classeur fermé j'ai trouvé ceci
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 & "'"

1
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bonjour,
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+
0
Rochelle13
 
Oui désolée j'ai oublié de préciser.

Mon deuxième fichier est un fichier Excel.

Min premier fichier a un format : Microsoft Office Excel Comma Separated Values File

Est ce que ces informations suffisent?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Microsoft Office Excel Comma Separated Values File ?
Quel version d'excel ?
0
Rochelle13
 
La version d'Excel : Excel 2003.

Pour le format que j'ai donné (Microsoft Office Excel Comma Separated Values File), c'est ce qui est écrit dans "type de fichier" lorsque je fais propriété du fichier.
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Bonjour Polux,
Ca 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+
0
Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Bonjour lermite,

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)
0
lermite222 Messages postés 8724 Date d'inscription   Statut Contributeur Dernière intervention   1 191
 
Polux, Michel, Merci pour tout ces exemples.
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+
0
Polux31 Messages postés 6917 Date d'inscription   Statut Membre Dernière intervention   1 204
 
Bonjour lermite,

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)
0
Utilisateur anonyme
 
boujour tous ,

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
-1