Insertion d'une formule au format String

[Résolu]
Signaler
Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011
-
Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011
-
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

Messages postés
308
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
1
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.
Messages postés
308
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
1
Quelle est ta question ?
Peux tu donner le code du call insertion ?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
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
Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011

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

Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011

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))
Messages postés
308
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
1
remplace :
ActiveCell.FormulaR1C1 = result
par :
ActiveCell.Formula = result
Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011

Philippe734, j'ai toujour la même erreur, j'avais essayé aussi ActiveCell.FormulaLocal
Messages postés
308
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
1
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
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
Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011

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?
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
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
Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011

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 çà?
Messages postés
308
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
15 juin 2015
1
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
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
239
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
Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011

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?
Messages postés
10
Date d'inscription
mardi 11 septembre 2007
Statut
Membre
Dernière intervention
22 mai 2011

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