[RESOLU] VBA - error 1004 que je n'arrive pas à corriger

jeje1712

XLDnaute Nouveau
bonjour,


j'ai une error 1004 "application-defined or object-defined error" qui survient lors de l'exécution de mon code, et je n'arrive pas à en trouver la source.

Code:
.Range("R3").Offset(lngNbEvent, intNumTemps * 35).Value = "= -( " & .Range("Q3").Offset(lngNbEvent, intNumTemps * 35).Address _
& "-" & .Range("P3").Offset(lngNbEvent, intNumTemps * 35).Address & ") /" & .Range("O3").Offset(lngNbEvent, intNumTemps * 35).Address & "*" & dblVBout & "*" & dblZ

cette erreur survient lorsque je rajoute l'item "*" & dblZ
lors du débuguage, je vois que ce dblZ est bien attribué, il m'affiche la valeur 0,98 mais l'erreur apparait. elle disparait si j'enlève cet item.


cet item est calculé par une autre macro
Code:
dblZ = Round(CalculZviaPcTcPT(dblPressCrit, dblTempCrit, dblPress, dblTemp), 6)

avec la fonction CalculZviaPcTcPT comme suit :

Code:
Function CalculZviaPcTcPT(ByVal Pc#, ByVal Tc#, ByVal P#, ByVal T#)
Dim A, B, q, r, c, d, Pr, Tr As Double


Pr = P / Pc
Tr = T / Tc

A = 0.42747 * Pr / (Tr ^ 2.5)
B = 0.08664 * (Pr / Tr)
q = (B ^ 2) + B - A
r = A * B

c = -q
d = -r

CalculZviaPcTcPT = DEG3b(c, d)



End Function

cette fonction me permet de calculer les différents terme d'une équation de degré 3.

vous remarquerez qu'elle fait aussi appel à une autre fonction, DEG3b, qui s'écris tel que :

Code:
Function DEG3b(ByVal c#, ByVal d#)
Application.Volatile
Dim B#, A#, P#, q#, r#, s#, rx1#, rx2#, rx3#, ix2#, ix3#
    
    
    A = 1
    B = -1
    
    
    
    B = B / A / 3
    P = B * B - c / A / 3
    q = (B * c - d) / A / 2 - B * B * B
    r = q * q
    s = P * P * P
    If Abs(r - s) < 0.00000000000001 Then
        P = Sgn(q) * Abs(q) ^ (1 / 3)
        rx1 = 2 * P
        rx2 = -P
        rx3 = -P
    ElseIf r < s Then
        If r / s >= 1 Then r = 2 * (1 - Sgn(q)) * Atn(1) Else r = Atn(-q / Sqr(s - r)) + 2 * Atn(1)
        rx1 = Sqr(P) * Cos((r + 8 * Atn(1)) / 3) * 2
        rx2 = Sqr(P) * Cos((r - 8 * Atn(1)) / 3) * 2
        rx3 = Sqr(P) * Cos(r / 3) * 2
    Else
        r = Sqr(r - s)
        P = Sgn(q + r) * Abs(q + r) ^ (1 / 3)
        q = Sgn(q - r) * Abs(q - r) ^ (1 / 3)
        rx1 = q + P
        rx2 = -rx1 / 2
        ix2 = Sqr(3) * (q - P) / 2
        rx3 = rx2
        ix3 = -ix2
    End If
                
    If ix3 = 0 Then
        DEG3b = rx3 - B
    Else
        DEG3b = rx1 - B
    End If
    
    
    'DEG3b = Array(rx1 - b, rx2 - b, ix2, rx3 - b, ix3)
End Function

cette fonction me permettant de résoudre l'équation de degré 3 (dans mon cas particulier).


en exécutant en pas à pas depuis la ligne précédente, je me rends compte que l'exécution repasse par la fonction CalculZviaPcTcPT alors que ce calcul a déjà été fais quelques lignes avant ! pour moi la variable est déjà censé avoir été définie mais elle encore calculée lorsqu'elle apparait dans la ligne de code

De plus, en pas à pas, le code tourne en boucle entre la fonction CalculZviaPcTcPT et DEG3b : arrivé au End Function de CalculZviaPcTcPT, on repars au début de cette même fonction ...
je ne suis pas sûr que l'erreur vienne de là, mais pour moi ce n'est pas normal.



voilà, je sais pas trop où chercher, tout marche très bien, le calcul de dblZ est correct mais dès que je fais appel à ce terme dans le code ça bug

je suis ouvert à tout vos conseils, parce que là je ne vois pas comment faire !


MAJ : en supprimant ces deux macro et en intégrant le calcul de dblZ à la macro initial, l'erreur apparait aussi...
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Re : VBA - error 1004 que je n'arrive pas à corriger

Bonjour jeje1712,
Pas simple sans un exemple.
Tu déclare un .Value, alors que tu pose une formule.
Commence ta ligne par
VB:
.Range("R3").Offset(lngNbEvent, intNumTemps * 35).FormulaLocal = 'etc....

Cordialement
 

jeje1712

XLDnaute Nouveau
Re : VBA - error 1004 que je n'arrive pas à corriger

Bonjour jeje1712,
Pas simple sans un exemple.
Tu déclare un .Value, alors que tu pose une formule.
Commence ta ligne par
VB:
.Range("R3").Offset(lngNbEvent, intNumTemps * 35).FormulaLocal = 'etc....

Cordialement

J'ai joint un fichier très simplifié, contenant le code en question.

de plus, l'erreur ne provient pas du terme .Value (vérifié)



cordialement,
Jérôme
 

Pièces jointes

  • fichier test.xlsm
    94.6 KB · Affichages: 39
  • fichier test.xlsm
    94.6 KB · Affichages: 39
  • fichier test.xlsm
    94.6 KB · Affichages: 36

Staple1600

XLDnaute Barbatruc
Re : VBA - error 1004 que je n'arrive pas à corriger

Bonjour à tous

jeje1712
Comme l'a dit Efgé (que je salue au passage;)), l'ajout d'un fichier exemple dans le fil pourrait ne pas être inutile.
Il se pourrait même (c'est ce qui se raconte les soirs de veillées autour du feu) que cela nous permettent de faire des tests sur nos propres PC, sans devoir perdre du temps a récréer ce qui existe déjà sur ton disque dur ... ;)
 

Efgé

XLDnaute Barbatruc
Re : VBA - error 1004 que je n'arrive pas à corriger

Re
Salut Staple (Il n'y a pas assez de participants aux veillées de nos jours)

Surtout pour rendre le salut.
Quelques remarques
1 Avec FormulaLocale, il n'y a pas de plantage
2 Je n'ai pas vu ce que fait le code (mais fait il réellement quelque chose en l'état)
3 Tu présentes, dans ton Post1, deux fonctions(Dont une réccursive) et tu les utilises en tant que lignes de code noyées dans une sub générale, cela explique peut être beaucoups de choses....

[Prise de mouche]
4 Vue ta réponse je te souhaite bon courage pour la suite, sans être inquiet, l'ami J.M veille à ta destinée... ... ou pas :D
[/Prise de mouche]

Cordialement
 

jeje1712

XLDnaute Nouveau
Re : VBA - error 1004 que je n'arrive pas à corriger

Re


1 Avec FormulaLocale, il n'y a pas de plantage

chez moi si. j'exécute la macro sur le fichier envoyé ci-dessus et ça plante sur le premier élément faisant appel à dblZ

2 Je n'ai pas vu ce que fait le code (mais fait il réellement quelque chose en l'état)

oui ^^ le code cherche des évènements spéciaux dans un extract de Pression et les compiles en mixant quelques calculs de physique dedans. mais là je n'ai mis que la version simplifiée en supprimant des parties

Nettoyé comme ça, il se contente de remplir la première ligne de la liste à partir de l'évènement en ligne 6 de l'extract PT1Ga. Pour ma part, les premières cases sont remplies correctement jusqu'au calcul de la conso moyenne (colonne R).

3 Tu présentes, dans ton Post1, deux fonctions(Dont une réccursive) et tu les utilises en tant que lignes de code noyées dans une sub générale, cela explique peut être beaucoups de choses....

je pensais que l'erreur pouvait venir de l'exécution de ces fonctions, du coup j'ai cherché à les intégrer à la sub général pour ne pas en sortir, mais ça ne change rien.

[Prise de mouche]
4 Vue ta réponse je te souhaite bon courage pour la suite, sans être inquiet, l'ami J.M veille à ta destinée... ... ou pas
[/Prise de mouche]

je sias pas quoi dire là ? je t'ai froisé? je m'en excuse si c'est le cas, il n'y avais aucune mauvaise intention dans mes messages :)


cordialement
Jérôme
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : VBA - error 1004 que je n'arrive pas à corriger

Re


Efgé
Je veille à rien du tout.
Et là, ma destinée, c'est d'aller manger un petit encas ;)
je passais juste suggérer de joindre un fichier sauf que celui-ci était joint 3 minutes plutot.
j'avions point rafraichi à temps ;)

