Pb de taille de fonction

Signaler
Messages postés
15
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009
-
Messages postés
15
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009
-
Bonjour,
Je suis un very débutant en programmation vb et utilisation d'access. Mais bon c pas ça qui m'empêche de comprendre la logique de tout ça.
j'ai entrepris de passer sous Access tout un calcul qui se faisait sous Excel (dans un but de centralisation).
Je suis tombé sur le problème d'une fonction qui n'existe pas sous access, la fonction valeur cible (GoalSeek), pour le calcul de deux valeurs qui sont le but de tout ce travail. Ce soucis a été surmonté grace à une fonction de dichotomie mis en place dans un module. Mais ça à nécessiter que je rassemble tous mes calcul dans une seule fonction dévellopé au maximum de sorte à ce qu'apparaisent les termes recherché.
C'est là ou se situe mon problème. J'ai vérifié que ma fonction dichotomie marchait pour une des deux valeurs à calculer (la plus simple bien sur). Mais pour l'autre fonction ça bug pacre qu'il dit que j'ai trop de paramètre dans ma fonction.
Voici la fonction qui marche :

Function Dichotomie_Ratio(a As Double, b As Double, Precision As Double, Al2O3, CaF2, LiF, MgF2, CJ_ALF3)
    Dim e As Integer
    Dim r0 As Double, r1 As Double
    If f_Ratio(b, Al2O3, CaF2, LiF, MgF2, CJ_ALF3) > f_Ratio(a, Al2O3, CaF2, LiF, MgF2, CJ_ALF3) Then
        e = 1
    Else
        e = -1
    End If
    r0 = a
    r1 = b
    While Abs(r1 - r0) > Precision
        If e * f_Ratio(((r0 + r1) / 2), Al2O3, CaF2, LiF, MgF2, CJ_ALF3) > 0 Then
            r1 = (r0 + r1) / 2
        Else
            r0 = (r0 + r1) / 2
        End If
    Wend
    Dichotomie_Ratio = r0
End Function

Function f_Ratio(x, Al2O3, CaF2, LiF, MgF2, CJ_ALF3)

    f_Ratio = (Excess(x, Al2O3, CaF2, LiF, MgF2) - CJ_ALF3)
End Function

Dans une procédure actualisation de graph sur click,  je mets les bons chemin de tous les paramètres de ma fonction Dichotomie_Ratio, et ça marche parfaitement.

Private Sub Commande9_Click()
Dim SQLCmd As New DAO.QueryDef

