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 :

Lecture fichier xlsm fermé [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut Lecture fichier xlsm fermé
    Bonjour,

    J'ai repris en l'adaptant un peu l'exemple de SilkyRoad

    J'ai contrôlé mes valeurs passées en paramètre et elles sont correctes.

    Le MsgBox avec Dir sur mon fichier m'affiche le nom du fichier recherché
    Le MsgBox (QueryStr) m'affiche la requête
    Le MsgBox (2) n'est pas atteint

    Je ne vois pas mon erreur de syntaxe sachant que mon objectif est de lire une cellule déterminée d'un fichier xlsm fermé et de retourner sa valeur.

    Merci pour votre regard extérieur.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Function LireCellule_ClasseurFerme( _
            Chemin As String, _
            Fichier As String, _
            Feuille As String, _
            Cellule As Variant) As Variant
        'Nécessite d'activer la référence Microsoft ADO ext x.x for DLL and Security
        'Nécessite d'activer la référence Microsoft ActiveX Data Objects x.x Library
        'Menu Outils/Références
     
        Application.Volatile
     
        Dim Connexion As New ADODB.Connection 'Définir une variable ADODB Connection et Créer une nouvelle instance
        Dim Rst As New ADODB.Recordset 'Pour accueillir un RecordSet et Créer une nouvelle instance
     
        Dim CheminFichier As String
        Dim QueryStr As String
     
        '/!\ Attention à ne pas oublier le symbole \ entre le chemin et la feuille.
        CheminFichier = Chemin & "\" & Fichier
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        Feuille = Feuille & "$"
        '/!\ Attention lire une cellule il faut rechercher sous la forme A1:A1
        Cellule = Cellule & ":" & Cellule
     
        MsgBox Dir(CheminFichier) 'test l'existence du fichier
     
        '--- Connexion ---
        With Connexion
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & CheminFichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With
        '-----------------
     
        '---- Lecture Fichier ---
        QueryStr = "SELECT * FROM [" & Feuille & Cellule & "]"
        MsgBox (QueryStr)
     
        '---- Lecture Fichier ---
        Set Rst = Connexion.Execute(QueryStr)
        MsgBox (2)
        '---- Lecture Cellule ---
        'Ecrit le résultat de la requête dans la cellule
        'Range("AM2").CopyFromRecordset Rst
     
        '--- Fermeture connexion ---
        Rst.Close
        Connexion.Close
        Set Connexion = Nothing
        Set Rst = Nothing
    End Function

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    faut changer ta chaîne de connexion, dans le tuto c'est pour les fichiers excel ancienne version il me semble

    un exemple ici : https://www.developpez.net/forums/d1...t/#post9037959

  3. #3
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Je suis bien en Excel 2007 sur un xlsm donc je me fis à priori au tuto. Pour quelle version le lien que tu m'as donné est-il valable ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Voici qui est plus complet, puisque c'est l'exact problème que tu rencontres ?

    https://www.developpez.net/forums/d1...ne-fonctionne/

  5. #5
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Merci oui cela semble bien correspondre.

    J'ai donc fait un fichier test identique du POST :

    Nom : developpez-1.png
Affichages : 375
Taille : 5,3 Ko

    Dans Outils, Référence :

    Nom : developpez-2.png
Affichages : 369
Taille : 46,3 Ko

    Et le code suivant :

    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
    Function LireCellule_ClasseurFerme( _
        Chemin As String, _
        Fichier As String, _
        Feuille As String, _
        Cellule As Variant) As Variant
     
        Application.Volatile
     
        Dim Source As Object
        Dim Rst As Object
     
        '/!\ Attention à ne pas oublier le symbole \ entre le chemin et la feuille.
        CheminFichier = Chemin & "\" & Fichier
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        Feuille = Feuille & "$"
        '/!\ Attention lire une cellule il faut rechercher sous la forme A1:A1
        Dim Cible As String
        Cible = Cellule.Value & ":" & Cellule.Value
     
     
        '--- Connexion ---
        Set Source = CreateObject("ADODB.Connection")
        Source.Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & CheminFichier & "; extended properties=""Excel 12.0;HDR=NO"""
     
        MsgBox ("SELECT * FROM [" & Feuille & Cible & "]")
        '---- Lecture Fichier ---
        Set Rst = Source.Execute("SELECT * FROM [" & Feuille & Cible & "]")
        MsgBox (2)
        ActiveCell.CopyFromRecordset Rst
     
        '--- Fermeture ---
        Rst.Close
        Source.Close
        Set Source = Nothing
        Set Rst = Nothing
    End Function
    Mon résultat est #VALEUR!

    J'affiche MsgBox(MsgBox ("SELECT * FROM [" & Feuille & Cible & "]")) mais pas MsgBox(2)

    La valeur de Feuille & Cible est correcte :

    Nom : developpez-3.png
Affichages : 312
Taille : 12,5 Ko

    Si je change le nom du fichier par une valeur fausse MsgBox(MsgBox ("SELECT * FROM [" & Feuille & Cible & "]")) ne s'affiche pas.
    J'en conclu donc que c'est dans ma lecture de fichier que cela ne va pas.

    Ma syntaxe me semble bonne pourtant.

  6. #6
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    on va faire comme dans la précédente discussion alors

    Est-ce que cette procédure, quant à elle, fonctionne, si tu renseignes les bons paramètres ?

    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
    Sub LireCellule_ClasseurFerme()
    Dim Source As Object, Rst As Object
    Dim Feuille As String, Cellule As String, CheminFichier As String, NomFichier As String
     
    CheminFichier = "C:\Users\Toto\"
    NomFichier = "MonClasseur.xlsx"
    Feuille = "BDD_PROD" & "$"
    Cellule = "B1:B1"
     
    Set Source = CreateObject("ADODB.Connection")
    Source.Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & CheminFichier & NomFichier & ";extended properties=""Excel 12.0;HDR=NO"""
    Set Rst = Source.Execute("SELECT * FROM [" & Feuille & Cellule & "]")
    ActiveCell.CopyFromRecordset Rst
     
    End Sub
    pas besoin de cocher une quelconque référence, tout est en liaison tardive
    il faut juste renseigner correctement la valeur des 4 variables du début

  7. #7
    Invité
    Invité(e)
    Par défaut
    Désolé!
    LireCellule_ClasseurFerme2 = .Fields(0).Value

  8. #8
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Autre solution présentée par dysorthographie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function LireCellule_ClasseurFerme2(Chemin As String, Fichier As String, Feuille As String, Cellule As Variant) As Variant
         With CreateObject("ADODB.Connection")
            .Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & Chemin & "\" & Fichier & ";extended properties=""Excel 12.0;HDR=NO"""
            With .Execute("SELECT * FROM [" & Feuille & "$" & Cellule & ":" & Cellule & "]")   '---- Lecture Fichier ---
                If .EOF = False Then    'je vérifie si la requête retourne une valeur!
                 LireCellule_ClasseurFerme2 = .Fields(0).Value
                End If
                 .Close '--- Fermeture --
            End With
            .Close
        End With
    End Function

  9. #9
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function LireCellule_ClasseurFerme2(Chemin As String, Fichier As String, Feuille As String, Cellule As Variant) As Variant
        With CreateObject("ADODB.Connection")
            .Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & CheminFichier & ";extended properties=""Excel 12.0;HDR=NO"""
            With .Execute("SELECT * FROM [" & Feuille & Cellule & ":" & Cellule   & "]") '---- Lecture Fichier ---
                if  .EOF = False  then  'je vérifis si la requête retourne une valeur!
                 LireCellule_ClasseurFerme2 .Fields(0).Value
                end if
                 .Close '--- Fermeture --
            End With
            .Close
        End With
    End Function

  10. #10
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    J'ai modifié CheminFichier qui n'existe pas, ajouté le $ entre feuille et cellule et retiré l'espace avant Fields(0).Value, mais ça ne me retourne #VALEUR!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function LireCellule_ClasseurFerme2(Chemin As String, Fichier As String, Feuille As String, Cellule As Variant) As Variant
        With CreateObject("ADODB.Connection")
            .Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & Chemin & "\" & Fichier & ";extended properties=""Excel 12.0;HDR=NO"""
            With .Execute("SELECT * FROM [" & Feuille & "$" & Cellule & ":" & Cellule & "]")   '---- Lecture Fichier ---
                If .EOF = False Then    'je vérifie si la requête retourne une valeur!
                 LireCellule_ClasseurFerme2.Fields(0).Value
                End If
                 .Close '--- Fermeture --
            End With
            .Close
        End With
    End Function

  11. #11
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feuille = "RECAP# ANNUEL" & "$"
    les points ça n'aime pas!

  12. #12
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Merci dysorthographie
    J'ai retiré le point et l'erreur a disparu.
    Il me rapatrie bien une valeur.
    Je vais faire mes tests.

    MAUDIT .

  13. #13
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    ça alors , jamais j'aurai deviné

    Robert, le roi du ADO

  14. #14
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Table.Champ
    Ta.ble.Champ  'is champ?
    Ta#ble.Champ
    Ta.ble#Champ

  15. #15
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Avec le Sub la valeur est bien retournée dans la cellule active
    Avec la Fonction il ne me retourne rien
    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    '--- Connexion ---
        Set Source = CreateObject("ADODB.Connection")
        Source.Open "Provider = Microsoft.ACE.OLEDB.12.0;data source=" & CheminFichier & ";extended properties=""Excel 12.0;HDR=NO"""
     
        '---- Lecture Fichier ---
        Set Rst = Source.Execute("SELECT * FROM [" & Feuille & Cible & "]")
        MsgBox (Rst(0).Value)
        LireCellule_ClasseurFerme = Rst(0).Value
    Pourtant mon MsgBox m'affiche la bonne valeur
    Pourquoi appelle t on la fonction dans la fonction ?

  16. #16
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Le principe d'une fonction, c'est que "quelque chose l'appel"

    la fonction va "calculer quelque chose" au sein de son déroulé de code

    ensuite, pour transmettre à la procédure appelante le résultat, on fait MonNomDeFonction = MonResultat

    regarde bien le tutoriel de description des fonctions personnelles
    http://silkyroad.developpez.com/vba/fonctions/

    et notamment ici : http://silkyroad.developpez.com/vba/fonctions/#LII-B-5

    ici, peut-être qu'il faut une variable intermédiaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Toto as String
     
    ' ...
    Toto = Rst(0).Value
    LireCellule_ClasseurFerme = Toto

  17. #17
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Merci

    J'avais fait le test suivant et les valeurs affichées par MsgBox sont bonnes mais pas la valeur de retour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Resultat As Variant
        ...
        MsgBox (Rst(0).Value)
        Resultat = Rst(0).Value
        MsgBox (Resultat)
        LireCellule_ClasseurFerme = Resultat
    Le format de ma cellule de réception est un nombre et c'est le nombre 83 que j'affiche dans mes MsgBox.

  18. #18
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    peux-tu remettre le code complet que tu viens juste d'utiliser ? J'ai pris soin de ne pas dire "procédure" ou "fonction", on sera fixé avec ce que tu vas nous montrer

  19. #19
    Invité
    Invité(e)
    Par défaut
    déjà dans ton code je ne vois pas de fonction!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sub LireCellule_ClasseurFerme()
    maintenant imaginons qu'il s'agit d'une fonction!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function LireCellule_ClasseurFerme()
    une fonction c'est comme une variable!
    vue de l'extérieur c'est comme un sub vue de l'intérieur c'est une variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sub test()
       msgbox MyFonction 'vue de l'extérieur c'est comme un sub 
    end sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function MyFonction()
    MyFonction="toto" ' vue de l'intérieur c'est une variable
    end fuction

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] liaison avec un fichier fermé fichier xlsm ne fonctionne pas
    Par sebing dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/12/2013, 09h37
  2. Résultat lecture fichier csv fermé non correct
    Par idrysse31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/09/2012, 17h56
  3. [XL-2003] Lecture fichier fermé ne marche plus
    Par CODYCO dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/07/2012, 16h03
  4. [XL-2007] Recordset ADO VB6.3 lecture fichier Excel fermé
    Par fafou312 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 11/04/2012, 08h40
  5. Probleme lecture dans un fichier Excel ferme
    Par kent17 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/07/2010, 09h29

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