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

fuonction vba d'arguments nommes

5 réponses
Avatar
irrz
Bonjour,

Soit une fonction VBA comme celle-ci

Function VolumeCylindre(Dia, Haut)
Application.Volatile
VolumeCylindre =3D Application.Pi() * Dia ^ 2 / 4 * Haut
End Function


Une telle fonction ne marche pas si les param=E8tres Dia et Haut sont
des champs segments de lignes ou colonnes nommes (par exemple
Diametre=3DA1:A100 Hauteur=3DB1:B100 et que en colonne C de 1 =E0 100 on
ecrit
=3DVolumeCylindre(Diametre, Hauteur)

Pour que cela marche je fais l'analyse des variables (valeur numerique
constante, cellule unique, colonne ou ligne) =E0 travers par exemple de
la fonction suivante

Function VdeX(xXx)
'Application.Volatile
VdeX =3D xXx ' au cas ou xXx est une constante
If TypeOf xXx Is Range Then
With Application.Caller
If xXx.Cells.Count =3D 1 Then 'cellule
unique
VdeX =3D xXx
' vdex =3D xXx(.Row - xXx.Row + 1)
ElseIf xXx.Columns.Count =3D 1 Then 'colonne
VdeX =3D xXx(.Row - xXx.Row + 1)
ElseIf xXx.Rows.Count =3D 1 Then 'ligne
VdeX =3D xXx(.Column - xXx.Column + 1)
Else
VdeX =3D ""
End If
End With
End If
End Function

et je dois modifier la fonction cylindre de la maniere suivante

Function VolumeCylindre(Dia, Haut)
Application.Volatile
Dia =3D VdeX(Dia)
Haut =3D VdeX(Haut)
VolumeCylindre =3D Application.Pi() * Dia ^ 2 / 4 * Haut
End Function

QUESTION
y a t il une m=E9thode plus COURTE pour ecrire une fonction avec passage
des arguments nommes

5 réponses

Avatar
MichDenis
Bonjour Irrz,

Ta fonction personnalisée doit être obligatoirement dans un module standard

Essaie ceci :
'---------------------------
Function VolumeCylindre(Dia As Range, Haut As Range)
VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
End Function
'---------------------------

et dans ta cellule C1 : = VolumeCylindre(A1;B1) que tu recopies sur la colonne



"irrz" a écrit dans le message de groupe de discussion :

Bonjour,

Soit une fonction VBA comme celle-ci

Function VolumeCylindre(Dia, Haut)
Application.Volatile
VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
End Function


Une telle fonction ne marche pas si les paramètres Dia et Haut sont
des champs segments de lignes ou colonnes nommes (par exemple
Diametre¡:A100 Hauteur±:B100 et que en colonne C de 1 à 100 on
ecrit
=VolumeCylindre(Diametre, Hauteur)

Pour que cela marche je fais l'analyse des variables (valeur numerique
constante, cellule unique, colonne ou ligne) à travers par exemple de
la fonction suivante

Function VdeX(xXx)
'Application.Volatile
VdeX = xXx ' au cas ou xXx est une constante
If TypeOf xXx Is Range Then
With Application.Caller
If xXx.Cells.Count = 1 Then 'cellule
unique
VdeX = xXx
' vdex = xXx(.Row - xXx.Row + 1)
ElseIf xXx.Columns.Count = 1 Then 'colonne
VdeX = xXx(.Row - xXx.Row + 1)
ElseIf xXx.Rows.Count = 1 Then 'ligne
VdeX = xXx(.Column - xXx.Column + 1)
Else
VdeX = ""
End If
End With
End If
End Function

et je dois modifier la fonction cylindre de la maniere suivante

Function VolumeCylindre(Dia, Haut)
Application.Volatile
Dia = VdeX(Dia)
Haut = VdeX(Haut)
VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
End Function

QUESTION
y a t il une méthode plus COURTE pour ecrire une fonction avec passage
des arguments nommes
Avatar
irrz
merci michdenis
question :
qu'appelles tu module standard?

justement ce que je veux éviter c'est écrire des fonctions avec des
parametres
bataille navale volume(C14,D28) (coulé !!!!)
ou
ligne/colonne volume(L14C3,L28C4) (pas pluslisible !!!!)

