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

VBA : créer fonction qui renvoie plage de valeurs

6 réponses
Avatar
Luc Voeltzel
Bonjour à tous,

Voilà une question d'ordre général :
Il est possible en VBA de créer des fonctions personnalisées qui renvoient
une seule valeur

par ex :
Function inf(arg1#, arg2#) As Boolean
inf = False
If arg1 < arg2 Then inf = True
End Function

, mais est-il possible de créer des fonctions personnalisées qui renvoient
une plage de valeurs en sortie ?

Merci pour vos réponses

6 réponses

Avatar
MichDenis
Exemple simple : Suppose que tu as 2 mots dans une cellule que tu veux répartir dans 2 cellules et
que ces 2 mots sont séparés par un espace..

Ta fonction personnalisée dans un module standard :
Split requiert Excel 2000 ou plus récent.
'------------------------
Function LeSplit(Rg As Range)
s = Split(Rg, " ")
LeSplit = s
End Function
'-------------------------

Dans ta feuille de calcul, tu sélectionnes par exemple B1:B2
tu entres ta fonction en B1 : = LeSplit(A1) et tu valides par Maj + Ctrl + Enter



"Luc Voeltzel" a écrit dans le message de news:
%
Bonjour à tous,

Voilà une question d'ordre général :
Il est possible en VBA de créer des fonctions personnalisées qui renvoient
une seule valeur

par ex :
Function inf(arg1#, arg2#) As Boolean
inf = False
If arg1 < arg2 Then inf = True
End Function

, mais est-il possible de créer des fonctions personnalisées qui renvoient
une plage de valeurs en sortie ?

Merci pour vos réponses
Avatar
JB
Bonjour,

Exemple de fonction qui retourne une liste des valeurs:

Function SansDoublonsTrié(champ As Range)
Set MonDico = CreateObject("Scripting.Dictionary")
temp = champ
For i = 1 To UBound(temp, 1)
If Not MonDico.Exists(temp(i, 1)) Then MonDico.Add temp(i, 1),
temp(i, 1)
Next i
a = MonDico.items
j = UBound(a)
Call tri(a, 0, j)
SansDoublonsTrié = Application.Transpose(a)
End Function

Sub tri(a, gauc, droi) ' Quick sort
ref = a((gauc + droi) 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub

Dans le tableur, pour obtenir une liste triée de A2:A11:
-Sélectionner C2:C11
=sansdoublonstrié(A2:A11)
-valider avec maj+Ctrl+Entrée

http://boisgontierj.free.fr/pages_site/fonctionsansdoublonstrie.htm
http://boisgontierj.free.fr/pages_site/FonctionDifferenceDiscontinu.htm

Cordialement JB


Bonjour à tous,

Voilà une question d'ordre général :
Il est possible en VBA de créer des fonctions personnalisées qui renv oient
une seule valeur

par ex :
Function inf(arg1#, arg2#) As Boolean
inf = False
If arg1 < arg2 Then inf = True
End Function

, mais est-il possible de créer des fonctions personnalisées qui renv oient
une plage de valeurs en sortie ?

Merci pour vos réponses


Avatar
MichDenis
La plage sélectionnée devrait être B1:C1 par que le tableau "S" de la fonction
est un tableau à une dimension... en conséquence le résultat s'affiche en ligne...


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

Exemple simple : Suppose que tu as 2 mots dans une cellule que tu veux répartir dans 2 cellules et
que ces 2 mots sont séparés par un espace..

Ta fonction personnalisée dans un module standard :
Split requiert Excel 2000 ou plus récent.
'------------------------
Function LeSplit(Rg As Range)
s = Split(Rg, " ")
LeSplit = s
End Function
'-------------------------

Dans ta feuille de calcul, tu sélectionnes par exemple B1:B2
tu entres ta fonction en B1 : = LeSplit(A1) et tu valides par Maj + Ctrl + Enter



"Luc Voeltzel" a écrit dans le message de news:
%
Bonjour à tous,

Voilà une question d'ordre général :
Il est possible en VBA de créer des fonctions personnalisées qui renvoient
une seule valeur

par ex :
Function inf(arg1#, arg2#) As Boolean
inf = False
If arg1 < arg2 Then inf = True
End Function

, mais est-il possible de créer des fonctions personnalisées qui renvoient
une plage de valeurs en sortie ?

Merci pour vos réponses
Avatar
Luc Voeltzel
Merci pour vos réponses.

Si j'ai bien compris pour renvoyer une plage de valeur il faut
obligatoirement passer par une matrice.
Mais je suis étonné que personne ne déclare le type de sortie de la
fonction.

Faut-il déclarer ?
- function (entree as range) as RANGE
blabla
end function

-ou function (entree as variant) as VARIANT
blabla
end function

- a moins que la declaration n'aie aucune importance ?
Dans ce cas, (comme dans vos exemples ) on a juste :
function (entree as range)
blabla
end function

?
:-)





"Luc Voeltzel" a écrit dans le message de
news:%
Bonjour à tous,

Voilà une question d'ordre général :
Il est possible en VBA de créer des fonctions personnalisées qui renvoient
une seule valeur

par ex :
Function inf(arg1#, arg2#) As Boolean
inf = False
If arg1 < arg2 Then inf = True
End Function

, mais est-il possible de créer des fonctions personnalisées qui renvoient
une plage de valeurs en sortie ?

Merci pour vos réponses




Avatar
Ange Ounis
Une fonction VBA matricielle doit obligatoirement être déclarée en Variant et le
tableau intermédiaire qui lui est affecté comme résultat également.
En l'absence de déclaration explicite, VBA considère automatiquement une
variable comme déclarée implicitement en Variant.
D'où la fréquente habitude de ne pas déclarer ses variables, ce qui équivaut à
les déclarer toutes en Variant.
Mauvaise habitude de mon point de vue, mais c'est un autre débat.

----------
Ange Ounis
----------

Merci pour vos réponses.

Si j'ai bien compris pour renvoyer une plage de valeur il faut
obligatoirement passer par une matrice.
Mais je suis étonné que personne ne déclare le type de sortie de la
fonction.

Faut-il déclarer ?
- function (entree as range) as RANGE
blabla
end function

-ou function (entree as variant) as VARIANT
blabla
end function

- a moins que la declaration n'aie aucune importance ?
Dans ce cas, (comme dans vos exemples ) on a juste :
function (entree as range)
blabla
end function

?
:-)





"Luc Voeltzel" a écrit dans le message de
news:%
Bonjour à tous,

Voilà une question d'ordre général :
Il est possible en VBA de créer des fonctions personnalisées qui renvoient
une seule valeur

par ex :
Function inf(arg1#, arg2#) As Boolean
inf = False
If arg1 < arg2 Then inf = True
End Function

, mais est-il possible de créer des fonctions personnalisées qui renvoient
une plage de valeurs en sortie ?

Merci pour vos réponses








Avatar
Luc Voeltzel
Je ne comprenais pas pourquoi je n'arrivais pas à déclarer
la fonction comme un type Range.
J'ai enfin les idées un peu plus claires.

Merci !


"Ange Ounis" a écrit dans le message de
news:
Une fonction VBA matricielle doit obligatoirement être déclarée en Variant
et le

tableau intermédiaire qui lui est affecté comme résultat également.
En l'absence de déclaration explicite, VBA considère automatiquement une
variable comme déclarée implicitement en Variant.
D'où la fréquente habitude de ne pas déclarer ses variables, ce qui
équivaut à

les déclarer toutes en Variant.
Mauvaise habitude de mon point de vue, mais c'est un autre débat.

----------
Ange Ounis
----------

Merci pour vos réponses.

Si j'ai bien compris pour renvoyer une plage de valeur il faut
obligatoirement passer par une matrice.
Mais je suis étonné que personne ne déclare le type de sortie de la
fonction.

Faut-il déclarer ?
- function (entree as range) as RANGE
blabla
end function

-ou function (entree as variant) as VARIANT
blabla
end function

- a moins que la declaration n'aie aucune importance ?
Dans ce cas, (comme dans vos exemples ) on a juste :
function (entree as range)
blabla
end function

?
:-)





"Luc Voeltzel" a écrit dans le message de
news:%
Bonjour à tous,

Voilà une question d'ordre général :
Il est possible en VBA de créer des fonctions personnalisées qui
renvoient



une seule valeur

par ex :
Function inf(arg1#, arg2#) As Boolean
inf = False
If arg1 < arg2 Then inf = True
End Function

, mais est-il possible de créer des fonctions personnalisées qui
renvoient



une plage de valeurs en sortie ?

Merci pour vos réponses