Affichage d un tableau retourne par une fonction

Affichage d un tableau retourne par une fonction - VB/VBA/VBS - Programmation

Marsh Posté le 16-07-2010 à 08:14:07    

Bonjour,
Je debute la programmation vba pour excel et je suis confronte a un probleme. J essaie de creer une fonction test() qui retourne un tableau. Lorsque je fais appel a cette fonction dans une cellule de ma feuille excel j aimerais que le tableau s affiche dans les cellules adjacentes a la cellule appelante. En pratique je fais par exemple  
 
Function test() As Variant
Dim toto(1 To 2, 1 To 2) As Variant
toto(1, 1) = 2
toto(2, 2) = 3
toto(1, 2) = 4
toto(2, 1) = 5
test = toto
End Function
 
Et lorsque j appelle en D2 (par exemple) =test() seule la case D2 contient toto(1,1) c est a dire la valeur 2.
J utilise excel 2002.
Est ce normal ? Y a t il quelquechose que je n ai pas compris ?
Merci
 
Paf le chiot


Message édité par paflechiot le 16-07-2010 à 09:33:04
Reply

Marsh Posté le 16-07-2010 à 08:14:07   

Reply

Marsh Posté le 16-07-2010 à 11:54:21    

Oui c'est normal, il est nécessaire d'utiliser la fonction INDEX.
 
Dans Excel, tape par exemple :  
 
=INDEX(test();1;2) ... Il devrait te renvoyer 4.
 
Il n'est pas possible de taper test() dans la cellule D2 et d'avoir les cellules D2, D3, E2, E3 qui se remplissent :/


Message édité par pepito_mi_corazon le 16-07-2010 à 11:59:00
Reply

Marsh Posté le 16-07-2010 à 12:07:08    

Merci de ton aide, effectivement cela m affiche bel et bien 4.
Cependant le remplissage de plusieurs cases par une fonction est possible.
L API bloomberg le fait (c est une application de donnees financieres) mais l acces aux sources est protege. La solution serait elle de mettre par exemple dans le code:
 
....
toto = 2 'la valeur de la premiere case de la matrice
call procedure_qui_remplit_les_autres_cases(coord_case_courante, toto)
....
 
Encore merci de ton aide

Reply

Marsh Posté le 19-07-2010 à 11:30:58    

Non le remplissage de cellules par une fonction n'est pas possible, du moins pas directement. Peut etre sous 2007, pas fait l'essai.
La preuve, tu parles d'API. Or, une API, d'où son nom n'est pas natif à Excel.
 
Parcontre, tu peux, detecter une modification sur la cellule, si elle contient ta fonction, tu recuperes le resultat et en fonction tu t'occupes de tes cellules.
 
Exemple :
Une fonction toute bete qui renvoit une valeur d'un tableau.

Code :
  1. Function MonTableau(Element)
  2.     'Définit la taille du tableau et le type de données.
  3.     Dim NomTableau(2) As String
  4.    
  5.     'Alimente les éléments du tableau
  6.     NomTableau(0) = "a"
  7.     NomTableau(1) = "b"
  8.     NomTableau(2) = "c"
  9.    
  10.     'Affiche l'element du tableau
  11.     MonTableau = NomTableau(Element)
  12. End Function


Donc si Element = 0 ca renvoit "a", Element = 1 ca renvoit "b" etc.
 
En A1 tu saisis : 0
En D2 tu saisis : =MonTableau(A1)
D2 renvoit bien "a"
 
Ensuite tu vas dans VBA, sur ta feuille :

Code :
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. 'Si la formule contient "MonTableau", le nom de la fonction
  3. If InStr(1, Target.FormulaR1C1, "MonTableau", vbTextCompare) <> 0 Then
  4.    
  5.     'code
  6.     'Ici un code a la con qui teste, si c'est "a" il met youpi dans la cellule d'a coté, en rouge.
  7.     If Target.Value = "a" Then
  8.         Cells(Target.Row, Target.Column + 1) = "Youpi"
  9.         Cells(Target.Row, Target.Column + 1).Font.ColorIndex = 3
  10.     End If
  11. End If
  12. End Sub


 
Donc en gros, tu entres ta fonction dans une cellule
Il calcule le resultat de la fonction
Et en fonction du resultat (dans cette meme cellule) il va mettre youpi dans la cellule d'a coté, en rouge.
 
Ca devrait te donner des pistes.


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 20-07-2010 à 22:32:33    

Je pense avoir trouvé : Il faut écrire la fonction entre accolades {} ... ça permet d'écrire une matrice sous excel... Je détaillerai ça demain.

Reply

Marsh Posté le 22-04-2013 à 20:24:31    

salut pepito_mi_corazon
 
En fait, j'ai le même problème , ma fonction comprend beaucoup de boucle et ça prend beaucoup de temps pour le calcul, son résultat est une matrice de 2 ligne et de 6 colonnes, avec la fonction index ça marche mais,  je veux bien si tu te souviens de ta solution avec les accolades {}, pour faire  les boucle une fois mais pas 12 fois (pour chaque éléments) avec la fonction INDEX. je me suis dit que ça va marchera mieux avec cette solution des accolades {} pour optimiser le temps 12 fois moins.  merci d'avance

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed