IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Import de données d'un fichier fermé


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2013
    Messages : 186
    Par défaut Import de données d'un fichier fermé
    Bonsoir a tous
    Actuellement sur les imports de données excel d'un fichier fermée depuis un fichier ouvert, j'ai trouvé ce code sur le site.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Sub RequeteClasseurFerme()
    'exemple https://silkyroad.developpez.com/VBA/ClasseursFermes/#LIII-C'
     
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\Users\xxx\Documents\Doc EXEL_ACCESS\Classeur1.xlsx"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Feuil1"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Ecrit le résultat de la requête dans la cellule A2
        Range("A2").CopyFromRecordset Rst
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    Malheureusement j'ai une erreur de type " erreur d'exécution3706- Erreur définie par l'application ou par objet "
    je suis sur excel 365 voici les références cochées.
    Nom : Capture d’écran 2022-08-23 210732.jpg
Affichages : 427
Taille : 24,7 Ko
    Etant novice, j'imagine que les lignes suivantes sont fausse car étant sur excel365 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
    Malgré mes lectures je suis perdu.
    Pouvez vous m'aider ?
    Merci pour votre soutien

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 033
    Par défaut
    Bonjour,
    Je n'utilise pas souvent cette méthode car je n'y vois pas trop l'avantage, mais bref, peut-être que votre problème vient de "Microsoft.Jet.OLEDB.4.0" qui date un peu (Excel 8.0), à remplacer par "Microsoft.ACE.OLEDB.12.0".

    Ce qui donne (d'après mes archives, et c'est à tester) :

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    ' Exemple d'utilisation:
    Dim Enr As Variant
    Set Enr = Charger_Classeur("P:\MonFichier.xlsx", "SELECT * FROM [Feuil1$A:Z]")
    If Not Enr Is Nothing Then
        ActiveSheet.Range("A1").CopyFromRecordset Enr
    End If
     
    '------------------------------------------------------------------------------------------------
    Public Function Charger_Classeur(Fichier As String, StrSQL As String) As Variant  ' => ADODB.Recordset
    '------------------------------------------------------------------------------------------------
    ' Charge les données d'un classeur Excel par la méthode ADODB, sans l'ouvrir.
    ' Nécessite de connaître le nom de la feuille concernée,
    ' Ne prend pas en charge le nom des tableaux structurés (passer une adresse de type A1:B2 ou rien).
    '------------------------------------------------------------------------------------------------
    ' Fichier : Le classeur Excel.
    ' StrSQL : La requête qui inclue éventuellement le nom des colonnes, le nom de la feuille (suivi de $)
    ' et éventuellement la plage désirée.
    '------------------------------------------------------------------------------------------------
    ' La liaison anticipée nécessite d'installer la référence : Microsoft ActiveX Data Objects 6.0 Library
    ' La liaison tardive permet de ne pas référencer la bibliothèque ADODB.
    ' L’instanciation d’objets à l’aide de la liaison tardive est généralement plus lente
    ' que l’utilisation de la liaison anticipée.
    ' Ici la liaison tardive a été adoptée uniquement pour vous éviter d'installer manuellement une
    ' référence et donc simplifier la portabilité du code.
    ' Les remarques ci-dessous indiquent comment adapter le code pour une liaison anticipée.
    '------------------------------------------------------------------------------------------------
    ' Provider et Extended à utiliser:
    ' Soit Microsoft.Jet.OLEDB.4.0 et Excel 8.0
    ' Soit Microsoft.ACE.OLEDB.12.0 et Excel 12.0 (voire Excel 14.0)
    '------------------------------------------------------------------------------------------------
    Dim Cnn As Variant  ' Liaison anticipée => As ADODB.Connection
    Dim Rs As Variant   ' Liaison anticipée => As ADODB.Recordset
     
    ' Gestion des erreurs:
    On Error GoTo Gest_err
    Err.Clear
    Set Charger_Classeur = Nothing
     
    ' Création d'une connexion:
    Set Cnn = CreateObject("ADODB.Connection") ' Liaison anticipée => Set Cnn = New ADODB.Connection
    Cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
             "Data Source=" & Fichier & ";" & _
             "Extended Properties=""Excel 12.0;HDR=Yes"";"
     
    ' Exécute une requête SQL sur un jeu d'enregistrements:
    Set Rs = CreateObject("ADODB.Recordset") ' Liaison anticipée => Set Rs = New ADODB.Recordset
    Rs.Open StrSQL, Cnn, 1, 2, 1 ' Liaisons anticipée => adOpenKeyset, adLockPessimistic, adCmdText
     
    ' S'il y a des enregistrements concernés:
    If Rs.EOF = False Then
        Rs.MoveFirst             ' Replace le pointeur au début du jeu d'enregistrements (facultatif).
        Set Charger_Classeur = Rs  ' Renvoie les enregistrements.
    End If
     
    ' Fin du traitement, libération des mémoires:
    Gest_err:
    Set Rs = Nothing
    Set Cnn = Nothing
    If Err.Number <> 0 Then Set Charger_Classeur = Nothing
    Err.Clear
     
    End Function
    '----------------------------------------------------------------------------------------
    Bon continuation.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2013
    Messages : 186
    Par défaut
    Bonsoir laurent_ott et merci pour votre retour.
    Je vais y regarder.
    J'ai pris cet exemple (code simple) pour étudier les liaisons entre fichiers car je suis débutant.
    Si toutefois vous avez des exemples de copie/transfert de données d'un fichier fermé je suis preneur.
    Je lance un appel sur le forum, évidement sur excel365 se serait le grâle.
    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 291
    Par défaut
    Bonsoir
    Je ne suis pas certain d'avoir bien compris le problème mais Power Query permet d'importer des données d'un classeur fermé en quelques clics.
    Pourquoi passer par des macros ?
    Stephane

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2013
    Messages : 186
    Par défaut
    Bonsoir et merci pour votre retour
    Effectivement je l'ai déjà fait avec Power Query qui fonctionne.
    Malheureusement on n'arrive pas à automatiser le chemin du fichier de données (fichier qui a toujours le même non) qui se trouve dans le même dossier que le fichier qui récupère les données (aussi toujours le même nom).
    Car il faut le chemin complet sur Power Query et le dossier ou se trouve les deux fichiers passe sur serveur ou en local avec une arborescence complexe.

    Je suis toujours preneur d'infos, encore des messages d'erreur

  6. #6
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 291
    Par défaut
    Dans Power Query je ne pense pas qu'on puisse connaître le chemin du fichier en cours
    par contre on peut le faire par formule dans Excel

    Dans une cellule : =GAUCHE(CELLULE("nomfichier";A1);TROUVE("[";CELLULE("nomfichier";A1))-1) renvoie le nom du dossier
    Vous nommez cette cellule et vous la chargez dans Power Query, un clic droit sur le nom obtenu vous donnera le chemin en texte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     = Excel.CurrentWorkbook(){[Name="chemin"]}[Content]{0}[Column1]
    ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    = Excel.Workbook(File.Contents( Chemin & "xxxx.xlsx"), null, true)
    Stéphane

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 576
    Par défaut
    Bonsoir,
    je pense également qu'il faut privilégier Power Query mais je te propose quand même avec ADO!

    notes qu'Excel 8 ne gère pas XLSX et XLSM c'est au minimum le 12
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
    With Sheets("Feuil2")
        .Range(.Range("A2"), .Cells(.Cells.Rows.Count, "Z")).Delete
        Charger_Classeur .Range("A2"), "P:\MonFichier.xlsx", "SELECT * FROM [Feuil1$]", True
    End With
    End Sub
    Public Function Charger_Classeur(R As Range, Fichier As String, StrSQL As String, AvecTitre As Boolean) As Variant  ' => ADODB.Recordset
    Dim Cn As String: Cn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Fichier & ";Extended Properties=""Excel 12.0;HDR=" & Array("No", "YES")(Abs(AvecTitre)) & ";"""
    With CreateObject("Adodb.connection")
        .Open (Cn)
        R.CopyFromRecordset .Execute(StrSQL)
        .Close
    End With
    End Function

  8. #8
    Membre confirmé
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2013
    Messages : 186
    Par défaut
    Merci a vous
    Je vais me pencher sur les deux propositions
    Comme disait Arnord dans Terminator " I’ll be back"

    Encore merci et bonne soirée

Discussions similaires

  1. [XL-2007] Importer des données d'un fichier CSV fermé
    Par Maxim0 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/10/2011, 15h33
  2. [XL-2007] Importation des données sur plusieurs fichiers fermés
    Par starid dans le forum Excel
    Réponses: 8
    Dernier message: 18/07/2009, 17h54
  3. [MySQL] Importer les données d'un fichier CSV dans une base de données
    Par joueur dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/11/2008, 11h59
  4. Importation de données venant de fichier fermé ( *.xls)
    Par stormless dans le forum Macros et VBA Excel
    Réponses: 31
    Dernier message: 08/11/2005, 21h21
  5. Réponses: 3
    Dernier message: 13/12/2004, 13h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo