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

recalcul fonction vba...

6 réponses
Avatar
LeGoldo
Bonjour et BoNne AnN=E9E =E0 tous !

J'ai un classeur excel 2000 avec 3 feuilles.

Dans chacune des feuilles, j'utilise dans plusieurs cellules une
fonction perso qui fonctionne ;-)))

Le probl=E8me est que d=E8s que je change de feuille, les cellules de
cette feuille contenant cette fonction affichent #N/A et celles de la
pr=E9c=E9dente restent correctes.

Si je force le recalcul, avec [F9] ou en modifiant quelque cellule que
ce soit, les choses s'inversent :
les r=E9sultats deviennent corrects et ce sont les cellules de la
feuille pr=E9c=E9dente qui affichent #N/A :-(((

Qu'est-ce donc que ce binzzz ???

Merci de vos =E9claircissements et ...

.=2E. =E0 vous lire !

Cordialement,

LeGoldo

6 réponses

Avatar
MichDenis
Publie ici ta fonction personnelle.



"LeGoldo" a écrit dans le message de news:

Bonjour et BoNne AnNéE à tous !

J'ai un classeur excel 2000 avec 3 feuilles.

Dans chacune des feuilles, j'utilise dans plusieurs cellules une
fonction perso qui fonctionne ;-)))

Le problème est que dès que je change de feuille, les cellules de
cette feuille contenant cette fonction affichent #N/A et celles de la
précédente restent correctes.

Si je force le recalcul, avec [F9] ou en modifiant quelque cellule que
ce soit, les choses s'inversent :
les résultats deviennent corrects et ce sont les cellules de la
feuille précédente qui affichent #N/A :-(((

Qu'est-ce donc que ce binzzz ???

Merci de vos éclaircissements et ...

... à vous lire !

Cordialement,

LeGoldo
Avatar
LeGoldo
Bonsoir,


Publie ici ta fonction personnelle.


Aussitot fait :
****
Option Explicit

Function RangAbsolu(nVal As Variant, oPlage As Range, Optional
lAscending As Boolean = True)
Dim c As Integer, v_() As Variant, oArea As Range

Application.Volatile (True)
ReDim v_(1 To oPlage.Areas.Count)
c = 1
For Each oArea In oPlage.Areas
v_(c) = Abs(oArea.Item(1).Value)
c = c + 1
Next

RangAbsolu = Application.Match(Abs(nVal), ShellSort(v_, lAscending), 0)

End Function
*****

L'appel de fonction est :
=RANGABSOLU(C20;$C20;$G20;$K20;$O20;...;$AM20;$AQ20;$AU20);1)

Nota : si je remplace Application.match(...) par
Application.WorksheetFunction.match(...),
les #N/A se transforment en #VALEUR !?!?

Avatar
MichDenis
Si le problème de ta fonction se résume à l'utilisation de WorksheetFunction...
cette situation est amplement commentée et bien connue....quand tu utilises
la fonction Match tu dois employer cette syntaxe : Application.Match()
l'usage de WorksheetFunction rendant le résultat aléatoire.



"LeGoldo" a écrit dans le message de news:

Bonsoir,


Publie ici ta fonction personnelle.


Aussitot fait :
****
Option Explicit

Function RangAbsolu(nVal As Variant, oPlage As Range, Optional
lAscending As Boolean = True)
Dim c As Integer, v_() As Variant, oArea As Range

Application.Volatile (True)
ReDim v_(1 To oPlage.Areas.Count)
c = 1
For Each oArea In oPlage.Areas
v_(c) = Abs(oArea.Item(1).Value)
c = c + 1
Next

RangAbsolu = Application.Match(Abs(nVal), ShellSort(v_, lAscending), 0)

End Function
*****

L'appel de fonction est :
=RANGABSOLU(C20;$C20;$G20;$K20;$O20;...;$AM20;$AQ20;$AU20);1)

Nota : si je remplace Application.match(...) par
Application.WorksheetFunction.match(...),
les #N/A se transforment en #VALEUR !?!?

Avatar
LeGoldo
Re,

Comme je l'ai dit dans mon 'Nota', c'est accessoire ;-)))

Le problème persiste au changement de feuille :-(((

Une autre idée ?

Cordialement,

LeGoldo
Avatar
MichDenis
As-tu essayé ceci :

Function RangAbsolu(nVal As Variant, oPlage As Range, Optional _
lAscending As Boolean = True)
Dim c As Integer, v_() As Variant, oArea As Range

Application.Volatile (True)
ReDim v_(1 To oPlage.Areas.Count)
c = 1
With Worksheets(oPlage.Parent.Name)
For Each oArea In .Areas
v_(c) = Abs(oArea.Item(1).Value)
c = c + 1
Next
End With

RangAbsolu = Application.Match(Abs(nVal), ShellSort(v_, lAscending), 0)

End Function






"LeGoldo" a écrit dans le message de news:

Re,

Comme je l'ai dit dans mon 'Nota', c'est accessoire ;-)))

Le problème persiste au changement de feuille :-(((

Une autre idée ?

Cordialement,

LeGoldo
Avatar
LeGoldo
Bonjour,

J'ai réécrit ma fonction :
****
Function RangAbsolu2(nVal As Variant, oPlage As Range, Optional
lAscending As Boolean = True, Optional nOffset As Integer = 1) As
Variant
Dim c As Integer, i As Integer, v_() As Variant, oRge As Range

Application.Volatile (True)
ReDim v_(1 To oPlage.Cells.Count)
c = 0
i = 1
For Each oRge In oPlage.Cells
If i = 1 Or (i Mod nOffset) = 1 Then
c = c + 1
v_(c) = Abs(oRge.Value)
End If
i = i + 1
Next
ReDim Preserve v_(1 To c)

RangAbsolu2 = Application.Match(Abs(nVal), ShellSort(v_, lAscending),
0)

End Function
****
... qui utilise une plage standard (cellDébut:cellFin) et ça garde
les résultats au changement de feuille ;-)))

Mais j'aimerais bien savoir pourquoi une plage discontinue
(cell1;cell2;...;cellN) pose problème alors que la fonction originale
( Rang(val;(plage discontinue);1) ) cela ne se produit pas !

il faut noter que dans les 2 cas, si je clique sur "=", la zone 'plage'
m'affiche #VALEUR.
Est-ce à croire que les plages discontinues sont mal
supportées/gérées :-(((

Cordialement,

LeGoldo