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

Résolu/Fermé
Jodu34130 Messages postés 5 Date d'inscription mercredi 24 mai 2017 Statut Membre Dernière intervention 30 juillet 2020 - Modifié le 3 août 2017 à 09:45
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 - 1 août 2017 à 17:03
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
A voir également:

1 réponse

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
1 août 2017 à 11:26
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
Jodu34130 Messages postés 5 Date d'inscription mercredi 24 mai 2017 Statut Membre Dernière intervention 30 juillet 2020
Modifié le 1 août 2017 à 14:07
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > Jodu34130 Messages postés 5 Date d'inscription mercredi 24 mai 2017 Statut Membre Dernière intervention 30 juillet 2020
1 août 2017 à 14:09
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
Jodu34130 Messages postés 5 Date d'inscription mercredi 24 mai 2017 Statut Membre Dernière intervention 30 juillet 2020
1 août 2017 à 14:18
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
f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701 > Jodu34130 Messages postés 5 Date d'inscription mercredi 24 mai 2017 Statut Membre Dernière intervention 30 juillet 2020
Modifié le 1 août 2017 à 14:25
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
Jodu34130 Messages postés 5 Date d'inscription mercredi 24 mai 2017 Statut Membre Dernière intervention 30 juillet 2020
1 août 2017 à 14:56
J'ai :
Microsoft ActiveX Data Objects Recordset 6.0 Library
Microsoft ActiveX Data Objects 6.1 Library
Cela devrait marcher non?
0