Résultat initial devient #VALEUR! quand copié

Bonjour!

Je me permets de poster ici car j'ai un petit soucis que je n'arrive pas à résoudre.

J'ai créé une fonction dans VBA qui me permet de trouver la solution x d'un polynôme d'ordre 3 de la forme A * x^ 3 + B * x^2 + C * x + D = y, en donnant le y dans une cellule.

Donc en gros j'ai un y donné en cellule C3, en C4 j'appelle ma fonction "Poly(C3)", le résultat s'affiche, parfait.

Par contre, si je sélectionne ma case C4 et que je la copie dans un autre classeur (afin d'exporter les résultats par exemple), la copie s'effectue, mais ma case C4 initiale affiche maintenant #VALEUR!. Pour relancer le calcul, je dois aller dans la case et refaire ENTRER, ou encore faire ALT+CTRL+F9, ou faire appel à une macro "Application.CalculateFull".

Ce problème apparaît uniquement quand je copie/colle ma case dans un autre classeur, pas de problème dans mon classeur initial, dans la même feuille ou dans une autre.

J'ai fait quelques essais et le problème disparaît si je retire la première partie du code. Cette partie me sert à définir les paramètres A, B, C et D en fonction de ma valeur de y. Si je définis ces paramètres par défaut et que je laisse uniquement la partie calcul de x, le problème n'est plus présent.

J'espère avoir été clair, si ce n'est pas le cas n'hésitez pas à me poser des questions !

EDIT : Mon problème semble venir de mes plages. J'ai fait un test en copiant les plages utilisées dans le nouveau classeur, en les nommant de la même manière : la valeur calculée dans mon classeur initial ne change pas. Si j'enlève une plage de l'autre classeur, ça revient en #VALEUR!.

Il m'est impossible d'utiliser des plages du coup ? Ou bien dois-je les définir d'une certaine manière pour éviter ce problème ?

Merci par avance.

Voici le code :

Function Poly(y As Double) As Double

count = Range("nb_points").Value 'Nombre de points, ce qui va définir mon nombre de fonctions

For i = 1 To count - 1 'J'ai count-1 fonctions différentes, je vais chercher mes paramètres A, B, C et D en fonction du y
    If y >= Range("y_tableau").Cells(i) And y < Range("y_tableau").Cells(i + 1) Then 'Mes intervalles se trouvent dans y_tableau
         A = Range("poly_tableau").Cells(i, 1)
        B = Range("poly_tableau").Cells(i, 2)
        C = Range("poly_tableau").Cells(i, 3)
        D = Range("poly_tableau").Cells(i, 4) - y
        x_guess = (Range("x_tableau").Cells(i) + Range("x_tableau").Cells(i + 1)) / 2 'Définition d'un x pour la méthode de Newton qui suit
        End If
Next i

'Méthode de Newton pour trouver mon x

Maxiter = 100
Eps = 0.0001
cur_x = x_guess

    For i = 1 To Maxiter
        fx = A * cur_x2^ 3 + B * cur_x ^ 2 + C * cur_x + D
        DX = A * 3 * cur_x ^ 2 + B * 2 * cur_x + C
        cur_x2 = cur_x - (fx / DX)
    If Abs(cur_x2 - cur_x) < Eps Then Exit For
        cur_x = cur_x2
    Next i

Poly = cur_x

End Function

Bonjour,

Je pense que ta fonction n'agit que sur un seul classeur, donc quand tu copies vers un autre classeur, comme la fonction n'est pas présente, cela revoi la valeur

Soit tu enregistres ta fonction en xlam

soit tu copies la fonction dans l'autre classeur

Merci pour ta réponse.

Du coup je pense que je n'ai pas été assez clair dans mon explication

Le #VALEUR! s'affiche dans mon classeur initial, celui où j'ai ma fonction.

En gros, dès que je colle n'importe quelle case de mon classeur 1 vers un classeur 2, toutes les cases de mon classeur 1 contenant ma fonction deviennent #VALEUR!

Le problème semble venir du fait que les plages de données que j'utilise dans ma fonction (classeur 1) n'existent pas dans le classeur 2, mais du coup je ne sais pas comment faire.

Bonjour,

Deux petites remarques :

  • ta fonction ne se recalcule pas, tu dois donc la relancer à chaque fois pour qu'elle effectue un recalcul..
  • elle est dépendantes de plages nommées dans un classeur, ce qui la destine à n'être utilisée que dans un classeur donné ; pour défaire cette dépendance, les élément relevant de ces plages nommées doivent li être passés en arguments.

Cordialement.

Bonjour et merci pour ton retour!

Pour te répondre :

  • Ma fonction se recalcule automatiquement lors que je change la valeur de y (ex : Poly(C3), lorsque je change C3, la valeur bien calculée automatiquement).
  • Je comprends bien cette notion de dépendance. Ce qui m'échappe, c'est pourquoi la copie d'une cellule vers un autre classeur (n'importe quelle cellule en fait, pas seulement celle où se trouve ma formule) "force" ma fonction à se calculer de nouveau, lui fasse perdre les plages de données, et donc entraîne l'affichage de #VALEUR!

Je ne souhaite pas utiliser ma fonction dans un autre classeur, je veux juste copier les données générées (sans pour autant qu'elles "disparaissent" du fichier d'origine, m'obligeant à forcer un recalcule)

Rechercher des sujets similaires à "resultat initial devient valeur quand copie"