alors que volume(Diametre,Hauteur) : c'est lisible

j'y arrive très bien mais c'est long

autre remarque
j'évite sciemment la declaration de variables, donc chez moi c'est
variant) car les arguments peuvent etre
range (B12,C12) ou LC23,LC28 ou Diam, Haut)
ou cellule unique
ou valeur (14,18)

en macros excel4 ces appelles d'arguments étaient automatiques : quand
la fonction appelait un argument nommé, elle appelait la valeur sur la
bonne ligne ou colonne, quand il s'agissait d'un argument nommé

je me demande s'il n'y a pas une option vba quelconque pour faire ceci
si tu vois une possibilité, i am preneur


*************************************************************
On 5 juil, 12:49, "MichDenis" wrote:
Bonjour Irrz,

Ta fonction personnalisée doit être obligatoirement dans un module st andard

Essaie ceci :
'---------------------------
Function VolumeCylindre(Dia As Range, Haut As Range)
VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
End Function
'---------------------------

et dans ta cellule C1 :   =
= VolumeCylindre(A1;B1) que tu recopies sur la colonne

"irrz" a écrit dans le message de groupe de discussion :

Bonjour,

Soit une fonction VBA comme celle-ci

Function VolumeCylindre(Dia, Haut)
    Application.Volatile
    VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
End Function

Une telle fonction ne marche pas si les paramètres Dia et Haut sont
des champs segments de lignes ou colonnes nommes (par exemple
Diametre¡:A100 Hauteur±:B100 et que en colonne C de 1 à 100 on
ecrit
=VolumeCylindre(Diametre, Hauteur)

Pour que cela marche je fais l'analyse des variables (valeur numerique
constante, cellule unique, colonne ou ligne) à travers par exemple de
la fonction suivante

Function VdeX(xXx)
'Application.Volatile
    VdeX = xXx                  ' au cas ou xXx e st une constante
    If TypeOf xXx Is Range Then
       With Application.Caller
          If xXx.Cells.Count = 1 Then                         'cellule
unique
             VdeX = xXx
'             vdex = xXx(.Row - xXx.Row + 1)
          ElseIf xXx.Columns.Count = 1 Then                   'colonne
             VdeX = xXx(.Row - xXx.Row + 1)
          ElseIf xXx.Rows.Count = 1 Then                      'ligne
             VdeX = xXx(.Column - xXx.Column + 1)
          Else
             VdeX = ""
          End If
       End With
    End If
End Function

et je dois modifier la fonction cylindre de la maniere suivante

Function VolumeCylindre(Dia, Haut)
    Application.Volatile
    Dia = VdeX(Dia)
    Haut = VdeX(Haut)
    VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
 End Function

QUESTION
y a t il une méthode plus COURTE pour ecrire une fonction avec passage
des arguments nommes


Avatar
irrz
je modifie juste le titre
-----------------------------------
On 5 juil, 13:40, irrz wrote:
merci michdenis
question :
qu'appelles tu module standard?

justement ce que je veux éviter c'est écrire des fonctions avec des
parametres
  bataille navale  volume(C14,D28)   (coulé !!!!)
    ou
  ligne/colonne   volume(L14C3,L28C4)   (pas pluslisible !!!!)

alors que           volume(Diametre,Hauteur)   : c'est lisibl e

j'y arrive très bien mais c'est long

autre remarque
j'évite sciemment la declaration de variables, donc chez moi c'est
variant) car les arguments peuvent etre
  range (B12,C12) ou LC23,LC28 ou Diam, Haut)
  ou cellule unique
  ou valeur  (14,18)

en macros excel4 ces appelles d'arguments étaient automatiques : quand
la fonction appelait un argument nommé, elle appelait la valeur sur la
bonne ligne ou colonne, quand il s'agissait d'un argument nommé

je me demande s'il n'y a pas une option vba quelconque pour faire ceci
si tu vois une possibilité, i am preneur

*************************************************************
On 5 juil, 12:49, "MichDenis" wrote:

> Bonjour Irrz,

> Ta fonction personnalisée doit être obligatoirement dans un module standard

> Essaie ceci :
> '---------------------------
> Function VolumeCylindre(Dia As Range, Haut As Range)
> VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
> End Function
> '---------------------------

