Fonction personnalisée : erreur référence circulai

Phillip

XLDnaute Occasionnel
Bonjour,

C'est encore moi, avec des problèmes de focntions personnalisées. J'ai crée la fonciton personnalisée ci-dessous qui ne focntionne pas du tout. Si je la transforme en macro, elle fonctionne très bien..

Sub MG()

Rprecel = Range('precel').Row
Cprecel = Range('precel').Column
Range('dercel').Select
Rdercel = Range('dercel').Row


For i = 1 To Rdercel
If ActiveCell.Value = 38477 Or ActiveCell.Value = 38547 Or ActiveCell.Value = 38579 Or ActiveCell.Value = 38657 Then
Range('c28').Value = 135
Exit Sub

Else
Rprecel = Rprecel + 1
Cells(Rprecel, Cprecel).Select

End If

Next i

Range('c28').Value = 108

End Sub

En fonction :
Function MG()

Rprecel = Range('precel').Row
Cprecel = Range('precel').Column
Range('dercel').Select
Rdercel = Range('dercel').Row


For i = 1 To Rdercel
If ActiveCell.Value = 38477 Or ActiveCell.Value = 38547 Or ActiveCell.Value = 38579 Or ActiveCell.Value = 38657 Then
MG = 135
Exit Function

Else
Rprecel = Rprecel + 1
Cells(Rprecel, Cprecel).Select

End If

Next i

MG = 108
End Function

Où me trompè-je ?

Merci
 

Phillip

XLDnaute Occasionnel
Merci Luki,

Je crois comprendre les bases (vraiment les bases) de la fonction perosnnalisée : elle permet de coller un calcul dans la cellule selectionnée, avec des arguments ou pas...Bon, sachant ça, je n'arrive pas à voir en quoi les posts avec Jordi peuvent m'aider, car mon problème (peut être que j'en ai d'autres), c'est que je ne comprends pas ce qui me renvoie une erreur de référence circulaire dans ma fonction, alors qu'en la modifiant en sub (cela revient si je ne m'abuse) à changer le mot funcion par sub et affecter le résultat dans une cellule donnée, au lieu que ça soit la cellule ou on colle la fonction, cela marche très bien...

D'autres idées ?

J'ai peut être une ligne qui met la grouille, mais je ne vois pas laquelle.

merci
 

Luki

XLDnaute Accro
Re ,Phillip

J'imagine que 'precell', comme 'Dercell' est une plage nommée?

Sans le fichier, il m'est difficile de voir d'où vient le problème, car impossible de vérifier où tu colles ta formule.

Autre chose, ta fonction ressemble à une formule sans arguments, comme ALEA(). Est-ce normal?

a+
 

Phillip

XLDnaute Occasionnel
Pardon...le zip ne faisait pas la taille règlementaire...Le revoici [file name=FORMUM EXCEL_20050513080829.zip size=10541]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/FORMUM EXCEL_20050513080829.zip[/file]
 

Pièces jointes

  • FORMUM EXCEL_20050513080829.zip
    10.3 KB · Affichages: 9

Luki

XLDnaute Accro
re Phillip,
voici la réponse:

Function MG()

Dim Rg As Range, C As Range
Dim I As Integer

Application.Volatile ' pour que le recalcul se fasse en automatique
Set Rg = Range('Date') ' 'date' suffit pour définir la plage de recherche

For Each C In Rg.Cells ' pas besoin de 'select', référence à la cellule 'C' directement
If C.Value = 38477 Or C.Value = 38547 Or C.Value = 38579 Or C.Value = 38657 Then
MG = 135
Exit Function
Else
MG = 108
End If
Next C
End Function


a+
 
P

Phillip

Guest
Merci !!!! :)

Ca marche !! Je n'aurais pas abordé le problème avec ce point de vue là (for each)...

Ceci dit, j'aurais aimé savoir ce qui plantait dans mon analyse...Mais bon, c'est le résultat qui compte !!

A +
 

Luki

XLDnaute Accro
Re phillip,

ptite explication de texte:

1° Le For each est plus rapide que for 1 to n
2° Une fonction N'EST PAS une Macro C'est à dire que si tu colles ta fonction en C28, tu ne peux pas dire à cette fonction C28.value=135 car cela revient à taper 135 dans la cellule, ce que fait la Macro. La fonction renvoie la valeur calculée via son nom, dans la cellule où elle se trouve : MG =135.
3° Dans le fichier joint, les plage ne sont pas affectées donc le programme ne tourne pas (pas vu: Set precel = Range('Precel'))
4° inutile de passer par des select dans une boucle (sauf qqfois dans 97) pour faire des calculs et affecter des valeurs. Cela ralentit et alourdit le code.
5° Sauf erreur, tu peux dire à une macro de travailler sur la cellule active, mais pas à la fonction, puisqu'elle est elle mêmeactive, donc ref circulaire...

Voilà
 

Discussions similaires

Statistiques des forums

Discussions
312 225
Messages
2 086 411
Membres
103 201
dernier inscrit
centrale vet