Insertion d'une formule au format String

Résolu
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011 - 21 mai 2011 à 10:52
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011 - 22 mai 2011 à 15:54
Bonjour,
J'ai un souci dans mon programme de pertes de charge hydraulique. Je souhaite calculer les pertes de charge singulier dans une canalisation en insérant au 3 lignes dans une feuille de calcul afin de pouvoir y renseigner le débit, la longueur de canalisation, son diamètre et sa rugosité.
Etant donné que ces valeur sont renseigné après le lancement de la macro, toute les variable de la macro son des chaines de caractères afin de pouvoir les concaténer et créer la formule de pertes de charges.
Jusqu'à la création de cette chaîne de caractère pas de problème mais quand je souhaite l'insérer dans la feuille de calcul une erreur apparait et le code s'arrête : erreur '1004' Erreur définie par l'Application ou par l'objet.

voici le code, j'ai pris soin à ce que les fonction Reynolds et Haaland retournent bien une chaîne de caractère.
Sub pertes_sing()
    Cells(3, 1).select
    Call insertion
    
    ActiveCell.Offset(1, 0).Formulalocal = "Q"
    ActiveCell.Offset(2, 0).Formulalocal = "D"
    ActiveCell.Offset(3, 0).Formulalocal = "L"
    ActiveCell.Offset(1, 2).Formulalocal = "Epsilon"
    ActiveCell.Offset(3, 4).Formulalocal = "Dh"
    
    Dim Q As String
    Dim D As String
    Dim L As String
    Dim Nu As String
    Dim S As String
    Dim epsilon As String
    Dim V As String
    Dim Re As String
    Dim f As String
    Dim result As String
    
    
    Q = "(" & ActiveCell.Offset(1, 1).address & "/ 3600)"
    D = "(" & ActiveCell.Offset(2, 1).address & "/ 1000)"
    L = "(" & ActiveCell.Offset(3, 1).address & "/ 1000)"
    epsilon = ActiveCell.Offset(3, 1).address
    
    S = "3.14 * " & D & "^ 2 / 4"
    
    V = "(" & Q & "*" & S & ")"

    Nu = "1E-06"
    
    Re = Reynolds(D, Q, Nu)
    f = haaland(epsilon, D, Re)

    result = "= " & f & " * (" & L & "/" & D & ") * (" & V & "^ 2 / (2 * 9.81))"
    'msgbox (result)
    ActiveCell.FormulaR1C1 = result

End Sub


Merci d'avance.

16 réponses

Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
22 mai 2011 à 10:08
Pour envoyer la valeur d'une variable dans une cellule, il suffit de déclarer ta variable "résultat" de type single. Faire tous les calculs dans le code, puis, envoyer le résultat numérique dans la cellule. Dans la mesure du possible, éviter de manipuler les cellules.
3
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
21 mai 2011 à 11:11
Quelle est ta question ?
Peux tu donner le code du call insertion ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mai 2011 à 11:13
Bonjour,

Peux-tu nous mettre ici ce que t'affiche Msgbox Result, s'il te plait ?


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011
21 mai 2011 à 11:17
voila insertion:
Sub insertion()
    For i = 0 To 5
        ActiveCell.EntireRow.Insert
    Next i
End Sub

il n'a rien de particulier, c'est juste que je vais l'utiliser souvent.

Sinon ma question se trouve sur la ligne :
result = "= " & f & " * (" & L & "/" & D & ") * (" & V & "^ 2 / (2 * 9.81))"
    ActiveCell.FormulaR1C1 = result


où j'ai une erreur qui arrête le programme. Est ce que ma chaîne de caractère est mauvaise? Un problème de concaténation?

Tiens dans le doute je te copie tout le module :
Function ln(ByVal X As Variant) As Double
    ln = log(X) * 2.3026
End Function

Sub insertion()
    For i = 0 To 5
        ActiveCell.EntireRow.Insert
    Next i
End Sub

