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

Envoyer le résultat d'une fonction dans une autre cellule

7 réponses
Avatar
xlb
Bonjour

Dans une fonction, je récupère un variant tableau de valeurs depuis une dll.
Je voudrais remplir une plage avec les valeurs de ce tableau.

J'ai essayé sans résultat :

Function MaFonctionVBA(ByVal DonneeEntree as String) As Variant
Dim V As Variant
V = MaFonctionDllQuiRenvoieLe Tableau(DonneeEntree)
MaFonctionVBA = ""
ActiveWorkbook.Worksheets("Feuil1").Range("A15:B30") = V
End Function

Je peux bien sûr renvoyer la valeur i,j avec une formule dans chaque
cellule, mais je voudrais le faire en une seule fois.
Est-ce possible ?

Xavier

7 réponses

Avatar
anonymousA
bonjour,

il n'y a pas d'erreur à priori dans ton code sauf si les dimensions de V
et de Range("A15:B30") sont différenres mais ca m'étonnerait que t'aies
commis cette erreur.
Si tu m'en disais plus sur la nature l'errreur que tu obtiens ou du
dysfonctionnement que tu rencontres?
Enfin,cependant, la déclaration ByVal plutot que ByRef pourrait-elle
poser problème ?

A+




Bonjour

Dans une fonction, je récupère un variant tableau de valeurs depuis une dll.
Je voudrais remplir une plage avec les valeurs de ce tableau.

J'ai essayé sans résultat :

Function MaFonctionVBA(ByVal DonneeEntree as String) As Variant
Dim V As Variant
V = MaFonctionDllQuiRenvoieLe Tableau(DonneeEntree)
MaFonctionVBA = ""
ActiveWorkbook.Worksheets("Feuil1").Range("A15:B30") = V
End Function

Je peux bien sûr renvoyer la valeur i,j avec une formule dans chaque
cellule, mais je voudrais le faire en une seule fois.
Est-ce possible ?

Xavier




Avatar
Alain CROS
Bonjour.

Une fonction renvoie une valeur mais ne modifie rien.
Transformer la fonction en sub.

Alain CROS

"xlb" a écrit dans le message de news: 41fb75f7$0$6495$
Bonjour

Dans une fonction, je récupère un variant tableau de valeurs depuis une dll.
Je voudrais remplir une plage avec les valeurs de ce tableau.

J'ai essayé sans résultat :

Function MaFonctionVBA(ByVal DonneeEntree as String) As Variant
Dim V As Variant
V = MaFonctionDllQuiRenvoieLe Tableau(DonneeEntree)
MaFonctionVBA = ""
ActiveWorkbook.Worksheets("Feuil1").Range("A15:B30") = V
End Function

Je peux bien sûr renvoyer la valeur i,j avec une formule dans chaque
cellule, mais je voudrais le faire en une seule fois.
Est-ce possible ?

Xavier




Avatar
anonymousA
bonjour,

Je ne suis pas complètement d'accord avec toi. Pour une fonction
appellée depuis une cellule, je suis d'accord mais pour une fonction
appelée depuis une sub dans le corps d'un programme , il n'en est
rien.Dans ce dernier cas, on peut tout changer. Or il me paraissait dans
le message du correspondant qu'il n'était pas précisé à partir de quoi
était appellée sa fonction. Je suppose que c'est ce que tu voulais dire.

