VBA Excel mise à jour fichier sans l'ouvrir

Rochelle13 -  
danielc0 Messages postés 2209 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!

8 réponses

Résumé de la discussion

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.

Bobot (l'IA à votre service)
  1. Polux31 Messages postés 7219 Statut Membre 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
    1. 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
      1. danielc0 Messages postés 2209 Date d'inscription   Statut Membre Dernière intervention   292 > Cha
         

        Bonjour,

        Coche la référence :

        Microsoft ActiveX Data Objects x.x

        Daniel

        0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
    1. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Microsoft Office Excel Comma Separated Values File ?
    Quel version d'excel ?
    0
    1. 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
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
    1. Polux31 Messages postés 7219 Statut Membre 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
  8. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
    1. Polux31 Messages postés 7219 Statut Membre 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
  9. baatanass
     
    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