La fonction marche, le retour plante

Orodreth

XLDnaute Impliqué
Bonjour à tous

:confused:

Je sais même pas comment expliquer ce problème.
En gros, pour des tableaux de reporting, je dois récupérer une valeur d'un autre classeur pour pouvoir attribuer une prime ou une régulation de prime.

Pour se faire, j'ai crée une fonction (sachant que l'execute4macro ne marche pas au bureau -_-).

La valeur devant être récupérée est la valeur d'un objectif de réalisation par rapport au mois précédent, dans des fichiers historiques.

Exemple:
Année 2008, mois de février = récupération de la valeur du mois de janvier 2008
Année 2008, mois de janvier = récupération de la valeur du mois de décembre 2007

Ma fonction fait les étapes suivantes:
Récupération de la ligne et de la colonne de la cellule active
Récupération de la variable Annee
Récupération de la variable Mois
On crée et on instancie une variable objet classeur qui référence le classeur d'origine.
Test de la variable Mois (pour vérifier si janvier) puis test de la variable Annee (n'est pris en compte qu'à partir de 2008)

Je récupère le chemin d'accès au classeur historique qui m'intéresse, je l'ouvre, je prends la valeur dans une variable, et pour finir, je retourne cette variable.

Tout marche !

Ou presque. Il me retourne systématiquement #valeur!
Pourtant, sur la dernière ligne de la fonction, je récupère bien ma valeur :confused:

Je ne peux pas mettre de fichiers joints car trop lourd, mais je peux mettre le code de ma fonction:

Code:
Function RecupObj() As Double

Dim Ligne As Integer
Dim Colonne As Integer
Ligne = ActiveCell.Row
Colonne = ActiveCell.Column
Dim Annee As String
Annee = Format(Sheets("Rem PGT").Range("E4").Value, "YYYY")
Dim Mois As String
Mois = Format(Sheets("Rem PGT").Range("E4").Value, "MM")
'MsgBox (Annee & "-" & Mois)
Dim CheminHistoCourant As String
Dim wbkBase As Workbook
Set wbkBase = ActiveWorkbook
Dim wbkhisto As Workbook
Dim NomFeuille As String
Dim PrimeMP As Double
Dim WB As Workbook
Dim NomComplet As String
If CInt(Mois) > 1 Then
    If CInt(Annee) >= 2008 Then
        Mois = Right("0" & CStr(CInt(Mois - 1)), 2)

        CheminHistoCourant = Sheets("Rem PGT").Range("E13").Value
    
        NomFeuille = Right(ActiveSheet.Cells(1, 1).Value, Len(ActiveSheet.Cells(1, 1).Value) - 5)
        
        'Application.ScreenUpdating = False
        NomComplet = CheminHistoCourant & "Histo REM " & Annee & " RE " & NomFeuille & ".xls"
        Workbooks.Open Filename:=NomComplet, UpdateLinks:=False
        For Each WB In Workbooks
            If WB.Name <> wbkBase.Name Then
                Set wbkhisto = WB
            End If
        Next
        
        With wbkhisto
            PrimeMP = .Sheets(CInt(Mois) + 1).Cells(Ligne, Colonne).Value
            .Close False
        End With
        'Application.ScreenUpdating = True
        RecupObj = PrimeMP
    End If
    
    ElseIf CInt(Mois) = 1 Then
            Mois = "12"
            If CInt(Annee) > 2008 Then
                
            CheminHistoCourant = Sheets("Rem PGT").Range("E13").Value
    
            CheminHistoCourant = Replace(CheminHistoCourant, Annee, CStr(CInt(Annee) - 1))
        
            NomFeuille = Right(ActiveSheet.Cells(1, 1).Value, Len(ActiveSheet.Cells(1, 1).Value) - 5)
            
            'Application.ScreenUpdating = False
            NomComplet = CheminHistoCourant & "Histo REM " & Annee & " RE " & NomFeuille & ".xls"
            Workbooks.Open Filename:=NomComplet, UpdateLinks:=False
            For Each WB In Workbooks
                If WB.Name <> wbkBase Then
                    Set wbkhisto = WB
                End If
            Next
            
            With wbkhisto
                PrimeMP = .Sheets(CInt(Mois) + 1).Cells(Ligne, Colonne).Value
                .Close False
            End With
            'Application.ScreenUpdating = True           
            RecupObj = PrimeMP
        End If