Mon hypothèse sur cette différence de traitement selon le contexte
d'appel d'une fonction (mais c'est seulement une hypothèse et elle vaut
ce qu'elle vaut) : Excel ne peut pas changer la structure d'une feuille
quand la fonction est appelée depuis une cellule car il y a risque de se
mordre la queue.

A+

Bonjour.


Une fonction renvoie une valeur mais ne modifie rien.
Transformer la fonction en sub.

Alain CROS

"xlb" a écrit dans le message de news: 41fb75f7$0$6495$

Bonjour

Dans une fonction, je récupère un variant tableau de valeurs depuis une dll.
Je voudrais remplir une plage avec les valeurs de ce tableau.

J'ai essayé sans résultat :

Function MaFonctionVBA(ByVal DonneeEntree as String) As Variant
Dim V As Variant
V = MaFonctionDllQuiRenvoieLe Tableau(DonneeEntree)
MaFonctionVBA = ""
ActiveWorkbook.Worksheets("Feuil1").Range("A15:B30") = V
End Function

Je peux bien sûr renvoyer la valeur i,j avec une formule dans chaque
cellule, mais je voudrais le faire en une seule fois.
Est-ce possible ?

Xavier









Avatar
Gaenonius
Procède par étapes :

1 Une variable publique qui servira à récupérer le tableau depuis ta dll et le
transmettre à la fonction matricielle VBA
2 Une procédure qui initialise la variable avec le tableau
3 Une fonction VBA matricielle pour écrire les valeurs du tableau dans une
feuille de calcul.

Exemple simple :

''''''''''''''''dans un module de code ordinaire :
Public V

Sub test()
V = Array(10, 20, 30, 40, 50)
End Sub

Function MatricielleVBA()
If Application.Caller.Rows.Count = 1 Then
MatricielleVBA = V
Else
MatricielleVBA = Application.Transpose(V)
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''

Dans une feuille de calcul, après avoir sélectionné 5 cellules sur la même ligne
ou la même colonne selon besoin :

=MatricielleVBA()
(à valider par Ctrl+Maj+Entrée)

--
Gaenonius

Bonjour

Dans une fonction, je récupère un variant tableau de valeurs depuis une dll.
Je voudrais remplir une plage avec les valeurs de ce tableau.

J'ai essayé sans résultat :

Function MaFonctionVBA(ByVal DonneeEntree as String) As Variant
Dim V As Variant
V = MaFonctionDllQuiRenvoieLe Tableau(DonneeEntree)
MaFonctionVBA = ""
ActiveWorkbook.Worksheets("Feuil1").Range("A15:B30") = V
End Function

Je peux bien sûr renvoyer la valeur i,j avec une formule dans chaque
cellule, mais je voudrais le faire en une seule fois.
Est-ce possible ?

Xavier




Avatar
anomymousA
bonjour,

oui , et alors ? à quel moment en suivant ta procédure, les données
s'inscrivent-elles dans la feuille en cours ?

Ai essayé ta proc et ne suis arrivé à aucun résultat, mais ai peut-être
manqué quelque chose ?

A+



Procède par étapes :

1 Une variable publique qui servira à récupérer le tableau depuis ta dll et le
transmettre à la fonction matricielle VBA
2 Une procédure qui initialise la variable avec le tableau
3 Une fonction VBA matricielle pour écrire les valeurs du tableau dans une
feuille de calcul.

Exemple simple :

''''''''''''''''dans un module de code ordinaire :
Public V

Sub test()
V = Array(10, 20, 30, 40, 50)
End Sub

Function MatricielleVBA()
If Application.Caller.Rows.Count = 1 Then
MatricielleVBA = V
Else
MatricielleVBA = Application.Transpose(V)
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''

Dans une feuille de calcul, après avoir sélectionné 5 cellules sur la même ligne
ou la même colonne selon besoin :

=MatricielleVBA()
(à valider par Ctrl+Maj+Entrée)

--
Gaenonius

Bonjour

Dans une fonction, je récupère un variant tableau de valeurs depuis une dll.
Je voudrais remplir une plage avec les valeurs de ce tableau.

J'ai essayé sans résultat :

Function MaFonctionVBA(ByVal DonneeEntree as String) As Variant
Dim V As Variant
V = MaFonctionDllQuiRenvoieLe Tableau(DonneeEntree)
MaFonctionVBA = ""
ActiveWorkbook.Worksheets("Feuil1").Range("A15:B30") = V
End Function

Je peux bien sûr renvoyer la valeur i,j avec une formule dans chaque
cellule, mais je voudrais le faire en une seule fois.
Est-ce possible ?

Xavier







Avatar
Gaenonius
C'est la fonction qui renvoie les données du tableau dans la feuille de calcul.
Elle s'utilise comme une fonction matricielle "classique".
La procédure n'a pour objet que d'initialiser le tableau exemple (variable
publique V) renvoyé par la fonction. Il faut l'exécuter une fois avant
d'utiliser la fonction.
Dans la demande de "xlb", V devra être initialisé avec le tableau issu de sa dll.
D'autres solutions sont possibles, notamment une procédure Sub qui ferait tout
le travail (récupérer les données de la dll et les renvoyer dans une feuille de
calcul).
Cependant la demande initiale portait sur le moyen de le faire à l'aide d'une
fonction.

--
Gaenonius

bonjour,

oui , et alors ? à quel moment en suivant ta procédure, les données
s'inscrivent-elles dans la feuille en cours ?

Ai essayé ta proc et ne suis arrivé à aucun résultat, mais ai peut-être
manqué quelque chose ?

A+




Procède par étapes :

1 Une variable publique qui servira à récupérer le tableau depuis ta dll et le
transmettre à la fonction matricielle VBA
2 Une procédure qui initialise la variable avec le tableau
3 Une fonction VBA matricielle pour écrire les valeurs du tableau dans une
feuille de calcul.

Exemple simple :

''''''''''''''''dans un module de code ordinaire :
Public V

Sub test()
V = Array(10, 20, 30, 40, 50)
End Sub

Function MatricielleVBA()
If Application.Caller.Rows.Count = 1 Then
MatricielleVBA = V
Else
MatricielleVBA = Application.Transpose(V)
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''

Dans une feuille de calcul, après avoir sélectionné 5 cellules sur la même ligne
ou la même colonne selon besoin :

=MatricielleVBA()
(à valider par Ctrl+Maj+Entrée)

--
Gaenonius


Bonjour

Dans une fonction, je récupère un variant tableau de valeurs depuis une dll.
Je voudrais remplir une plage avec les valeurs de ce tableau.

J'ai essayé sans résultat :

Function MaFonctionVBA(ByVal DonneeEntree as String) As Variant
Dim V As Variant
V = MaFonctionDllQuiRenvoieLe Tableau(DonneeEntree)
MaFonctionVBA = ""
ActiveWorkbook.Worksheets("Feuil1").Range("A15:B30") = V
End Function

Je peux bien sûr renvoyer la valeur i,j avec une formule dans chaque
cellule, mais je voudrais le faire en une seule fois.
Est-ce possible ?

Xavier









Avatar
xlb
Merci pour les réponses.

D'après ce que j'ai lu sur http://longre.free.fr/pages/prog/udf.htm#Limites
, une fonction ne peut pas modifier le contenu d'un classeur.

Je suis arrivé à la même conclusion : utiliser une formule matricielle.
Une limite : il faut avoir une idée de la taille du tableau. Si on prend a
priori une très large zone, des #N/A apparaissent, mais bon c'est déjà pas
mal.

Une autre solution serait de faire un transfert par OLE depuis la dll...

Xavier

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

C'est la fonction qui renvoie les données du tableau dans la feuille de
calcul. Elle s'utilise comme une fonction matricielle "classique".
La procédure n'a pour objet que d'initialiser le tableau exemple (variable
publique V) renvoyé par la fonction. Il faut l'exécuter une fois avant
d'utiliser la fonction.
Dans la demande de "xlb", V devra être initialisé avec le tableau issu de
sa dll.
D'autres solutions sont possibles, notamment une procédure Sub qui ferait
tout le travail (récupérer les données de la dll et les renvoyer dans une
feuille de calcul).
Cependant la demande initiale portait sur le moyen de le faire à l'aide
d'une fonction.

--
Gaenonius

bonjour,

oui , et alors ? à quel moment en suivant ta procédure, les données
s'inscrivent-elles dans la feuille en cours ?

Ai essayé ta proc et ne suis arrivé à aucun résultat, mais ai peut-être
manqué quelque chose ?

A+




Procède par étapes :

1 Une variable publique qui servira à récupérer le tableau depuis ta dll
et le transmettre à la fonction matricielle VBA
2 Une procédure qui initialise la variable avec le tableau
3 Une fonction VBA matricielle pour écrire les valeurs du tableau dans
une feuille de calcul.

Exemple simple :

''''''''''''''''dans un module de code ordinaire :
Public V

Sub test()
V = Array(10, 20, 30, 40, 50)
End Sub

Function MatricielleVBA()
If Application.Caller.Rows.Count = 1 Then
MatricielleVBA = V
Else
MatricielleVBA = Application.Transpose(V)
End If
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''

Dans une feuille de calcul, après avoir sélectionné 5 cellules sur la
même ligne ou la même colonne selon besoin :

=MatricielleVBA()
(à valider par Ctrl+Maj+Entrée)

--
Gaenonius


Bonjour

Dans une fonction, je récupère un variant tableau de valeurs depuis une
dll.
Je voudrais remplir une plage avec les valeurs de ce tableau.

J'ai essayé sans résultat :

Function MaFonctionVBA(ByVal DonneeEntree as String) As Variant
Dim V As Variant
V = MaFonctionDllQuiRenvoieLe Tableau(DonneeEntree)
MaFonctionVBA = ""
ActiveWorkbook.Worksheets("Feuil1").Range("A15:B30") = V
End Function

Je peux bien sûr renvoyer la valeur i,j avec une formule dans chaque
cellule, mais je voudrais le faire en une seule fois.
Est-ce possible ?

Xavier