Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Aide pour une fonction

8 réponses
Avatar
Phenix21
Bonjour =E0 tous !

Je souhaiterais vous soumettre la fonction que j'ai r=E9alis=E9. Mon
objectif : =E9crire une fonction du type "=3DSOMME(...)" qui r=E9alise une
it=E9ration pour me sortir le r=E9sultat maximal.

Voil=E0 ce que j'ai r=E9alis=E9 :

[quote]Public Function InsTech77(Sbv, C, Qfuite)

Dim i As Integer
Dim Seff As Single
Dim t As Single
Dim H As Single
Dim a1 As Single
Dim b1 As Single
Dim a2 As Single
Dim b2 As Single
Dim Ccorrection As Single
Dim Vbas As Single
Dim Vbas_fin As Single


'R=E9cup=E9ration des valeurs des coefficients de Montana et du
coefficient multiplicateur
a1 =3D ActiveSheet.Cells(4, 5)
a2 =3D ActiveSheet.Cells(6, 5)
b1 =3D ActiveSheet.Cells(5, 5)
b2 =3D ActiveSheet.Cells(7, 5)
Ccorrection =3D ActiveSheet.Cells(9, 5)

'Calcul de la surface active de ruissellement
Seff =3D Sbv * C

'Mise =E0 0 des variables
Vbas =3D 0
Vbas_fin =3D 0

'It=E9ration du calcul du volume n=E9cessaire
For i =3D 1 To 24

'Utilisation des 2 pluies, et distinction
If i <=3D 5 Then
Vbas =3D Qfuite * 60 * i * 5 - Seff * a1 * (5 * i) ^ (1 - b1) /
1000
Else
Vbas =3D Qfuite * 60 * i * 5 - Seff * a2 * (5 * i) ^ (1 - b2) /
1000
End If

'S=E9lection du volume de bassin le plus important
If Vbas > Vbas_fin Then
Vbas_fin =3D Vbas
End If

Next

IT77 =3D Vbas_fin * Ccorrection


End Function
[/quote]

Elle a =E9t=E9 ins=E9r=E9e dans 'ThisWorkbook", mais lorsque je tape sous
Excel "=3DInsTech77(...)", Excel me renvoie #NOM. Je pense avoir mal
d=E9fini ma fonction.

Merci d'avance pour vos propositions et votre aide !

8 réponses

Avatar
MichDenis
Pour pouvoir utiliser une fonction personnalisée dans une feuille de calcul,
tu dois la mettre OBLIGATOIREMENT dans un module standard.



"Phenix21" a écrit dans le message de news:

Bonjour à tous !

Je souhaiterais vous soumettre la fonction que j'ai réalisé. Mon
objectif : écrire une fonction du type "=SOMME(...)" qui réalise une
itération pour me sortir le résultat maximal.

Voilà ce que j'ai réalisé :

[quote]Public Function InsTech77(Sbv, C, Qfuite)

Dim i As Integer
Dim Seff As Single
Dim t As Single
Dim H As Single
Dim a1 As Single
Dim b1 As Single
Dim a2 As Single
Dim b2 As Single
Dim Ccorrection As Single
Dim Vbas As Single
Dim Vbas_fin As Single


'Récupération des valeurs des coefficients de Montana et du
coefficient multiplicateur
a1 = ActiveSheet.Cells(4, 5)
a2 = ActiveSheet.Cells(6, 5)
b1 = ActiveSheet.Cells(5, 5)
b2 = ActiveSheet.Cells(7, 5)
Ccorrection = ActiveSheet.Cells(9, 5)

'Calcul de la surface active de ruissellement
Seff = Sbv * C

'Mise à 0 des variables
Vbas = 0
Vbas_fin = 0

'Itération du calcul du volume nécessaire
For i = 1 To 24

'Utilisation des 2 pluies, et distinction
If i <= 5 Then
Vbas = Qfuite * 60 * i * 5 - Seff * a1 * (5 * i) ^ (1 - b1) /
1000
Else
Vbas = Qfuite * 60 * i * 5 - Seff * a2 * (5 * i) ^ (1 - b2) /
1000
End If

'Sélection du volume de bassin le plus important
If Vbas > Vbas_fin Then
Vbas_fin = Vbas
End If

Next

IT77 = Vbas_fin * Ccorrection


End Function
[/quote]

Elle a été insérée dans 'ThisWorkbook", mais lorsque je tape sous
Excel "=InsTech77(...)", Excel me renvoie #NOM. Je pense avoir mal
défini ma fonction.

Merci d'avance pour vos propositions et votre aide !
Avatar
Phenix21
C'est-à-dire dans un module standart ?
Avatar
Phenix21
On 2 juin, 14:44, Phenix21 wrote:
C'est-à-dire dans un module standart ?


J'ai écrit trop vite j'ai trouvé ^^

Par contre je crois que j'ai un souci dans ma fonction, çà ne me
renvoie pas la bonne valeur ! Et je continue ;)

Merci pour la réponse !

Avatar
Phenix21
Le retour !

Alors effectivement, la fonction se lance bien. Par contre, Excel me
renvoie un "#VALEUR" : quelle pourrait en être la cause ?
Avatar
MichDenis
Observation générale :

Il est préférable d'utiliser un nom de variable qui soit significatif
par rapport à son usage... il serait sage d'éviter l'usage d'une
adresse de cellule comme variable.

Pourquoi ne pas donner aux paramètres de ta fonction, des noms
qui signifie quelque chose, tu as droit à des noms de 255 caractères...

Si tu donnes à une variable un type "numérique" (integer, long, double...)
la variable a automatiquement la valeur 0. Nul besoin de l'initialer à 0

Si ta fonction renvoie "#VALEUR" , tu dois avoir une valeur "Texte"
dans une des cellules utilisées pour évaluer la fonction.



"Phenix21" a écrit dans le message de news:

Le retour !

Alors effectivement, la fonction se lance bien. Par contre, Excel me
renvoie un "#VALEUR" : quelle pourrait en être la cause ?
Avatar
Hervé
Bonjour Phenix21,

Dans une fonction, pour que celle-ci soit utilisée sans retourner de
résultat erroné, il ne faut pas utiliser de référence à une quelconque
cellule ou plage de cellules, elles doivent être passées en argument. Si tu
fait référence à une cellule et que, pour la mise en page de feuille, tu
veuille déplacer cette cellule la fonction ne la suivra pas et fera toujours
référence à la cellule indiquée en dur d'où des résultats erronés.
Comme te l'a si bien précisé MichDenis, utilise des noms de variables qui
soient parlant, ça facilite l'entretien du code.
J'ai testé la fonction ci-dessous avec des valeurs bidons et elle me
retourne un résultat (bidon lui aussi ;o) ).
Si tu as un message d'erreur, c'est dû à la présence de cette ligne de code
:
IT77 = Vbas_fin * Ccorrection
qui doit être le retour du résultat mais mal orthographié. Pour éviter ce
type d'erreur, en tête de module indique la ligne "Option Explicit" comme
dans l'exemple ci-dessous. Ceci oblige à déclarer les variables et évite pas
mal de désagréments.

A mettre dans un module standard :

Option Explicit

Public Function INS_TECH_77(Sbv As Double, _
C As Double, _
Qfuite As Double, _
a1 As Double, _
a2 As Double, _
b1 As Double, _
b2 As Double, _
Ccorrection As Double) As Double

Dim i As Integer
Dim Seff As Single
Dim t As Single
Dim H As Single
Dim Vbas As Single
Dim Vbas_fin As Single

'pour que la fonction soit recalculée
'à chaque calcul du classeur
Application.Volatile

'Calcul de la surface active de ruissellement
Seff = Sbv * C

'Itération du calcul du volume nécessaire
For i = 1 To 24

'Utilisation des 2 pluies, et distinction
If i <= 5 Then
Vbas = Qfuite * 60 * i * 5 - Seff * a1 * (5 * i) ^ (1 - b1) / 1000
Else
Vbas = Qfuite * 60 * i * 5 - Seff * a2 * (5 * i) ^ (1 - b2) / 1000
End If

'Sélection du volume de bassin le plus important
If Vbas > Vbas_fin Then
Vbas_fin = Vbas
End If

Next

'retourne le résultat
INS_TECH_77 = Vbas_fin * Ccorrection

End Function


Hervé.

"Phenix21" a écrit dans le message de news:

Bonjour à tous !

Je souhaiterais vous soumettre la fonction que j'ai réalisé. Mon
objectif : écrire une fonction du type "=SOMME(...)" qui réalise une
itération pour me sortir le résultat maximal.

Voilà ce que j'ai réalisé :

[quote]Public Function InsTech77(Sbv, C, Qfuite)

Dim i As Integer
Dim Seff As Single
Dim t As Single
Dim H As Single
Dim a1 As Single
Dim b1 As Single
Dim a2 As Single
Dim b2 As Single
Dim Ccorrection As Single
Dim Vbas As Single
Dim Vbas_fin As Single


'Récupération des valeurs des coefficients de Montana et du
coefficient multiplicateur
a1 = ActiveSheet.Cells(4, 5)
a2 = ActiveSheet.Cells(6, 5)
b1 = ActiveSheet.Cells(5, 5)
b2 = ActiveSheet.Cells(7, 5)
Ccorrection = ActiveSheet.Cells(9, 5)

'Calcul de la surface active de ruissellement
Seff = Sbv * C

'Mise à 0 des variables
Vbas = 0
Vbas_fin = 0

'Itération du calcul du volume nécessaire
For i = 1 To 24

'Utilisation des 2 pluies, et distinction
If i <= 5 Then
Vbas = Qfuite * 60 * i * 5 - Seff * a1 * (5 * i) ^ (1 - b1) /
1000
Else
Vbas = Qfuite * 60 * i * 5 - Seff * a2 * (5 * i) ^ (1 - b2) /
1000
End If

'Sélection du volume de bassin le plus important
If Vbas > Vbas_fin Then
Vbas_fin = Vbas
End If

Next

IT77 = Vbas_fin * Ccorrection


End Function
[/quote]

Elle a été insérée dans 'ThisWorkbook", mais lorsque je tape sous
Excel "=InsTech77(...)", Excel me renvoie #NOM. Je pense avoir mal
défini ma fonction.

Merci d'avance pour vos propositions et votre aide !
Avatar
Phenix21
Merci pour votre aide !

En réponse à vos questions :
- pour les noms des variables, C, a, b correspondent aux noms
couramment utilisés pour les données qui me concernent. Si çà vous
intéresse, un aperçu des bases de mon calcul ;) http://www.dlzlogic.com /aides/Montana.htm
- la fonction créée a pour objectif de se répéter plusieurs fois, l es
paramètres a,b,Ccorrection étant identiques à chaque itération, seu ls
les paramètres S,C,Qfuite variant. Il n'y a pas moyen d'éviter de les
indiquer à chaque fois ? Sachant qu'à la fin, je comptais bloquer la
partie supérieure de la feuille pour éviter tout déplacement
intenpestif.

Au passage, que signifie "double" ?
Avatar
fetnat
Merci pour la découverte du coefficient de Montana.

On comprend mieux pourquoi la France est inondée. Vivement que VBA soit
au point...:)


climatiquement vôtre

fetnat

Bonjour à tous !

Je souhaiterais vous soumettre la fonction que j'ai réalisé. Mon
objectif : écrire une fonction du type "=SOMME(...)" qui réalise une
itération pour me sortir le résultat maximal.

Voilà ce que j'ai réalisé :

[quote]Public Function InsTech77(Sbv, C, Qfuite)

Dim i As Integer
Dim Seff As Single
Dim t As Single
Dim H As Single
Dim a1 As Single
Dim b1 As Single
Dim a2 As Single
Dim b2 As Single
Dim Ccorrection As Single
Dim Vbas As Single
Dim Vbas_fin As Single


'Récupération des valeurs des coefficients de Montana et du
coefficient multiplicateur
a1 = ActiveSheet.Cells(4, 5)
a2 = ActiveSheet.Cells(6, 5)
b1 = ActiveSheet.Cells(5, 5)
b2 = ActiveSheet.Cells(7, 5)
Ccorrection = ActiveSheet.Cells(9, 5)

'Calcul de la surface active de ruissellement
Seff = Sbv * C

'Mise à 0 des variables
Vbas = 0
Vbas_fin = 0

'Itération du calcul du volume nécessaire
For i = 1 To 24

'Utilisation des 2 pluies, et distinction
If i <= 5 Then
Vbas = Qfuite * 60 * i * 5 - Seff * a1 * (5 * i) ^ (1 - b1) /
1000
Else
Vbas = Qfuite * 60 * i * 5 - Seff * a2 * (5 * i) ^ (1 - b2) /
1000
End If

'Sélection du volume de bassin le plus important
If Vbas > Vbas_fin Then
Vbas_fin = Vbas
End If

Next

IT77 = Vbas_fin * Ccorrection


End Function
[/quote]

Elle a été insérée dans 'ThisWorkbook", mais lorsque je tape sous
Excel "=InsTech77(...)", Excel me renvoie #NOM. Je pense avoir mal
défini ma fonction.

Merci d'avance pour vos propositions et votre aide !