> et dans ta cellule C1 :   =
> = VolumeCylindre(A1;B1) que tu recopies sur la colonne

> "irrz" a écrit dans le message de groupe de discussion :
>
> Bonjour,

> Soit une fonction VBA comme celle-ci

> Function VolumeCylindre(Dia, Haut)
>     Application.Volatile
>     VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
> End Function

> Une telle fonction ne marche pas si les paramètres Dia et Haut sont
> des champs segments de lignes ou colonnes nommes (par exemple
> Diametre¡:A100 Hauteur±:B100 et que en colonne C de 1 à 100 o n
> ecrit
> =VolumeCylindre(Diametre, Hauteur)

> Pour que cela marche je fais l'analyse des variables (valeur numerique
> constante, cellule unique, colonne ou ligne) à travers par exemple de
> la fonction suivante

> Function VdeX(xXx)
> 'Application.Volatile
>     VdeX = xXx                  ' au cas ou xXx est une constante
>     If TypeOf xXx Is Range Then
>        With Application.Caller
>           If xXx.Cells.Count = 1 Then                         'cellule
> unique
>              VdeX = xXx
> '             vdex = xXx(.Row - xXx.Row + 1)
>           ElseIf xXx.Columns.Count = 1 Then                   'colonne
>              VdeX = xXx(.Row - xXx.Row + 1)
>           ElseIf xXx.Rows.Count = 1 Then                      'ligne
>              VdeX = xXx(.Column - xXx.Column + 1)
>           Else
>              VdeX = ""
>           End If
>        End With
>     End If
> End Function

> et je dois modifier la fonction cylindre de la maniere suivante

> Function VolumeCylindre(Dia, Haut)
>     Application.Volatile
>     Dia = VdeX(Dia)
>     Haut = VdeX(Haut)
>     VolumeCylindre = Application.Pi() * Dia ^ 2 / 4 * Haut
>  End Function

> QUESTION
> y a t il une méthode plus COURTE pour ecrire une fonction avec passag e
> des arguments nommes


Avatar
MichDenis
Désolé, je n'avais pas pu la seconde partie de ta question,
car je lis les "messages" dans une fenêtre restreinte !

A ) le fait de ne pas définir tes paramètres, t'oblige à ajoujer
la ligne de code "application.Volatile" pour mettre à jour
tes formules.

B ) L'aide d'excel explique bien ce qu'est une fonction volatile
et ce pourquoi le traitement devient "long" si le nombre de
formules est important dans la feuille :

Aide d'excel
Une fonction volatile doit être recalculée chaque fois qu'un calcul est effectué dans une
cellule quelconque de la feuille de calcul. Une fonction non volatile n'est recalculée
qu'en cas de changement des variables d'entrée. Cette méthode est sans effet si elle ne se
trouve pas à l'intérieur d'une fonction définie par l'utilisateur utilisée pour calculer
une cellule de feuille de calcul.

C ) Il est peut-être possible d'écrire une fonction avec 2 lignes
de code en moins, mais cela ne modifiera pas l'aspect principal
de la fonction "Volatile"
Avatar
irrz
et quoi a propos des arguments nommés?


On 5 juil, 14:26, "MichDenis" wrote:
Désolé, je n'avais pas pu la seconde partie de ta question,
car je lis les "messages" dans une fenêtre restreinte !

A ) le fait de ne pas définir tes paramètres, t'oblige à ajoujer
    la ligne de code "application.Volatile" pour mettre à jour
   tes formules.

B ) L'aide d'excel explique bien ce qu'est une fonction volatile
     et ce pourquoi le traitement devient "long" si le nombre de
    formules est important dans la feuille :

Aide d'excel
Une fonction volatile doit être recalculée chaque fois qu'un calcul e st effectué dans une
cellule quelconque de la feuille de calcul. Une fonction non volatile n'e st recalculée
qu'en cas de changement des variables d'entrée. Cette méthode est san s effet si elle ne se
trouve pas à l'intérieur d'une fonction définie par l'utilisateur u tilisée pour calculer
une cellule de feuille de calcul.

C ) Il est peut-être possible d'écrire une fonction avec 2 lignes
    de code en moins, mais cela ne modifiera pas l'aspect principal
    de la fonction "Volatile"