Convertir une macro en fonction

Bonjour à tous,

J'ai un fichier Excel composé de formules et de macros.

Ce fichier, j'ai besoin de l'implanter dans un site internet.

Manque de chance ce site internet ne prend pas en compte les macros.

Ma question est la suivante, est-il possible de convertir une macro en formule Excel ?

Après plusieurs recherche j'ai vu qu'il était possible de convertir une formule Excel en macro, mais je n'ai toujours pas trouvé la solution pour faire l'inverse, sachant que ma macro contient la fonction " while".

Auriez-vous une solution pour convertir cette macro en fonction Excel ?

Vous trouverez ma macro dans le dossier ci-joint.

Je vous remercie d'avance pour votre aide.

Cordialement,

Baltazard

Bonjour,

Tout d'abord, une réponse sur le principe ...

Ce qu'Excel appelle les fonctions personnalisées (UDF en anglais) ne sont, de fait que des macros converties en formule ...

Cela dit, toutes les macros ne sont pas convertissables ... cela dépend de certaines caractéristiques ...

Reste à analyser ta macro ... et sa spécificité pour déterminer si, pour toi, cette solution est viable ... ( ou pas ...)

Bonjour James 007,

Merci pour ta réponse,

La macro à analyser se trouve dans mon fichier joint.

La voici en copie :

Sub Calculer_L_CC2D()

Dim f3, d20 As Single

Dim i As Long

f3 = (Cells(3, 4) + Cells(3, 5)) / 2 + Cells(3, 3)

Range("F3").Value = f3

d20 = Range("D20").Value

If d20 >= -200 Then

While d20 < 25

f3 = f3 + 1

Range("F3").Value = f3

d20 = Range("D20").Value

Wend

End If

End Sub

Je ne sais toujours pas comment faire pour la convertir en formule. Auriez-vous une solution ?

Merci d'avance

une fonction prend des arguments et renvoi une valeur.

Quels sont les arguments variables de ta fonction ?

Je suppose que le renvoi est D20

Bonjour EngueEngue,

Je vais traduire ce que j'ai fait dans ma macro.

Ma macro fait le liens entre les cellules F3 et D20

En D20 j'ai un résultat obtenu par différents calculs.

Si le résultat obtenu en D20 est >= à 25

Alors en cellule F3 on fait l'opération suivante ((D3 + E3) / 2)+ C3

Si le résultat obtenu en D20 < à 25

Alors en cellule F3 on incrémente de 1 l'opération suivante ((D3 + E3) / 2)+ C3

jusqu'à temps que le résultat obtenu en D20 soit >= à 25

Est-ce que vous avez assez d'informations ?

En tous cas merci de vos pencher sur mon problème

Tu comprends l'esprit d'une fonction ?

Par exemple=>

la fonction toto prend deux arguments toto1 as range et toto2 as range

toto va prendre la valeur toto1.value + toto2.value

en écrivant =toto(A1;A2) dans ma feuille j'aurai la somme de A1 et A2...

Pourquoi veux tu passer ta macro en fonction ?

Ça y est je comprends ce que tu veux dire.

L'idée c'est de créer une fonction que l'on va retrouver sur une feuille Excel à l'aide de l’icône "fx ".

Pour cela j'ai besoin de changer la structure de ma macro.

L'inconvénient c'est que je n'ai pas encore assez de connaissance pour le faire ^^. Tu saurais le faire ?

J'ai besoin de passer cette macro en fonction pour faire fonctionner mon fichier sur un site internet.

Ce fichier Excel est lié à une pièce paramétrable en 3 dimensions.

Suivant les cotes que l'utilisateur va rentrer dans l'interface du site internet, il va agir sur le fichier Excel.

Mais le site internet n'est pas capable de déclencher la macro.

Il ne sera pas capable de lancer une fonction non plus, à moins que ce soit du php ou du java.

Pour le fun j'ai construit ta fonction qui ne donne pas le même résultat que le tien

