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 :

Fonction retourne valeur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 77
    Par défaut Fonction retourne valeur
    Bonjour, est-il possible qu'une fonction renvoie une valeur de type Range.
    Dans ma fonction Macro1(), je veux lancer la fonction sans argument FindTable() et retourner le tableau trouvé dans la variable FindTable

    Puis rentrer ce paramètre dans une autre fonction en argument : Call CleanTable(FindTable)

    Cependant, je ne dois pas avoir la bonne syntaxe pour retourner un paramètre, l'erreur est surement à la ligne : Set FindTable = Call FindTable. Mais je ne vois pas comment écrire

    Voici mon code :

    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
    Sub Macro1()
        Dim Sh As Worksheet
        Dim FindTable As Range
     
        Chemin = ThisWorkbook.path
        Set Sh = ThisWorkbook.Sheets("Sheet1")
     
        Cells.Clear
     
        Set FindTable = Call FindTable
     
        Call CleanTable(FindTable)
     
    End Sub
     
    Function FindTable() As Range
        Dim Sh As Worksheet
        Dim CellFind As Range
        Dim RefCell As String
     
        RefCell = "Today date"
     
        Chemin = ThisWorkbook.path
        Set Sh = ThisWorkbook.Sheets("Sheet1")
        Workbooks.Open (Chemin & "/Classeur_travail.xlsx")
     
        Set CellFind = Workbooks("Classeur_travail.xlsx").Worksheets("Sheet2").Cells.Find(RefCell, LookIn:=xlValues, SearchOrder:=xlByRows, MatchCase:=False)
     
        FindTable = Workbooks("Classeur_travail.xlsx").Worksheets("Sheet2").Rows(CellFind.Row + 1 & ":" & CellFind.Row + 6)
     
        Workbooks("Classeur_travail.xlsx").Close
    End Function

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par bzh.floriane Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Macro1()
        Dim FindTable As Range
    ...
    Function FindTable() As Range
    Ca, c'est vraiment une très mauvaise idée.
    Il y a des milliards de combinaisons possibles pour nommer une variable ou une fonction.
    C'est vraiment vouloir se tirer une balle dans le pied que de donner le même à deux éléments différents.

    Dans la suite des explication, je vais les renommer VFindTable et FFindTable pour les différencier.

    Cependant, je ne dois pas avoir la bonne syntaxe pour retourner un paramètre, l'erreur est surement à la ligne : Set FindTable = Call FindTable.
    Déjà, une Function ne s'appelle pas avec un Call. Le Call est plutôt réservé aux Sub.
    De toute façon, le Call est une instruction, on ne peut pas le mettre à la suite d'un "=" pour l'assigner.
    Une Function s'utilise comme une valeur ou une variable paramétrée.
    La syntaxe correcte est Set VFindTable = FFindTable().

    Autre détail, quand tu fais des opérations pour créer l'adresse d'un Range, ne soit pas avare de parenthèses pour lever les ambigüités.
    Mais la principale erreur, c'est que tu as oublié le Set devant ton FindTable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set FFindTable = Workbooks("Classeur_travail.xlsx").Worksheets("Sheet2").Rows((CellFind.Row + 1) & ":" & (CellFind.Row + 6))
    Personnellement, j'aurai plutôt écrit (question de goût) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set FFindTable = Workbooks("Classeur_travail.xlsx").Worksheets("Sheet2").Cells(CellFind.Row + 1, 1).Resize(6, 1).EntireRow
    Il serait bon aussi, après ton Find, de contrôler si la recherche a été fructueuse avant d'utiliser CellFind, histoire de gérer proprement un bug éventuel.

  3. #3
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 77
    Par défaut
    Merci pour toutes tes remarques, je les ai bien prises en compte.

    Cependant, cela ne fonctionne pas. Je n'arrive toujours pas à retourner un paramètre via ma fonction. Dans ma fonction Macro1, la variable TableFind est vide.

    Me conseilles-tu pour tester si CellFind n'est pas vide de faire une boucle If. Je t'avoue que je débute, et je ne sais pas trop quelle est la méthode conseillée.

    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
    53
    54
    Sub Macro1()
        Dim Sh As Worksheet
        Dim TableFind As Range
     
        Chemin = ThisWorkbook.path
        Set Sh = ThisWorkbook.Sheets("Sheet1")
     
        Cells.Clear
        'ERREUR ICI : TableFind vide'
        Set TableFind = FindTable()
        TableFind.Copy Sh.Cells(1, 1)
        Call CleanTable(TableFind)
     
    End Sub
     
    Function FindTable() As Range
        Dim Sh As Worksheet
        Dim CellFind As Range
        Dim RefCell As String
        Dim TableFind As Range
        Dim Ln As Integer
     
        RefCell = "Today date"
        Dim NombreVal As Integer
     
        Chemin = ThisWorkbook.path
        Set Sh = ThisWorkbook.Sheets("Sheet1")
        Workbooks.Open (Chemin & "/Classeur_travail.xlsx")
        NombreVal = 1
        Ln = 0
        Set CellFind = Workbooks("Classeur_travail.xlsx").Worksheets("Sheet2").Cells.Find(RefCell, LookIn:=xlValues, SearchOrder:=xlByRows, MatchCase:=False)
        'Faire une boucle If CellFind != 0 Then ? '
        Do While NombreVal > 0
            Ln = Ln + 1
            NombreVal = Workbooks("Classeur_travail.xlsx").Worksheets("Sheet2").Application.WorksheetFunction.CountA(Rows(CellFind.Row + Ln))
        Loop
     
        Set TableFind = Workbooks("Classeur_travail.xlsx").Worksheets("Sheet2").Cells(CellFind.Row + 1, 1).Resize(Ln, 1).EntireRow
        'End If ? '
        Workbooks("Classeur_travail.xlsx").Close
    End Function
     
     
    Function CleanTable(TableFind As Range)
        Dim Sh As Worksheet
        Dim Ln As Integer, Col As Integer
     
        Chemin = ThisWorkbook.path
        Set Sh = ThisWorkbook.Sheets("Sheet1")
        Workbooks.Open (Chemin & "/Classeur_travail.xlsx")
     
        TableFind.Copy Sh.Cells(20, 1)
     
    End Function

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par bzh.floriane Voir le message
    Je n'arrive toujours pas à retourner un paramètre via ma fonction. Dans ma fonction Macro1, la variable TableFind est vide.
    C'est peut-être, comme je le disais, parce que ta recherche Find est infructueuse.
    Mets un point d'arrêt sur ton code en ligne 33 et regarde ce que contient CellFind.

  5. #5
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 77
    Par défaut
    Non, ma recherche est fructeuse. lorsque j'affiche TableFind dans la fonction FindTable, il s'affiche bien. mais lorsque je veux appeler cette fonction FindTable dans ma macro pincipale, elle ne retourne rien

    J'avais lu que si on voulait que la fonction retourne qqe chose, il fallait que la variable a retourné soit du même nom que le nom de la fonction. C'est pour ça qu'au début je les avais appelé pareil

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Je t'avais bien dit que tes noms sont mal choisis et qu'ils entrainent des confusions.

    Ceci n'a rien à faire dans la fonction FindTable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set TableFind = Workbooks("Classeur_travail.xlsx").Worksheets("Sheet2").Cells(CellFind.Row + 1, 1).Resize(Ln, 1).EntireRow
    C'est le nom de la fonction qui doit être assignée.

    Les variables déclarées dans la fonction, même si elles ont le même nom qu'une autre dans la macro appelante, disparaissent dès que la fonction est achevée.

  7. #7
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,,

    Citation Envoyé par bzh.floriane Voir le message
    Merci pour toutes tes remarques, je les ai bien prises en compte.
    Pourtant ça fait deux fois que Menhir () le répète : tes noms entrainent une confusion.

    Microsoft aussi le dit (au 5ème point) : https://docs.microsoft.com/fr-fr/off...c-naming-rules
    « Vous ne devez pas répéter de noms dans le même niveau de portée »

    Traduction : dans une même procédure, on ne peut pas écrire que, la variable de type Range nommée FindTable est égale au résultat de la fonction de type Range nommée FindTable !
    Il faut soit changer le nom de la variable, soit celui de la fonction, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim rngFindTable As Range
    '...
    Set rngFindTable =  FindTable()

Discussions similaires

  1. aucun affichage avec fonction retournant valeurs
    Par tabkelm dans le forum Débuter
    Réponses: 4
    Dernier message: 12/09/2017, 17h25
  2. [XL-2003] ma fonction retourne #VALEUR! lors de la suppression d'une ligne
    Par oracle7556 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 18/12/2009, 18h17
  3. Fonction retournent plusieurs valeurs
    Par Futixu dans le forum C++
    Réponses: 18
    Dernier message: 15/06/2006, 22h49
  4. Fonction retournant plusieurs valeurs
    Par Trap D dans le forum Scheme
    Réponses: 1
    Dernier message: 17/02/2006, 21h52
  5. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45

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