Fonction et plage non trouvée

haddock44

XLDnaute Nouveau
Bonjour à tous.
J'ai un classeur (appelons-le "Data") qui contient plusieurs feuilles. Depuis celles-ci, je fais appel à des procédures se trouvant dans un autre classeur (appelons-le "Programme"), via des boutons par ex, qui affichent des formulaires (ceux-ci sont dans Programme).
J'ai créé une fonction que j'ai placé dans un module de Programme. Celle-ci a 3 arguments correspondant à des plages.
Je place donc l'appel à cette fonction dans certaines feuilles de mon classeur Data.
Par exemple, en plaçant dans des cellules ceci : =Programme!MaFonction((AQ8;11:11;3:3)
Quand je reste sur ma feuille, que je change les valeurs des cellules dépendantes, tout se recalcule bien. En revanche, quand je clique sur un bouton (présent dans la feuille de Data) qui lance un formulaire (de Programme), le résultat de ma fonction me ramène #VALEUR!
Je suppose que c'est parce que ma fonction ne fait pas référence à la feuille et le classeur, mais comment m'en sortir ?

Voici ma fonction :
Code:
Public Function MaFonction(StockC, Besoins, Periodes)

    Dim sFeuille, LigCouv, LigStk, LigDemClient, ColJ, LigNbJ_Periode
    
    Set sFeuille = ActiveSheet

    If Not IsRange(StockC) _
    Or Not IsRange(Besoins) _
    Or Not IsRange(StockC) Then Exit Function
    
    LigDemClient = Besoins.Rows(1).Row
    LigNbJ_Periode = Periodes.Rows(1).Row
    
    ColJ = StockC.Columns(1).Column
    DerniereCol = sFeuille.Cells.Find("*", , , , xlByColumns, xlPrevious).Column
    NbJcouvert = 0
    
    Stk = sFeuille.Cells(StockC.Rows(1).Row, ColJ).Value
    
    For col = ColJ + 1 To DerniereCol
        NbJ_Travaille = sFeuille.Cells(LigNbJ_Periode, col).Value
        If NbJ_Travaille <> 0 Then
            BesoinJ = sFeuille.Cells(LigDemClient, col).Value / NbJ_Travaille
        Else
            BesoinJ = sFeuille.Cells(LigDemClient, col).Value
            Stk = Stk - BesoinJ
        End If
        For n = 1 To NbJ_Travaille
            Stk = Stk - BesoinJ
            If Stk < 0 Then
                Exit For
            Else
                NbJcouvert = NbJcouvert + 1
            End If
            If Stk < 0 Then Exit For
        Next n
    Next col
    
    If Stk >= 0 Then
        NbJcouvert = 999
    End If
    
    MaFonction = NbJcouvert

End Function
 
G

Guest

Guest
Re : Fonction et plage non trouvée

Bonjour,

Passer la feuille en paramètre optionel quand tu appelles la fonction par macro puis tester de quelle manière celle-ci a été appelée.

Code:
Public Function MaFonction(StockC, Besoins, Periodes, Optional Feuille As Worksheet = Nothing)
    Dim sFeuille As Worksheet
    If Feuille Is Nothing Then
        'Tester si la fonction a étée appelée à partir d'une cellule
        If TypeName(Application.Caller) = "Range" Then
            Set sFeuille = Application.Caller.Parent
        Else
            MsgBox "Paramètre feuille manquant"
            Exit Function
        End If
    Else
        Set sFeuille = Feuille
    End If
 
'.....Suite
End Function

Application Caller renvoie l'objet Range appelant la fonction ou erreur ou nom du document suivant le cas, voir l'aide excel sur Caller.

Autrement utiliser Application.ThisCell

A+
 

Discussions similaires

Réponses
4
Affichages
234

Statistiques des forums

Discussions
312 559
Messages
2 089 604
Membres
104 225
dernier inscrit
Misterpat63