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 :

Ma fonction fonctionne en macro lorsque je teste, mais pas dans une formule de cellule [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Ma fonction fonctionne en macro lorsque je teste, mais pas dans une formule de cellule
    Bonjour,

    j'ai une fonction qui recherche la n-iéme cellule contenant une valeur. (Dans un autre fichier source, pour une feuille donnée en paramètre)
    Lorsqu'elle trouve cette valeur pour la n'ième fois, elle retourne la valeur contenue aux coordonnées passés en paramètre à partir de cette cellule.

    Le soucis c'est que quand je l'appel à partir d'une macro comme dans le code ci dessous, cela fonctionne.
    Mais lorsque je l'utilise dans une cellule d'un fichier Excel, cela ne fonctionne plus. (FindNext me retourne Nothing.)

    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
     
    Public Function GetSourceFile() As String
        Dim wb As Workbook
        Dim fso As Object
        Set fso = CreateObject("Scripting.FileSystemObject")
        Set wb = Application.ActiveWorkbook
        If Not IsEmpty(wb.LinkSources(xlExcelLinks)) Then
            wb.Sheets.Add
            xIndex = 1
            For Each link In wb.LinkSources(xlExcelLinks)
                GetSourceFile = fso.GetFileName(link)
            Next link
        End If
    End Function
     
     
    Public Function GetNextCellValueBis(sheetName As String, cellValue As String, row As Integer, col As Integer, idx As Integer) As String
        Dim sourceFile As String
        Dim foundRange As Range
        Dim i As Integer: i = 1
     
        sourceFile = GetSourceFile()
        With Workbooks(sourceFile).Sheets(sheetName)
            Set foundRange = .UsedRange.Find(What:=cellValue, LookAt:=xlWhole, LookIn:=xlValues)
     
            firstAddr = foundRange.Address
     
    '        i = 1
            Do While i <= idx
                If foundRange Is Nothing Then
                    Exit Do
                End If
     
                i = i + 1
                Set foundRange = .UsedRange.FindNext(after:=foundRange)
            Loop
        End With
     
        If foundRange Is Nothing Then
            GetNextCellValueBis = "empty"
        Else
            GetNextCellValueBis = foundRange.Offset(row, col)
        End If
     
    End Function
     
    Sub Test()
        MsgBox GetNextCellValueBis("feuille", "Value", 1, 0, 0) 'on affiche  la valeur d'en dessous (+1 colonne, +0 ligne) de la cellule "Value"
        MsgBox GetNextCellValueBis("feuille", "Value", 1, 0, 1) 'on affiche  la valeur d'en dessous de la 2e occurence de la cellule "Value"
        MsgBox GetNextCellValueBis("feuille", "Value", 1, 0, 2) 'on affiche la valeur d'en dessous de la 3e occurence de la cellule "Value"
    End Sub
    Quelqu'un peut-il me dire ce que je dois changer pour qu'elle fonctionne aussi lorsque je l'appelle à partir d'une cellule?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 594
    Points : 34 263
    Points
    34 263
    Par défaut
    Bonjour,

    d'une maniere generale, une fonction que l'on appelle depuis un cellule est sensee laisser a la cellule son focus du debut a la fin du processus, sous peine de ne jamais aboutir a la fin du code, debouchant sur un #VALEUR!

    Que ton code fonctionne sans passer par une formule dans une cellule est un bon debut : il n'est pas bugge

    Maintenant, il te faut le faire evoluer pour :
    - soit ne plus avoir de perte de focus de ta cellule cible
    - soit ce n'est pas possible, et passer par un bouton par exemple pour remplir les cellules avec les resultats sans passer par une formule dedans
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Novembre 2016
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse.

    Pour que cela fonctionne, j'ai changé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
               Set foundRange = .UsedRange.FindNext(After:=foundRange)
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
                Set foundRange = .UsedRange.Find(After:=foundRange, What:=cellValue, LookAt:=xlWhole, LookIn:=xlValues)
    @+

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

Discussions similaires

  1. Un regex qui fonctionne sur les testeurs en ligne, mais pas dans mon code
    Par billybobbonnet dans le forum Développement Windows
    Réponses: 4
    Dernier message: 28/01/2015, 17h20
  2. macro fonctionne dans un classeur test mais pas dans mon vrai classeur
    Par steeeve34 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/09/2012, 22h15
  3. Réponses: 4
    Dernier message: 03/08/2012, 12h05
  4. Objet existant reconnu dans une fonction mais pas dans une autre
    Par Jiyuu dans le forum Général Python
    Réponses: 0
    Dernier message: 20/09/2011, 18h19
  5. Réponses: 9
    Dernier message: 13/03/2008, 01h34

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