Function fx(D1 As Range, D2 As Range, D3 As Range, D4 As Range, D8 As Range, D9 As Range)
Application.Calculation = xlCalculationManual
Dim calcul As Double
'R1 sera D1, D2
f3 = (D2.Value + D3.Value) / D1.Value
x = (D1.Value - D2.Value) / 2
y = (x * x + f3 * f3) ^ (0.5)
alpha = Application.WorksheetFunction.Degrees(Atn(x / f3))
beta = 90 - D4.Value - alpha
Z = D3.Value / Cos(Application.WorksheetFunction.Radians(beta))
a = (y - Z) / 2
gamma = (D4.Value + alpha) / 2
b = Sin(Application.WorksheetFunction.Radians(gamma)) * a
bX2 = b * 2
omega = 90 - (180 - 90 - gamma)
c = Cos(Application.WorksheetFunction.Radians(omega)) * D8.Value
omegabis = 90 - alpha - (180 - 90 - gamma)
cbis = Cos(Application.WorksheetFunction.Radians(omegabis)) * D9.Value
calcul = bX2 - c - cbis
If calcul >= -200 Then
    While calcul < 25
    f3 = f3 + 1
    x = (D1.Value - D2.Value) / 2
    y = (x * x + f3 * f3) ^ (0.5)
    alpha = Application.WorksheetFunction.Degrees(Atn(x / f3))
    beta = 90 - D4.Value - alpha
    Z = D3.Value / Cos(Application.WorksheetFunction.Radians(beta))
    a = (y - Z) / 2
    gamma = (D4.Value + alpha) / 2
    b = Sin(Application.WorksheetFunction.Radians(gamma)) * a
    bX2 = b * 2
    omega = 90 - (180 - 90 - gamma)
    c = Cos(Application.WorksheetFunction.Radians(omega)) * D8.Value
    omegabis = 90 - alpha - (180 - 90 - gamma)
    cbis = Cos(Application.WorksheetFunction.Radians(omegabis)) * D9.Value
    calcul = bX2 - c - cbis
    Wend
End If
fx = calcul
End Function

Je l'appelle depuis la feuille avec

=fx(C3;D3;E3;B3;G3;H3)

Et je trouve 25.09499 au lieu de 25.22...

C'est du java, ça devrait pouvoir fonctionner.

Merci pour le temps que t'as pris pour faire la macro !!

J'ai modifier une ligne pour avoir le bon résultat (voir la macro ci-dessous). C'est génial tu m'as permis d'avancer d'un bon pas !!!

Il reste une dernière petite chose pour que tout soit parfait.

Je voudrais savoir comment récupérer la nouvelle valeur en cellule F3.

Dans cette cellule on a 2 possibilités, soit on récupère la formule (D2.Value + D3.Value) / 2) + D1.Value

soit on récupère la formule ((D2.Value + D3.Value) / 2) + D1.Value) + incrémentation de 1

Function fx(D1 As Range, D2 As Range, D3 As Range, D4 As Range, D8 As Range, D9 As Range)

Application.Calculation = xlCalculationManual

Dim calcul As Double

'R1 sera D1, D2

f3 = ((D2.Value + D3.Value) / 2) + D1.Value

x = (D1.Value - D2.Value) / 2

y = (x * x + f3 * f3) ^ (0.5)

alpha = Application.WorksheetFunction.Degrees(Atn(x / f3))

beta = 90 - D4.Value - alpha

Z = D3.Value / Cos(Application.WorksheetFunction.Radians(beta))

a = (y - Z) / 2

gamma = (D4.Value + alpha) / 2

b = Sin(Application.WorksheetFunction.Radians(gamma)) * a

bX2 = b * 2

omega = 90 - (180 - 90 - gamma)

c = Cos(Application.WorksheetFunction.Radians(omega)) * D8.Value

omegabis = 90 - alpha - (180 - 90 - gamma)

cbis = Cos(Application.WorksheetFunction.Radians(omegabis)) * D9.Value

calcul = bX2 - c - cbis

If calcul >= -200 Then

While calcul < 25

f3 = f3 + 1

x = (D1.Value - D2.Value) / 2

y = (x * x + f3 * f3) ^ (0.5)

alpha = Application.WorksheetFunction.Degrees(Atn(x / f3))

beta = 90 - D4.Value - alpha

Z = D3.Value / Cos(Application.WorksheetFunction.Radians(beta))

a = (y - Z) / 2

gamma = (D4.Value + alpha) / 2

b = Sin(Application.WorksheetFunction.Radians(gamma)) * a

bX2 = b * 2

omega = 90 - (180 - 90 - gamma)

c = Cos(Application.WorksheetFunction.Radians(omega)) * D8.Value

omegabis = 90 - alpha - (180 - 90 - gamma)

cbis = Cos(Application.WorksheetFunction.Radians(omegabis)) * D9.Value

calcul = bX2 - c - cbis

Wend

End If

fx = calcul

End Function

Merci d'avance !!

Je n'ai pas réfléchi assez longtemps avant de poser ma question.

Pour récupérer f3, je dois simplement modifier une ligne : fx = calcul passe à fx = f3

Désolé

Rechercher des sujets similaires à "convertir macro fonction"