Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ma Fonction personnalisée ne fonctionne pas

6 réponses
Avatar
AG
Bonjour,

Ma fonction personnalis=E9e ne fonctionne pas...toujours (je la mets
dessous pour information).
Lorsque j'ouvre un nouveau fichier excel (2007), que j'ouvre l'=E9diteur
de code vba, que j'ins=E8re un Module standard (pas un module de
feuille, un vrai module standard), et que j'y met ma fonction, tout va
bien. Je peux la tester: sur la feuille 1 je mets 1 en A1, et sur la
feuille deux je mets =3DFeuillePrecedente(A1) et j'obtiens bien 1.

Maintenant lorsque je fais la m=EAme chose dans mon vieux fichier excel
(2007), =E7a ne marche plus.

Auriez vous une id=E9e de ce qui peut interf=E9rer ? Quand je tape une
formule, il me propose bien ma fonction. Mais au lieu d'afficher le
bon r=E9sultat, j'obitens #NOM?

Merci d'avance pour votre aide,

Alexandre.

Public Function FeuillePrecedenteAAA(rng As Range)
Application.Volatile
Dim nIndex As Integer
Dim mIndex As Integer

nIndex =3D rng.Cells(1).Parent.Index

If (nIndex > 1) Then
mIndex =3D nIndex - 1
Else
mIndex =3D nIndex
End If

FeuillePrecedenteAAA =3D Sheets(mIndex).Range(rng.Address)
End Function

6 réponses

Avatar
MichD
Bonjour,

| Mais au lieu d'afficher le bon résultat, j'obitens #NOM?

Quand tu obtiens une erreur de type #NOM? c'est que le nom de la fonction n'est pas reconnu. Une faute d'orthographe dans le
nom de la fonction ou la fonction n'est pas dans un module standard.

Question 1 : Es-tu certain de ne pas avoir fait une faut d'orthographe en tapant la formule þuillePrecedenteAAA(A1) qui
représente le nom de la fonction ?

Question 2 ? Es-tu certain que la fonction est dans un véritable module "Standard". Il peut arriver par distraction d'insérer
un module de classe?

Une façon de tester est d'introduire un point d'arrêt sur la ligne de déclaration de la fonction dans le module standard ou
d'écrire l'instruction-Stop comme ligne de code au tout début du code. Par la suite, tu exécutes la fonction pas à pas en
utilisant la touche F8. Cela te permet de voir si au moins la fonction est appelée lors de la validation de la cellule et le
déroulement de la fonction.

Si tu ne trouves pas la cause, est-ce que tu as d'autres macros - fonctions dans le classeur ? Il est possible qu'il y a une
interaction douteuse...mais sans voir le fichier, c'est quand même difficile!


Pour la fonction, il me semble que ceci devrait être suffisant.
'----------------------------
Public Function FeuillePrecedenteAAA(rng As Range)
Application.Volatile
Dim nIndex As Integer

nIndex = rng.Parent.Index

If (nIndex > 1) Then
nIndex = nIndex - 1
End If

FeuillePrecedenteAAA = Sheets(nIndex).Range(rng.Address)
End Function
'----------------------------


MichD
------------------------------------------
"AG" a écrit dans le message de groupe de discussion :

Bonjour,

Ma fonction personnalisée ne fonctionne pas...toujours (je la mets
dessous pour information).
Lorsque j'ouvre un nouveau fichier excel (2007), que j'ouvre l'éditeur
de code vba, que j'insère un Module standard (pas un module de
feuille, un vrai module standard), et que j'y met ma fonction, tout va
bien. Je peux la tester: sur la feuille 1 je mets 1 en A1, et sur la
feuille deux je mets þuillePrecedente(A1) et j'obtiens bien 1.

Maintenant lorsque je fais la même chose dans mon vieux fichier excel
(2007), ça ne marche plus.

Auriez vous une idée de ce qui peut interférer ? Quand je tape une
formule, il me propose bien ma fonction. Mais au lieu d'afficher le
bon résultat, j'obitens #NOM?

Merci d'avance pour votre aide,

Alexandre.