End If
End Function

Bon, je crois que tout est dit.

Je remercie d'avance tous ceux qui pourront m'aider, et si vous avez des questions, n'hésitez pas.

Thomas
 

porcinet82

XLDnaute Barbatruc
Re : La fonction marche, le retour plante

Salut,

Je vais peut etre dire une connerie, mais il ne faut pas lui passer un paramètre à ta fonction ?
Un truc du genre Function RecupObj(une_variable as Double) As Double ?
Je ne suis pas expert en fonction, mais j'ai fais quelques tests sur des fonctions simples et au début, il me mettait le meme resultat que toi. Ensuite, ca a fonctionné.
Un exemple bateau :
Code:
Function ma_fonction(parametre As Integer) As Integer
[COLOR=green]'le but est de récupérer la valeur d'une cellule de la colonne A, le numéro de ligne étant le paramètre[/COLOR]
ma_fonction = Range("A" & parametre)
End Function

Par exemple dans la cellule je mets =ma_fonction(1) et ca me renvoi la valeur contenue dans la cellule A1

@+
 

Orodreth

XLDnaute Impliqué
Re : La fonction marche, le retour plante

salut Porcinet

J'y ai pensé aussi, mais c'est illogique, et Excel doit surement être d'accord avec moi puisqu'il prend la fonction "=AUJOURDHUI()" qui renvoie la date d'aujourd'hui.

D'autant que lui donner un paramètre, moi je veux bien, mais contrairement à toi, il ne me sert à rien :(
 

porcinet82

XLDnaute Barbatruc
Re : La fonction marche, le retour plante

re,

Ouai, tu as raison, le parametre n'a rien d'obligatoire.
Je ne vois pas trop d'ou cela peut venir. Est-ce que ta fonction se trouve dans un module (et non un module de feuille) ?

Sinon, envoie moi ton fichier par mail (mon adresse dans laquelle il faut enlever les espaces : romain01 @ wanandoo.fr), je regarderai directement ce que je peux faire.

@+
 

Orodreth

XLDnaute Impliqué
Re : La fonction marche, le retour plante

Re,

Oui, elle est bien dans un module.

non laisse tomber, je vais employer la méthode que je voulais pas utiliser: modifier la macro qui crée les fichiers pour y ajouter les liaisons formulistes dès le départ, plutôt que partir sur une fonction qui aurait permis de créer des formules pour répondre au besoin.

C'est sympa de ta part quand même, merci beaucoup :)
 

sousou

XLDnaute Barbatruc
Re : La fonction marche, le retour plante

Bonjour
??
Primemp est un objet range que tu prends dans xclasseur qui sera fermer avant l'utilisation (RecupObj = PrimeMP)
Je me demande si ??
essaie de copier la valeur de primemp dans recupobj, et de fermer le classeur après.
 

Orodreth

XLDnaute Impliqué
Re : La fonction marche, le retour plante

Bonjour sousou

PrimeMP est un double, pas un range.

Et quand j'éxécutais pas à pas, après avoir passer la ligne "RecupObj = PrimeMp", si je passais le curseur de la souris sur RecupObj, il m'affichait bien la bonne valeur, même si je fermais le classeur (il n'y en a qu'un à chaque fois) d'historique.

Mais elle n'était pas renseignée sur excel :(
 

Discussions similaires

Statistiques des forums

Discussions
312 413
Messages
2 088 201
Membres
103 767
dernier inscrit
LEONG