Je te laisse donc mettre tes mains dans le cambouis de jeje ;)
 

jeje1712

XLDnaute Nouveau
Re : VBA - error 1004 que je n'arrive pas à corriger

Re,


une remarque supplémentaire : il semble que si je converti le terme dblZ en entier, la macro fonctionne.... [Cint(dblZ)]

je ne vois pas d'où cela peux venir .... est-ce que la présence d'une virgule dans le terme dblZ gène l'exécution du code ? peut-être a voir dans la configuration de la langue, du séparateur de chiffre ou quelque chose comme ça .. je vais continuer de fouiner !



MAJ : je suis de plus en plus convaincu que le problème vient de là, mais je ne vois pas comment convertir un nombre à virgule stocké dans une variable de type double en un string où les décimales sont séparés par un point.
Si quelqu'un a des idées, je suis preneur !
Merci

Cordialement
Jérôme
 
Dernière édition:

jeje1712

XLDnaute Nouveau
Re : VBA - error 1004 que je n'arrive pas à corriger

J'ai trouvé pour la conversion :

Code:
strZ = Fix(dblZ) & "." & Mid(CStr(dblZ), 3, 6)

bon maintenant j'ai une deuxième question à soulever, j'ai donc écris mon code en faisant appel aux deux fonctions décrites dans mon premier post, et je ne comprend pas pourquoi mais l'exécution du code passe des dizaines de fois sur ces deux fonctions avant de fixer la valeur !