Public Function FeuillePrecedenteAAA(rng As Range)
Application.Volatile
Dim nIndex As Integer
Dim mIndex As Integer

nIndex = rng.Cells(1).Parent.Index

If (nIndex > 1) Then
mIndex = nIndex - 1
Else
mIndex = nIndex
End If

FeuillePrecedenteAAA = Sheets(mIndex).Range(rng.Address)
End Function
Avatar
isabelle
bonjour,

tu peut le faire avec ou sans Range,

Function ShPrevious1(rng As Range) As String
If Sheets(rng.Parent.Name).Index <> 1 Then ShPrevious1 = Sheets(rng.Parent.Name).Previous.Name
End Function


Function ShPrevious2() As String
If ActiveSheet.Index <> 1 Then ShPrevious2 = ActiveSheet.Previous.Name
End Function


--
isabelle
Avatar
MichD
Si je peux me permettre Isabelle,

| tu peut le faire avec ou sans Range,

Imagine la fonction utilisée dans plusieurs feuilles différentes, la feuille de référence
serait la feuille active et non la feuille où la fonction est écrite. Peu importe la feuille
où la fonction est écrite, la feuille précédente serait toujours la même soit la feuille
active - 1 . Je ne crois pas que c'est ce que l'usager désire obtenir! Et au cas où ce
serait le cas, il faudrait aussi ajouter Appplication.Volatile n'est-ce pas ?

Mais on pourrait améliorer la fonction par exemple comme ceci, en remplaçant
Sheets pour Worksheets afin d'éviter les problèmes si la feuille précédente est
une feuille graphique.
'---------------------------------------------------
Public Function FeuillePrecedenteAAA(Rng As Range)
Application.Volatile
With Rng.Parent
If .Index > 1 Then
FeuillePrecedenteAAA = Worksheets(.Index - 1).Range(Rng.Address)
Else
FeuillePrecedenteAAA = Worksheets(.Index).Range(Rng.Address)
End If
End With
End Function
'---------------------------------------------------

Tu as effectué la pose des pneus d'hiver sur ton auto et préparé ta pelle? Le plaisir n'est pas si loin!
;-))


MichD
------------------------------------------
Avatar
isabelle
non, il fait bien trop beau pour pensé ça ;-)

--
isabelle


Le 2011-10-28 08:43, MichD a écrit :

Tu as effectué la pose des pneus d'hiver sur ton auto et préparé ta pelle? Le plaisir n'est pas si loin!
;-))
Avatar
MichD
Je me reprends... la procédure devrait plutôt ressembler à ceci dans le cas où
il y a d'autres types de feuille (graphique par exemple) insérée dans le classeur.

S'il n'y a pas de feuille précédente, la fonction retourne la valeur de l'adresse dans la feuille active.
'--------------------------------------
Public Function FeuillePrecedenteAAA(Rng As Range)
Dim A As Integer
Application.Volatile
With Rng.Parent
If .Index > 1 Then
A = .Index
Do
A = A - 1
Loop Until TypeName(Sheets(A)) = "Worksheet"
FeuillePrecedenteAAA = Sheets(A).Range(Rng.Address)
Else
FeuillePrecedenteAAA = Sheets(.Index).Range(Rng.Address)
End If
End With
End Function
'--------------------------------------


MichD
------------------------------------------
Avatar
MichD
Je me reprends... la procédure devrait plutôt ressembler à ceci dans le cas où
il y a d'autres types de feuille (graphique par exemple) insérée dans le classeur.

S'il n'y a pas de feuille précédente, la fonction retourne la valeur de l'adresse dans la feuille active.
'--------------------------------------
Public Function FeuillePrecedenteAAA(Rng As Range)
Dim A As Integer
Application.Volatile
With Rng.Parent
If .Index > 1 Then
A = .Index
Do
A = A - 1
Loop Until TypeName(Sheets(A)) = "Worksheet"
FeuillePrecedenteAAA = Sheets(A).Range(Rng.Address)
Else
FeuillePrecedenteAAA = Sheets(.Index).Range(Rng.Address)
End If
End With
End Function
'--------------------------------------


MichD
------------------------------------------