Mes fonctions renvoient 0 lors de la mise à jour

Bonjour,

J'ai un gros problème avec mon classeur excel et je ne trouve pas de solution sur internet, je viens donc à vous. Je m'explique:

J'ai un classeur où j'ai créé des fonctions qui utilisent des données présentes dans d'autres feuilles du classeur. Ces fonctions ont fonctionnées durant 2 mois mais maintenant alors que je n'ai rien modifié si je fais une mise à jour de la feuille ben mes fonctions revoient 0 ou #value. Voici un exemple de fonction que j'ai créé en VBA et qui ne fonctionne plus:

Function hr(i As Integer)

Dim j As Integer

j = (i + 1) + (i - 2) * 23

Dim k As Integer

k = j + 23

Dim x As Integer

For x = j To k

hr = hr + Sheets(5).Range("h" & x)

Next x

hr = hr / 24

End Function

Dernière précision: j'ai plusieurs classeurs qui utilisent les mêmes fonctions (je fais un copier-coller du code VBA) et sur 4 classeurs, deux fonctionnent et deux pas.

Merci d'avance pour l'aide que vous pourriez m'apporter.

J'ai voulu rajouter une formule à mon classeur:

Function p(t As Double)

p = 6.107799961 + t * (0.4436518521 + t * (0.01428945805 + t * (2.650648471 / 10000 + t * (3.031240396 / 1000000 + t * (2.034080948 / 100000000 + t * 6.136820929)))))

End Function

C'est une fonction simple et pourtant si je donne 1 en valeur de t, on me renvoie #value...

Voici les autres fonctions présentes dans le module:

Function pasjournalier(pfrigo As Double, parametrepas As Double)

pasjournalier = (pfrigo * 1000) / parametrepas

End Function

Function nombremachine(pourcent As Single, chargemin As Single, nombre As Integer)

chargemin = chargemin / 100

Dim test As Boolean

For i = 1 To nombre

If pourcent - chargemin < i * chargemin And test = False Then

nombremachine = i

test = True

End If

Next i

If nombremachine = 0 Then

nombremachine = nombre

End If

End Function

Function charge(pourcent As Single, nombre As Integer, nombremax As Integer)

charge = pourcent * 100 * nombremax / nombre

End Function

Function Pabilinéaire(temperature As Single, charge As Single, chargemin As Single)

Dim x As Boolean

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim l As Integer

x = False

For i = 1 To 110

j = i + 10

k = i - 1

l = j - 1

If i = 1 Then

k = 1

End If

If charge <= chargemin Then

charge = chargemin

End If

If Sheets(3).Range("A" & i) <= charge And Sheets(3).Range("A" & j) > charge And x = False Then

If Sheets(3).Range("B" & k) > temperature And Sheets(3).Range("B" & i) <= temperature Then

Pabilinéaire = Sheets(3).Range("c" & i) / ((Sheets(3).Range("B" & k) - Sheets(3).Range("B" & i)) * (Sheets(3).Range("A" & j) - Sheets(3).Range("A" & i))) * (Sheets(3).Range("B" & k) - temperature) * (Sheets(3).Range("A" & j) - charge) + Sheets(3).Range("c" & k) / ((Sheets(3).Range("B" & k) - Sheets(3).Range("B" & i)) * (Sheets(3).Range("A" & j) - Sheets(3).Range("A" & i))) * (temperature - Sheets(3).Range("B" & i)) * (Sheets(3).Range("A" & j) - charge) + Sheets(3).Range("c" & j) / ((Sheets(3).Range("B" & k) - Sheets(3).Range("B" & i)) * (Sheets(3).Range("A" & j) - Sheets(3).Range("A" & i))) * (Sheets(3).Range("B" & k) - temperature) * (charge - Sheets(3).Range("A" & i)) + Sheets(3).Range("c" & l) / ((Sheets(3).Range("B" & k) - Sheets(3).Range("B" & i)) * (Sheets(3).Range("A" & j) - Sheets(3).Range("A" & i))) * (temperature - Sheets(3).Range("B" & i)) * (charge - Sheets(3).Range("A" & i))

x = True

i = 110

End If

End If

Next i

End Function

Function ecwtdate(dates As Date)

Dim x As Boolean

x = False

If dates < CDate("01/04/2008") And x = False Or dates >= CDate("01/12/2008") And x = False Then

ecwtdate = 18

x = True

ElseIf dates > CDate("31/03/2008") And x = False And dates < CDate("01/06/2008") Or dates > CDate("31/08/2008") And x = False And dates < CDate("01/12/2008") Then

ecwtdate = 23

x = True

ElseIf dates > CDate("31/05/2008") And dates < CDate("01/09/2008") And x = False Then

ecwtdate = 27

x = True

End If

End Function

Function Paww(plage As Single, partload As Single, partmin As Single)

Dim x As Boolean

Dim i As Integer

Dim j As Integer

x = False

For i = 1 To 31

If partload < partmin Then

partload = partmin

End If

j = i + 3

If Sheets(2).Range("A" & i) <= partload And x = False And Sheets(2).Range("A" & j) > partload And Sheets(2).Range("B" & i) = plage Then