SQLCmd.SQL = "SELECT PROTOS_TAB_JOURS.DAT, Dichotomie_Ratio(1,1.2,0.001,CARACT_CUVE.cAl2O3,PROTOS_TAB_JOURS.CJ_CAF2,0,0,PROTOS_TAB_JOURS.CJ_ALF3) As Ratio"
SQLCmd.SQL = SQLCmd.SQL + " FROM PROTOS_TAB_JOURS, CARACT_CUVE"
SQLCmd.SQL = SQLCmd.SQL + " WHERE PROTOS_TAB_JOURS.DAT between #" & Format$(Me.date_deb, "yyyy-mm-dd") & "# AND #" & Format$(Me.date_fin, "yyyy-mm-dd") & "# AND ((PROTOS_TAB_JOURS.COD_CUV)=(""" & Me.CUVE & """))"
Graphique8.RowSource = SQLCmd.SQL
Me.Graphique8.Requery
   
End Sub

Par contre, lorsque j'essaie de faire la même avec une fonction bien plus longue, selon le même principe,  un message d'erreur me disant que la fonction est tro complexe apparait. Voici la fonction en question.

Function f_ACD(y, CJ_II, CJ_UI, CJ_TB, CJ_CAF2, Ratio, R_E, R_C, R_AN, cAl2O3, NB_CA, CA_LARG, CA_LONG, NB_AN, NB_BL_SHORT, NB_BL_LONG, LW, A_MID_LIF, AN_LARG, AN_LONG, BH, DIS_AN, WCC, DIS_AN_SI, IN_DIST_SHORT, IN_DIST_LONG, BL_LARG, BL_LONG, AeOR, GMA)

f_ACD = (CJ_II * ((R_E + R_C + R_AN) / 1000) + (E_Equilibrium(Ratio, cAl2O3, CJ_CAF2, 0, 0, CJ_TB)) + (N_CC(Ratio, CJ_II / NB_CA / CA_LARG / CA_LONG / 10, CJ_TB)) _
        + N_SAThonstad(cAl2O3, 1000 * (CJ_II / NB_AN) / HauppinEffectiveAreaB(y, AN_LARG * 100, AN_LONG * 100, BH, DIS_AN, WCC, _
        DIS_AN_SI, LW, A_MID_LIF, NB_AN, NB_BL_SHORT, NB_BL_LONG, IN_DIST_SHORT, IN_DIST_LONG, BL_LARG * 0.1, _
        BL_LONG * 0.1), CJ_TB) + (N_CA((NB_AN * NB_BL_SHORT * NB_BL_LONG * BL_LARG * BL_LONG * A_MID_LIF / 10000) / NB_AN, _
        cAl2O3, NB_AN * NB_BL_SHORT * NB_BL_LONG * _
        BL_LARG * BL_LONG * A_MID_LIF / 10000, CJ_TB)) + (x * (1000 * (CJ_II / NB_AN) / (HauppinEffectiveAreaB(y, AN_LARG * 100, AN_LONG * 100, _
        BH, DIS_AN, WCC, DIS_AN_SI, LW, A_MID_LIF, NB_AN, NB_BL_SHORT, NB_BL_LONG, IN_DIST_SHORT, IN_DIST_LONG, BL_LARG * (0.1), _
        BL_LONG * (0.1)))) / SigmaBathWangBWR(Excess(Ratio, cAl2O3, CJ_CAF2, 0, 0), cAl2O3, CJ_CAF2, 0, 0, CJ_TB)) + BubbleVoltage(1000 * (CJ_II / NB_AN) / (HauppinEffectiveAreaB(y, _
        AN_LARG * 100, AN_LONG * 100, BH, DIS_AN, WCC, DIS_AN_SI, LW, A_MID_LIF, NB_AN, NB_BL_SHORT, NB_BL_LONG, IN_DIST_SHORT, _
        IN_DIST_LONG, BL_LARG * 0.1, BL_LONG * 0.1)), 1 - (1 - CoveringFactor(Ratio, cAl2O3, AeOR, 1000 * (CJ_II / NB_AN) / (HauppinEffectiveAreaB(y, _
        AN_LARG * 100, AN_LONG * 100, BH, DIS_AN, WCC, DIS_AN_SI, LW, A_MID_LIF, NB_AN, NB_BL_SHORT, NB_BL_LONG, IN_DIST_SHORT, IN_DIST_LONG, BL_LARG * 0.1, _
        BL_LONG * 0.1)), GMA)), D_B(1000 * (CJ_II / NB_AN) / (HauppinEffectiveAreaB(y, AN_LARG * 100, AN_LONG * 100, BH, DIS_AN, WCC, DIS_AN_SI, LW, A_MID_LIF, _
        NB_AN, NB_BL_SHORT, NB_BL_LONG, IN_DIST_SHORT, IN_DIST_LONG, BL_LARG * 0.1, BL_LONG * 0.1))), SigmaBathWangBWR(Excess(Ratio, cAl2O3, CJ_CAF2, 0, 0), cAl2O3, CJ_CAF2, 0, 0, CJ_TB)) - CJ_UI)

End Function

J'avoue elle est bien complexe mais c le seul moyen que j'ai trouvé pour faire apparaitre mes termes sur lequel la dichotomie est pratiqué.
J'ai essayé de réduire la taille de la fonction en créant une requete où je calcule les termes qui ne font pas intervenir la valeur recherché. Et ça ne me met plus le message d'erreur mais le résultat est faux, il me remet la borne inférieur de ma dichotomie. Je suis perdu, si vous avez une idée pour éclaircir ma lanterne je suis preneur.
Voilà j'ai essayé de détailler au max, mais si il reste des zones d'ombre n'hésitez pas.

Merci d'avance.

4 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
Salut
Sais-tu que, même en étant à l'extérieur de Excel, tu peux quand même profiter de ses avantages :
Supposons que tu crées une feuille virtuelle dans laquelle tu places tes données :
    Dim oOo As Excel.Application
    Dim sSs As Excel.Worksheet
   
    Set oOo = New Excel.Application
    Set sSs = oOo.Worksheets(1)
    ' Ici, tu insères tes données vers la zone A1:B1 (au pif) utilisée après
    sSs.Range("A1:B1").GoalSeek Goal:=8, ChangingCell:=sSs.Range("F1:G1")
    ' Ici, tu récupères les valeurs trouvées dans F1:G1 (au pif)
    Set sSs = Nothing
    Set oOo = Nothing

Ca te permettrait de t'éviter ton affreuse fonction

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
15
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009

Je crois que ça va me plaire tout ça jack, je l'essaie et je t'en dis plus. Le truc c que j'étais parti dans la mauvais direction, le principe d'automation m'a un peu échappé dans le sens où g essayé de faire fonctionner gaolseek directement sur mes résultats généré sous access aprés avoir ajouté le controle d'excel, j'étais trés loin du compte en fait. Merci déjà en tout cas.

Une petite question, si je n'envie que mes résultats, excel n'aura pas le calcul ou j'utilise toutes ces fonctions, donc comment va t'il faire un goalseek efficace, vu qu'il ne "voie" pas la fonction dévellopé...
Messages postés
15
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009

En y regardant bien je comprend pas tout. Qu'est ce que j'envoie précisément?  Plutot un ensemble composé d'une colonne contenant ma valeur modifiant ma valeur cible et une colonne avec la formule de ma valeur à cibler. Comme ça il aura tous les éléments pour faire un goalseek correct. Parce que concretement, si je ne lui envoie que des données il ne pourra rien en faire.
Admettons que l'envoie de formules est possible, ma question est, comment faire pour qu'excel aille chercher les valeurs des variables de ma formules dans une table access ou sont stockées des données en dures tout ça dans le code vba d'access? c plutot une question de syntaxe de code.
Messages postés
15
Date d'inscription
lundi 4 mai 2009
Statut
Membre
Dernière intervention
19 juin 2009

Et dernière question comment je renvoie les résultats obtenu sur ma feuille excel comme source d'un graphique dans un formulaire access??