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 :

Problème de renvoi de la valeur d'une fonction [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut Problème de renvoi de la valeur d'une fonction
    Bonjour à tous,
    j'utilise la fonction ci-dessous, qui recherche un fichier dans les sous répertoires ou se trouve mon fichier excel. Les données d'entrée de la fonction sont:
    - expression à rechercher (nom du fichier)
    - racine à partir de laquelle commencer la recherche

    La valeur que doit renvoyer la fonction est le chemin ou se trouve le fichier.

    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
    Function Explorer(p_strFichier As String, p_strCheminDepart As String, Optional p_oFld As Scripting.Folder) As String
        On Error GoTo err
     
        Dim oFSO As Scripting.FileSystemObject
        Dim oFld As Scripting.Folder
        Dim oFl As File
        Dim Chemin As String
        If p_oFld Is Nothing Then
            'Instanciation du FSO (déclare l'objet FSO (gestion des dossiers et fichiers))
            Set oFSO = New Scripting.FileSystemObject
            'Accède au répertoire du départ de recherche
            Set p_oFld = oFSO.GetFolder(p_strCheminDepart)
        End If
     
        Set oFl = p_oFld.Files(p_strFichier)
        MsgBox oFl.Path
        Explorer = oFl.Path
     
        Exit Function
     
    SubDir:
        'Explore les sous-dossiers
        For Each oFld In p_oFld.SubFolders
            Explorer p_strFichier, p_strCheminDepart, oFld
            DoEvents
        Next oFld
     
    fin:
        Exit Function
     
    err:
        Select Case err.Number
            Case 53: Resume SubDir
            'Case Else:
            '    MsgBox "Erreur inconnue"
            '    Resume fin
        End Select
     
    End Function
    problème :
    Une fois la fonction terminée, chemin est vide (renvoit : "")

    cela semble venir de Exit Function (en mode pas à pas, je vois que c'est au moment ou exit function est exécuté que le renvoi de "explorer" se vide)

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut

    Jéte un coup d'oeil ici .
    [Edit] En fait je me rend compte que ça n'est pas pas vraiment compatible, mais du coup j'ai modifié le code de ma contribution suite à ce message, je laisse donc le lien.[/Edit]

    J'ai quand même essayé ton code et je n'ai pas eu de soucis.
    Je l'ai quand même modifié un peu
    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
    Function Explorer(p_strFichier As String, p_strCheminDepart As String, Optional p_oFld As Scripting.Folder) As String
    On Error GoTo err
     
    Dim oFSO As Scripting.FileSystemObject
    Dim oFld As Scripting.Folder
    Dim oFl As File
    Dim Chemin As String
    If p_oFld Is Nothing Then
    'Instanciation du FSO (déclare l'objet FSO (gestion des dossiers et fichiers))
    Set oFSO = New Scripting.FileSystemObject
    'Accède au répertoire du départ de recherche
    Set p_oFld = oFSO.GetFolder(p_strCheminDepart)
    End If
     
    'Inutil de faire une gestion d'erreur, l'erreur est potentiellement attendu
    'Autant verifié une fois la ligne passé que tout c'est bien passé
    On Error Resume Next
    Set oFl = p_oFld.Files(p_strFichier)
    On Error GoTo err
     
    If Not oFl Is Nothing Then
        Explorer = oFl.Path
    Else
        'Explore les sous-dossiers
        For Each oFld In p_oFld.SubFolders
            Explorer p_strFichier, p_strCheminDepart, oFld
            DoEvents
        Next oFld
    End If
     
    err:
    If err.Number <> 0 Then
        Select Case err.Number
            Case 53: 'Resume SubDir 'devenu inutile puisque déjà géré dans le code
            Case Else:
                MsgBox "Erreur inconnue"
                'Resume fin 'il faut juste laisser le code se poursuivre
            End Select
    End If
    End Function
     
     
    Sub test()
    Dim Retour As String
    Retour = Explorer("A sup.xlsx", "d:\")
    End Sub
    La vérification des sous répertoires en cas de recherche infructueuse est intéressant, je vais peut-être l'implémenté dans ma contribution.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut
    Cela fonctionne bien chez toi? car chez moi non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If Not oFl Is Nothing Then
        Explorer = oFl.Path
    Else
        'Explore les sous-dossiers
        For Each oFld In p_oFld.SubFolders
            Explorer p_strFichier, p_strCheminDepart, oFld
            DoEvents
        Next oFld
    End If
    Explorer prend bien la valeur de oFl.Path, mais dans la suite du programme "DoEvents" est rééxécuté avant de finir la fonction, ce qui vide Explorer

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    bonjour,

    j'ai du mal à comprendre la logique de ton programme .... mais à première vue dans ta boucle For Each ... tu as oublié de traiter le retour de ta fonction Explorer ... et en supposant que tu ne recherche qu'un seul fichier ... il faut que tu sorte de cette boucle au premier fichier trouvé ....

  5. #5
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Salut
    Cela fonctionne bien chez toi? car chez moi non
    Je me suis cantonné à un exemple simple avec le fichier dans le répértoire, juste pour voir ton histoire de variables qui se vident.

    Sinonbbil à raison...

    Essai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'Explore les sous-dossiers
        For Each oFld In p_oFld.SubFolders
            explorer = explorer(p_strFichier, p_strCheminDepart, oFld)
            If explorer <> "" Then Exit For
            DoEvents
        Next oFld
    Par contre je ne comprend pas ton problème de contenu de variables qui se vident, remet le code que tu utilises.

    ++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 14
    Points
    14
    Par défaut
    Merci de vos réponses, je viens de tester à l'instant le dernier code de Qwazerty, et ca fonctionne parfaitement

    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
    Function Explorer(p_strFichier As String, p_strCheminDepart As String, Optional p_oFld As Scripting.Folder) As String
    Dim oFSO As Scripting.FileSystemObject
    Dim oFld As Scripting.Folder
    Dim oFl As File
    Dim Chemin As String
    If p_oFld Is Nothing Then
    'Instanciation du FSO (déclare l'objet FSO (gestion des dossiers et fichiers))
    Set oFSO = New Scripting.FileSystemObject
    'Accède au répertoire du départ de recherche
    Set p_oFld = oFSO.GetFolder(p_strCheminDepart)
    End If
     
    'Inutil de faire une gestion d'erreur, l'erreur est potentiellement attendu
    'Autant verifié une fois la ligne passé que tout c'est bien passé
    On Error Resume Next
    Set oFl = p_oFld.Files(p_strFichier)
    On Error GoTo err
     
    If Not oFl Is Nothing Then
        Explorer = oFl.Path
    Else
        'Explore les sous-dossiers
        For Each oFld In p_oFld.SubFolders
            Explorer = Explorer(p_strFichier, p_strCheminDepart, oFld)
            If Explorer <> "" Then Exit For
            DoEvents
        Next oFld
    End If
     
    err:
    If err.Number <> 0 Then
        Select Case err.Number
            Case 53: 'Resume SubDir 'devenu inutile puisque déjà géré dans le code
            Case Else:
                MsgBox "Erreur inconnue"
                'Resume fin 'il faut juste laisser le code se poursuivre
            End Select
    End If
    End Function
    Pour la logique du code, je n'en suis pas l'auteur... (j'ai moi meme du mal à comprendre)

    @+

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

Discussions similaires

  1. [AC-97] Problème avec le Renvoi de la valeur d'une liste
    Par marckus67 dans le forum IHM
    Réponses: 1
    Dernier message: 15/03/2013, 18h58
  2. Fonction qui renvoie la dernière valeur d'une plage
    Par brunoSCP dans le forum Excel
    Réponses: 5
    Dernier message: 12/02/2010, 17h53
  3. problème de passage de valeur dans une fonction
    Par jeremie74 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 21/09/2007, 18h30
  4. Réponses: 14
    Dernier message: 09/03/2007, 12h21
  5. [MySQL] Problème d'initialisation de la valeur dans une table
    Par priazu dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 27/02/2006, 02h00

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