Copier données d'un classeur fermé vers classeur ouvert (VBA)

Résolu/Fermé
Signaler
Messages postés
6
Date d'inscription
mercredi 24 mai 2017
Statut
Membre
Dernière intervention
30 juillet 2020
-
Messages postés
16198
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
23 janvier 2022
-
Bonjour,
Après de nombreuses recherches sur comment copier des données d'un classeur fermé vers un classeur ouvert avec VBA, j'en viens à créer un sujet car je ne comprend pas d'ou vient mon problème. Voici mon code :

Sub ExtraireValeurFichierFermé()
    Dim Source As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim ADOCommand As ADODB.Command
    Dim Fichier As String, Cellule As String, Feuille As String
 
    'Adresse de la plage contenant les données à récupérer
    Cellule = "A13:D20000" 'j'ai essayé avec une plage dynamique de type Range("A13:Q13").Select puis en dessous Range(Selection, Selection.End(xlDown)).Select mais cela ne marche pas

    Feuille = "Detail Tickets Aux Fournisseurs$" 'c'est le nom de ma feuille avec $ à la fin
    'Chemin complet du classeur fermé ci-dessous
    Fichier = "S:\Mails\Acc.xlsx"
 
    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=0;"
 
    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
    End With
 
    Set Rst = New ADODB.Recordset
    Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
 
    Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
 
    'dans le code initial la personne colle ses données en A2 ce qui donne Range("A2").CopyFromRecordset Rst
    'mais en ce qui me concerne j'aimerais coller les données les unes à la suite des autres car j'aurais des données à aller chercher dans plusieurs fichiers fermés du coup j'ai tenté ça :
    Range("A1048576").End(xlUp).Select
    ActiveCell.Offset(1, 0).Select
    Selection.CopyFromRecordset Rst
    
    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
End Sub


A savoir que Le fichier fermé est en XLSX, que j'utilise Excel 2013 et que j'ai bien activé Microsoft ActiveX Data Objects recordset 6.0 Library et Microsoft ADO Ext. 6.0 for DDL and Security pour permettre les connexions.

Le code bug en disant que "run time error 3001: arguments are of the wrong type, are out of acceptable range, or are in conflict with one another" à ce niveau là:

    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=0;
"

Est-ce une question de ACE au lieu de JET ? ou bien de OLEDB.12 au lieu de .4 ?

Tout indice serait génial.

Merci pour votre aide

Ben

1 réponse

Messages postés
16198
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
23 janvier 2022
1 580
Bonjour,
pour Excel 2013
Source.Open "Provider=Microsoft.Jet.OLEDB.15.0;" & _
"Data Source=" & Fichier & ";Extended Properties=""Excel 15.0;HDR=No;IMEX=0;"
0
Messages postés
6
Date d'inscription
mercredi 24 mai 2017
Statut
Membre
Dernière intervention
30 juillet 2020

J'ai la version 2010 d'Office je me suis trompé, du coup j'ai essayé avec 12.0 mais cela ne marche toujours pas et me met le même message d'erreur : "run time error 3001: arguments are of the wrong type, are out of acceptable range, or are in conflict with one another"
0
Messages postés
16198
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
23 janvier 2022
1 580 >
Messages postés
6
Date d'inscription
mercredi 24 mai 2017
Statut
Membre
Dernière intervention
30 juillet 2020

Re,

12: Excel2007
14: Excel2010

Set Source = New ADODB.Connection
    With Source
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.14.0;Data Source=" _
             & Fichier & ";Extended Properties=""Excel 14.0;HDR=No;IMEX=0;"""
            .Open
        End With
0
Messages postés
6
Date d'inscription
mercredi 24 mai 2017
Statut
Membre
Dernière intervention
30 juillet 2020

Re,
J'ai essayé avec ton bout de code et le message d'erreur est le suivant : "run time error 3706 : provider cannot be found. It may not be properly installed" et apparait sur le .Open
Est-ce du au fait que le .Provider = "Microsoft.Jet.OLEDB.4.0" est différent du Provider dans .ConnectionString = "Provider=Microsoft.ACE.OLEDB.14.0 ?
0
Messages postés
16198
Date d'inscription
dimanche 25 novembre 2007
Statut
Membre
Dernière intervention
23 janvier 2022
1 580 >
Messages postés
6
Date d'inscription
mercredi 24 mai 2017
Statut
Membre
Dernière intervention
30 juillet 2020

Re,
Mettre
.Provider = "Microsoft.Jet.OLEDB.4.0"

en commentaire
apres faut voir ce que vous avez en references cochees
J'utilise ceci
Set Source = CreateObject("ADODB.connection")
'ald
Set Source = New ADODB.Connection
0
Messages postés
6
Date d'inscription
mercredi 24 mai 2017
Statut
Membre
Dernière intervention
30 juillet 2020

J'ai :
Microsoft ActiveX Data Objects Recordset 6.0 Library
Microsoft ActiveX Data Objects 6.1 Library
Cela devrait marcher non?
0