Function haaland(ByVal epsilon As String, ByVal D As String, ByVal Re As String) As String

    haaland = "(1 / (-1.8 * log((6.9 /" & Re & ") + (" & epsilon & " / (" & D & "* 3.7)) ^ 1.11))) ^ 2"
        
End Function
Function Reynolds(ByVal D As String, ByVal Q As String, ByVal Nu As String) As String

    D = "(" & D & "/ 1000"
    S = "3.14 * " & D & "^ 2 / 4"
    Q = "(" & Q & "/ 3600"
    Reynolds = Q & "* " & S & "* " & D & "/ " & Nu
    
End Function

Sub pertes_sing()
    Cells(3, 1).select
    Call insertion
    
    ActiveCell.Offset(1, 0).Formulalocal = "Q"
    ActiveCell.Offset(2, 0).Formulalocal = "D"
    ActiveCell.Offset(3, 0).Formulalocal = "L"
    ActiveCell.Offset(1, 2).Formulalocal = "Epsilon"
    ActiveCell.Offset(3, 4).Formulalocal = "Dh"
    
    Dim Q As String
    Dim D As String
    Dim L As String
    Dim Nu As String
    Dim S As String
    Dim epsilon As String
    Dim V As String
    Dim Re As String
    Dim f As String
    Dim result As String
    
    
    Q = "(" & ActiveCell.Offset(1, 1).address & "/ 3600)"
    D = "(" & ActiveCell.Offset(2, 1).address & "/ 1000)"
    L = "(" & ActiveCell.Offset(3, 1).address & "/ 1000)"
    epsilon = ActiveCell.Offset(3, 1).address
    
    S = "3.14 * " & D & "^ 2 / 4"
    
    V = "(" & Q & "*" & S & ")"

    Nu = "1E-06"
    
    Re = Reynolds(D, Q, Nu)
    f = haaland(epsilon, D, Re)

    result = "= " & f & " * (" & L & "/" & D & ") * (" & V & "^ 2 / (2 * 9.81))"
    'msgbox (result)
    ActiveCell.FormulaR1C1 = result

