Recalcul manuel nécessaire pour appel de fonction personalisée

jhofman

XLDnaute Occasionnel
bonjour


J'ai un classeur avec des requettes essbase (Oracle Hyperion Essbase)
et des formules de calcul utilisant des fonctions personalisée

exemple

Code:
Public Function DiffT() As Variant
For Each c In Range("D9:M9")
If c = Range("Trimprec") Then Exit For
Next c
DiffT = Diff(Cells(Application.Caller.Row, c.Column + 1), Cells(Application.Caller.Row, c.Column))
End Function

après appel à une maro qui fait le retrieve (essbase) les cellules faisaint appel à la fonction sont valorisées avec #VALEUR!

malgré différentes astuces pour raffairchir les données

Code:
Sheets(sh).EnableCalculation = False
Sheets(sh).EnableCalculation = True


Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.Calculation = xlCalculationManual

Application.CalculateFull
Application.SendKeys "%^{F9}"


au final seule l'action manuelle ALT+ CTRL + F9 sur plusieurs onglet permet de valoriser ces données.

Merci de voter aide.
 

Gorfael

XLDnaute Barbatruc
Re : Recalcul manuel nécessaire pour appel de fonction personalisée

Salut jhofman et le forum
Code:
Public Function DiffT() As Variant
application.volatile      '**********************
For Each c In Range("D9:M9")
If c = Range("Trimprec") Then Exit For
Next c
DiffT = Diff(Cells(Application.Caller.Row, c.Column + 1), Cells(Application.Caller.Row, c.Column))
End Function
ALT+ CTRL + F9 : lance un ordre de calcul sur toutes les feuilles de tous les classeurs ouverts.
Donc, vraisemblablement, pour avoir une réponse correcte, il faut recalculer une autre feuille. soit tu mets une instruction recalculant seulement celle (ou celles) qui doivent obligatoirement être recalculées, soit tu lance un recalcul global de toutes les feuilles, au risque d'avoir un temps d'attente conséquent.
A+
 

jhofman

XLDnaute Occasionnel
Re : Recalcul manuel nécessaire pour appel de fonction personalisée

Bonjour Gorfael


j'ai lancé la seonde partie du code sur l'ensemble des feuilles et cele ne donne aucun résultat
j'ai aussi positionné application.volatile au début de chanque fontion sans plus de succès
me pose la question sur le format de restitution choixi pour sa polyvalence "variant " ???
Merci de voter aide.
 

jhofman

XLDnaute Occasionnel
Re : Recalcul manuel nécessaire pour appel de fonction personalisée

bonjour


je me demande si ce n'est pas Application.Caller.Row qui pose problème.

si j'actualise avec ALT+ CTRL + F9 la feuille 2
c'est ok

puis je vais sur la feuille 3 c'est ok après actualisation

si je reviens sur la 2 ce n'est plus à jour.... et je retrouve des données de la feuille 3....:mad:
 
Dernière édition:

jhofman

XLDnaute Occasionnel
Re : Recalcul manuel nécessaire pour appel de fonction personalisée

bonjour le forum

les données actualisée sur la feuille 2 viennent écraser les données de la feuille 1 et inversement
voici le fichier : c'est un joli petit casse tête :D

Amis du forum jetez un oeuil !

c'est comme si la modification de la feuille 2 ( qui ne serait pas terménée ) se poursuivait sur la feuille 1 !!:rolleyes:
 

Pièces jointes

  • demo.zip
    32.7 KB · Affichages: 29
  • demo.zip
    32.7 KB · Affichages: 31
  • demo.zip
    32.7 KB · Affichages: 30
Dernière édition:

jhofman

XLDnaute Occasionnel
Re : Recalcul manuel nécessaire pour appel de fonction personalisée

Il me faudrait la syntaxe de "Application.Caller.Address" qui restitue non pas l'adresse mais aussi l'onglet de la cellule appelant une fonction parseonnalisée.

voici... et je suis sur le bon chemin
Code:
Function ThisSheetName() As String
    Application.Volatile True
    ThisSheetName = Application.Caller.Parent.Name
End Function

il y avait confusion entre le active sheet et le sheet de restitution des données !!!:)
 
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Recalcul manuel nécessaire pour appel de fonction personalisée

Salut jhofman et le forum
évite de réfléchir sur le forum. Ça ne fait que noyer le poisson et on ne sait plus où on en est.
Application caller donne le nom du contrôle qui lance la macro... donc la feuille est activesheet.
F9 calcule activesheet.
ALT+ CTRL + F9 calcule toutes les feuilles de tous les classeurs ouverts.
donc ta fonction pourrait commencer par Activesheet.calculate.
A+
 

jhofman

XLDnaute Occasionnel
Re : Recalcul manuel nécessaire pour appel de fonction personalisée

Désolé d'avoir encombré le forum

pour ceux qui sont intéressés, je cherchais via une fonction très simple à valoriser des cellulles sur plusieurs onglets à partir des données de l'onglet et de paramètres. la solution est ci-dessous:

Code:
Public Function Diff() As Variant
Application.Volatile
For Each c In Range("D9:M9")
If c = Range("Trimprec") Then Exit For
Next c
Diff = Sheets(ThisSheetIndex).Cells(Application.Caller.Row, c.Column + 1), - Sheets(ThisSheetIndex).Cells(Application.Caller.Row, c.Column)
End Function

et
Code:
Function ThisSheetIndex() As Integer
    ThisSheetIndex = Application.Caller.Parent.Index
End Function

Merci pour votre soutien, je serais plus bref la prochaine fois.:)
 

Statistiques des forums

Discussions
312 505
Messages
2 089 067
Membres
104 016
dernier inscrit
Mokson