Paww = Sheets(2).Range("c" & i) + (partload - Sheets(2).Range("A" & i)) * (Sheets(2).Range("c" & j) - Sheets(2).Range("c" & i)) / (Sheets(2).Range("A" & j) - Sheets(2).Range("A" & i))

x = True

End If

Next i

End Function

Function hr(i As Integer)

Dim j As Integer

j = (i + 1) + (i - 2) * 23

Dim k As Integer

k = j + 23

Dim x As Integer

For x = j To k

hr = hr + Sheets(5).Range("h" & x)

Next x

hr = hr / 24

End Function

Je ne vois vraiment pas pourquoi cela ne fonctionne pas car dans d'autres classeurs ces formules fonctionnent.

Bonjour

Atouzazar

En début de fonction rajoutes (exemple)

Function pasjournalier(pfrigo As Double, parametrepas As Double)
Application.Volatile
pasjournalier = (pfrigo * 1000) / parametrepas
End Function

Vérifies aussi dans les options si tu n'as pas le calcul en mode manuel

Merci pour ta réponse.

Application.volatile fonctionne aussi en anglais?

A quoi sert cette ligne de code exactement?

Bonjour

Extrait de l'aide

Volatile, méthode

Cette méthode marque comme volatile une fonction personnalisée. Une fonction volatile doit être recalculée chaque fois qu'un calcul est effectué dans une cellule quelconque de la feuille de calcul. Une fonction non volatile n'est recalculée qu'en cas de changement des variables d'entrée. Cette méthode est sans effet si elle ne se trouve pas à l'intérieur d'une fonction définie par l'utilisateur utilisée pour calculer une cellule de feuille de calcul.

lezueh a écrit :

Application.volatile fonctionne aussi en anglais?

Si maintenant il y des instructions différentes entre une version Anglaise et une version Française, je ne suis pas au courant

Au fait : Problème résolu ?

J'ai essayé d'ajouter application.Volatile mais cela ne fonctionne pas lorsque mon programme se met à jour, mes fonctions retournent 0 ou #value. Je vais essayer de vous envoyer ma feuille excell mais elle est assez lourde je devrai attendre ce soir pour le compresser.

Je n'arrive pas a joindre mon classeur il est trop gros et j'ai pas de logiciel de compression au boulot. J'ai fait un nouveau classeur depuis et le premier code que j'utilise ne fonctionne déja pas alors qu'il fonctionne dans un autre calsseur, à ne rine comprendre!

Voici le code qui ne fonctionne pas:

Function hr(i As Integer)

Dim j As Integer

j = (i + 1) + (i - 2) * 23

Dim k As Integer

k = j + 23

hr = 0

Dim x As Integer

For x = j To k

hr = hr + Sheets(5).Range("h" & x)

MsgBox (Sheets(5).Range("h" & x))

Next x

hr = hr / 24

End Function

j'ai ajouté la ligne msgbox afin de controler la valeur mais la fenetre qui apparait est vide. Pourtant la fonction me renvoie 0 alors que si je donne un i de telle manière que il n'y ait plus de valeur dans la feuille 5 mais du texte aloors j'obtiens #value. Je comprends pas pourquoi j'ai 0 en cas normal.


Je vien de tester quelque chose: quand je change sheets 5 en sheets 7 ca fonctionne...pour quelle raison?

Bonjour

Sans fichier dur dur de trouver une solution, des fois on y arrive, mais la je ne vois pas

lezueh a écrit :

J'ai fait un nouveau classeur depuis

Joins celui-ci car tu as déjà un problème avec

lezueh a écrit :

je vien de tester quelque chose: quand je change sheets 5 en sheets 7 ca fonctionne...pour quelle raison?

????

je sais pas envoyer le classeur d'ici.

Pour l histoire des feuilles 5 et 7 si je met mes données en feuille 5, cela ne fonctionne pas mais si je les mets en 7 et que je modifie le code,cela fonctionne. Etant donné que j'ai plusieurs classeurs ou j'ai à chaque fois créé un module contenant les mêmes fonctions avec les mêmes références de pages il y a peut etre confusion ? pourtant je n'ouvre pas spécialement les classeurs en même temps. N'existe-t-il pas un code permettant lorsque j'appelle la feuille 5 de spécifier que c'est la feuille 5 de ce classeur précisément??

Bonjour

Un essai

hr = hr + ThisworkBook.Sheets(5).Range("h" & x)
lezueh a écrit :

je sais pas envoyer le classeur d'ici.

joindre un fichier

merci pour thisworkbook je vais essayer.

Pour attacher un fichier merci mais ca je sais quand meme faire c'est juste que j'ai pas d'outil de compression sur mon pc de bureau je devrai donc envoyer ca de chez moi.

...Je viens d'essayer thisworkbook je pensais avoir trouvé la solution miracle mais...ca marche pas

voila j ai reussi a compresser mais il etait trop grand (plus de 900ko en rar) je l ai donc splitté en 4 parts


j avais oublié les autres parties

20probleme0-part01.rar (291.99 Ko)
17probleme0-part02.rar (291.99 Ko)
25probleme0-part03.rar (291.99 Ko)

Personne peut m'aider?? mon code vba fonctionne quand je change le nom des pages (je modifie évidement le contenu des pages en fonction).

Rechercher des sujets similaires à "mes fonctions renvoient lors mise jour"