End Sub

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011
21 mai 2011 à 11:22
Le msgbox() me retourne:
= (1 / (-1.8 * log((6.9 /(($B$4/ 3600)/ 3600* 3.14 * (($B$5/ 1000)/ 1000^ 2 / 4* (($B$5/ 1000)/ 1000/ 1E-06) + ($B$6 / (($B$5/ 1000)* 3.7)) ^ 1.11))) ^ 2 * (($B$6/ 1000)/($B$5/ 1000)) * ((($B$4/ 3600)*3.14 * ($B$5/ 1000)^ 2 / 4)^ 2 / (2 * 9.81))
0
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
21 mai 2011 à 11:22
remplace :
ActiveCell.FormulaR1C1 = result
par :
ActiveCell.Formula = result
0
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011
21 mai 2011 à 11:24
Philippe734, j'ai toujour la même erreur, j'avais essayé aussi ActiveCell.FormulaLocal
0
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
21 mai 2011 à 11:38
Cause de l'erreur :
- il y a un multiplier au début de la formule
- il y a des points au lieu de virgules dans les 3.14 et 9.81
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mai 2011 à 11:41
Comment se fait-il que ta formule (après le =) ne soit pas entre guillemets ?
Pas de guillemets dans le msgbox ou tu as oublié de les montrer ?
Après relecture : tu ne les a pas mis, toi, dans la construction de résult


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011
21 mai 2011 à 11:50
ucfoutu, j'ai pas mis les guillemets, j'ai copier le retour de la console après un debug.print.
Philippe734, j'ai pas tout compris à ce que tu as dis. Est ce que tu peux développer?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mai 2011 à 12:38
ucfoutu, j'ai pas mis les guillemets, j'ai copier le retour de la console après un debug.print

C'est bien ce sur quoi j'appelais ton attention !
Tout ce qui, après le signe =, dans une formule, est normalement entre guillemets que je ne vois pas dans Result!


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011
21 mai 2011 à 12:42
Ha du genre l'écrire comme çà:
result = f & " * (" & L & "/" & D & ") * (" & V & "^ 2 / (2 * 9,81))"
    
    ActiveCell.offset(4, 6).Formula = "=" & result

Car au final sa ne marche pas .

Bon ma méthode pour programmer çà est bonne ou je m'y prend comme un manche? Est ce qu'il y a une autre méthode pour programmer çà?
0
Philippe734 Messages postés 308 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 juin 2015 1
21 mai 2011 à 12:46
Oui en effet, ta méthode est inapropriée. L'idéal, est de calculer un résultat via le code :
x=798
y=cellule Z
...
resultat=x+y+.. ' par exemple = 5

puis d'envoyer la valeur du résulat dans la cellule :
cellule A resultat ' 5
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 mai 2011 à 12:51
Je retire quant à moi, après lecture de l'aide en ligne, mes remarques en ce qui concerne les guillemets. Elles ne sont pas fondées.


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011
21 mai 2011 à 13:05
Philippe734, je comprend bien, cependant quand j'insert mes lignes avec mes étiquettes; les valeurs utilisées dans la formule ne sont pas encore insérée. Du coup le programme ne peut rien retourner, d'où insérer une chaîne de caractère en tant que formule.
Tu vois ce que je veux faire?
0
cs_yopcoo Messages postés 10 Date d'inscription mardi 11 septembre 2007 Statut Membre Dernière intervention 22 mai 2011
22 mai 2011 à 15:54
Bon au final, j'ai pas vraiment eu la réponse que je voulais mais après plusieurs essais j'ai ce que je voulais. La macro fonctionne. Je laisse mon code pour ceux que sa intéresse et voir ce que j'attendais. C'est vrai que c'est pas facile d'expliquer ce qu'on veut faire:
Sub insertion()
    For i = 0 To 5
        ActiveCell.EntireRow.Insert
    Next i
End Sub

Function haaland(ByVal epsilon As String, ByVal D As String, ByVal Re As String) As String

    haaland = "(1 / (-1,8 * LOG10((6,9 /" & Re & ") + (" & epsilon & " / (" & D & "* 3,7)) ^ 1,11))) ^ 2"
        
End Function
Function Reynolds(ByVal D As String, ByVal Q As String, ByVal Nu As String) As String

    S = "3,14 * " & D & "^ 2 / 4"
    Reynolds = Q & "* " & S & "* " & D & "/ " & Nu
    
End Function

Sub pertes_sing()
    Cells(3, 1).select
    Call insertion
    
    ActiveCell.offset(1, 0).Formulalocal = "Q"
    ActiveCell.offset(2, 0).Formulalocal = "D"
    ActiveCell.offset(3, 0).Formulalocal = "L"
    ActiveCell.offset(1, 2).Formulalocal = "Epsilon"
    ActiveCell.offset(3, 4).Formulalocal = "Dh"
    
    Dim Q As String
    Dim D As String
    Dim L As String
    Dim Nu As String
    Dim S As String
    Dim epsilon As String
    Dim V As String
    Dim Re As String
    Dim f As String
    Dim result As String
    
    
    Q = "(" & ActiveCell.offset(1, 1).address & "/ 3600)"
    D = "(" & ActiveCell.offset(2, 1).address & "/ 1000)"
    L = "(" & ActiveCell.offset(3, 1).address & "/ 1000)"
    epsilon = ActiveCell.offset(1, 3).address
    
    S = "3,14 * (" & D & ")^ 2 / 4"
    V = "((" & Q & ")*(" & S & "))"
    Nu = "1E-06"
    
    Re = Reynolds(D, Q, Nu)
    f = haaland(epsilon, D, Re)
    
    
    result = f & " * (" & L & "/" & D & ") * (" & V & "^ 2 / (2 * 9,81))"

    ActiveCell.offset(3, 5).Formulalocal = "=" & result

End Sub
0
Rejoignez-nous