Problème syntaxe array

  • Initiateur de la discussion gerome1980
  • Date de début
G

gerome1980

Guest
Bonjour,

je suis débutant VBA et j'essaie de définir un tableau à deux entrées.
Voici le code:

Code:
Function fy(n, t)
Dim S As Variant
S(355) = Array(355, 345, 335, 325, 315, 295)
S(420) = Array(420, 400, 390, 370, 360, 340)
S(460) = Array(460, 440, 430, 410, 400, 'PM')
fy = S(n)(t)
End Function

Excel me sort #REF!
Le S(n)(t) n'a pas l'air joli joli...
Pourriez-vous m'aider?

Merci,

Jerome
 

Hervé

XLDnaute Barbatruc
Bonjour gerome

peut etre comme ceci, si ton n renvoi un emplacement (1,2 ou 3) :



Sub Bouton1_QuandClic()
MsgBox fy(3, 5)
'pour test
End Sub
Function fy(n, t)
Dim S As Variant
Dim Ss(1 To 3)



S355 = Array(355, 345, 335, 325, 315, 295)
S420 = Array(420, 400, 390, 370, 360, 340)
S460 = Array(460, 440, 430, 410, 400, 'PM')

Ss(1) = S355
Ss(2) = S420
Ss(3) = S460

fy = Ss(n)(t)
End Function

salut
 

Jam

XLDnaute Accro
Salut gerome,

Plusieurs remarques concernant ton code:

1. Il faut définir le type des variables - c'est beaucoup mieux et fortement conseillé
ex:
Function fy (n as Integer, t as Double) as Variant

2. la fonction Array permet de créer un tableau comprenant les élements déclarés.
2bis. Tu ne peux pas donner une dimension à S (ex. 355).

3. Dans ta fonction tableau S(355) ou un autre, ne peut pas être interprété tel quel. Il faut que tu 'choisisse' l'élément du tableau que tu souhaites utiliser.

4. fy = S(n)(t) ne signifie rien en VBA :( J'imagine que tu veux multiplier ton tableau par la variable 't'

Donc pour tout cela il vaut mieux procéder ainsi:

(Attention: déclarations des variables à adapter à ton cas)
Function fy(n as integer, t as double) as variant
Dim S as Variant

Select Case n
Case 355
S=Array(355,345,335,325,315,295)
Case 420
S=Array(420,400,390,370,360,340)
case 460
...
Case else
fy=0
End Select

'Pour le reste faudra que tu expliques ta fonction car je ne sais pas ce que tu veux faire exactement. ATTENTION: tu ne peux pas renvoyer de tableau dans une fonction de feuille

End Function

Bon courage
 
G

gerome1980

Guest
Re...

En fait le paramètre t est un intervalle (par exemple 8<t<16). Pour la definition de ces intervalles puis-je faire qqchose dans ce style:
Case 1
8<t and t<16
Case 2 etc...?

Je voulais savoir,également,dans la proposition d'Hervé à quoi correspondait Ss (appellation). Peut-on appeler ça une fonction? liste? ou est-ce une variant?
J'ai du mal avec le vocab :eek:

Et puis ATTENTION: tu ne peux pas renvoyer de tableau dans une fonction de feuille; c'est-à-dire? je ne peux pas utiliser fy dans ma feuille de calcul?

Merci,

Jerome
 

Hervé

XLDnaute Barbatruc
re gerome, salut jam

'Je voulais savoir,également,dans la proposition d'Hervé à quoi correspondait Ss (appellation).
Peut-on appeler ça une fonction? liste? ou est-ce une variant?'

il s'agit simplement d'une variable tableau à 3 dimensions, contenant les trois autres tableaux (S355, S420, S460)

j'ai voulu ne pas trop m'eloigner de ton code initiale et est donc utilisé une variable tableau contenant d'autres variables tableaux, et dans ce cas, cette syntaxe fy = S(n)(t) est admise.

'Et puis ATTENTION: tu ne peux pas renvoyer de tableau dans une fonction de feuille; c'est-à-dire? je
ne peux pas utiliser fy dans ma feuille de calcul?'

si tu peux, mais dans ce cas, ta fonction devient matricielle (Merci DidierMdf :) )

prenons l'exemple de ce code :


Function fy(n As String)
Dim S As Variant

Select Case n
       
Case 'S355': S = Array(355, 345, 335, 325, 315, 295)
       
Case 'S420': S = Array(420, 400, 390, 370, 360, 340)
       
Case 'S460': S = Array(460, 440, 430, 410, 400, 'PM')
End Select

fy = S
End Function

qui suivant la valeur de n (S355, S420 ou S460) te renverra un tableau.

1) en A1, tu met S355
2) tu sélectionnes les cellules B1 à B6
3) tu tapes : =transpose(fy(A1))
4) tu valides par CTRL+MAJ+ENTREE

et voilà ton tableau est retourné sur ta feuille.

si tu met S420 en A1 tes valeurs en colonne B se modifieront.

par contre, j'ai rien compris à ton histoire d'intervalle.

salut :)
 

Jam

XLDnaute Accro
Re Gorfael, Hervé, Gerome

1. Gorfael
Array sert bien à 'remplir' un tableau. Par conte pour l'utiliser il faut bien l'attribuer à une variable, ici S.

2. Merci Hervé pour cette explication concernant les formules matricielles. Moi qui ne les utilise pas (à tord peut-être) j'ignorais cette utilisation.

3. Pour les intervalles. J'imagine Gerome que tu veux tester si 't' est dans un interval. Un simple
If 8<t and t<16 Then ... devrait suffire. Après la complexité et la position dans le code variera en fonction de ce que tu veux faire. A toi de nous le dire.
 

Gorfael

XLDnaute Barbatruc
Jam écrit:
Re Gorfael, Hervé, Gerome

1. Gorfael
Array sert bien à 'remplir' un tableau. Par conte pour l'utiliser il faut bien l'attribuer à une variable, ici S.
salut et merci pour ta réponse Jam
Malheureusement, je dois être un peu dur de la comprenette pour moi :
S = Array(355, 345, 335, 325, 315, 295)
ferait un tableau à 6 dimensions soit 1,2×10^15 cellules.
Donc, la seule solution logique c'est que S remplace un tableau à une dimension de 6 cases, mais j'ai rien trouvé dans 'l'aide' Excel. Et surtout, je vois pas comment l'utiliser.
Mais c'est pas grave, je comprendrais quand je serais grand :silly:
A+
 

Jam

XLDnaute Accro
Salut Gorfael,

Avec Array tu as un tableau à une dimension, et pas 6. Il ne s'agit pas d'une déclaration de taille de tableau du type Dim monTablo(2,3) As monType.

A quoi cela peux servir ? Par exemple à établir une liste d'élément défini (et fixe) genre:

S= Array('Pomme','Carotte','Voiture',10,'la blague du jour')
S=Array('Janvier','Février','Mars')
S=Array('Boulon','Ecrou','Tournevis')

Voilà, j'espère que cela t'aidera à bien comprendre son utilité.

Bonne journée