concrètement :

Code:
Function CalculZviaPcTcPT(ByVal Pc#, ByVal Tc#, ByVal P#, ByVal T#)
Dim A, B, q, r, c, d, Pr, Tr As Double


Pr = P / Pc
Tr = T / Tc

A = 0.42747 * Pr / (Tr ^ 2.5)
B = 0.08664 * (Pr / Tr)
q = (B ^ 2) + B - A
r = A * B

c = -q
d = -r

CalculZviaPcTcPT = DEG3b(c, d)



End Function


là, à l'avant dernière ligne, l'exécution passe à la fonction DEG3b :


Code:
Function DEG3b(ByVal c#, ByVal d#)
Application.Volatile
Dim B#, A#, P#, q#, r#, s#, rx1#, rx2#, rx3#, ix2#, ix3#
    
    
    A = 1
    B = -1
    
    
    
    B = B / A / 3
    P = B * B - c / A / 3
    q = (B * c - d) / A / 2 - B * B * B
    r = q * q
    s = P * P * P
    If Abs(r - s) < 0.00000000000001 Then
        P = Sgn(q) * Abs(q) ^ (1 / 3)
        rx1 = 2 * P
        rx2 = -P
        rx3 = -P
    ElseIf r < s Then
        If r / s >= 1 Then r = 2 * (1 - Sgn(q)) * Atn(1) Else r = Atn(-q / Sqr(s - r)) + 2 * Atn(1)
        rx1 = Sqr(P) * Cos((r + 8 * Atn(1)) / 3) * 2
        rx2 = Sqr(P) * Cos((r - 8 * Atn(1)) / 3) * 2
        rx3 = Sqr(P) * Cos(r / 3) * 2
    Else
        r = Sqr(r - s)
        P = Sgn(q + r) * Abs(q + r) ^ (1 / 3)
        q = Sgn(q - r) * Abs(q - r) ^ (1 / 3)
        rx1 = q + P
        rx2 = -rx1 / 2
        ix2 = Sqr(3) * (q - P) / 2
        rx3 = rx2
        ix3 = -ix2
    End If
        'ajout d'une condition if pour n'afficher que l'unique réel juste (tt du facteur de compressibilité)
        
    If ix3 = 0 Then
        DEG3b = rx3 - B
    Else
        DEG3b = rx1 - B
    End If
    
    
    'DEG3b = Array(rx1 - b, rx2 - b, ix2, rx3 - b, ix3)
End Function

là, à la fin du code, on va exécuté la dernière ligne de la première fonction, qui est End Function, et pour moi le code est censé retourner à la macro initial, mais je ne sais pas pourquoi il ré-exécute la function CalculZviaPcTcPT;??


il en résulte que le traitement met trèèèèès longtemps à se faire ...


Quelqu'un peut-il m'aider à comprendre pourquoi ? un problème dans la déclaration de variable ou de fonction (ou de sub) ?


MAJ : en exécutant pas à pas, je me rends compte que ces sous-fonctions sont exécutées sans arrêt, même quand elle ne sont pas apellée pour le calcul de dblZ .... ???????? je suis perdue, mais du coup je penche plus pour une mauvaise déclaration qu'un problème de liénarité dans le code en lui même

MAJ2 : Djingo ! c'est la ligne
Code:
Application.Volatile
qui fait ça ^^
Merci tout de même à vous, et un bon weekend ! Je clos


cordialement,
Jérôme
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 184
dernier inscrit
Di Martino