Excel : l'objet Range, une question difficile

Résolu
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 17 sept. 2005 à 21:12
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 20 sept. 2005 à 22:23
Bonsoir,

Je ne pose une question, que je n'arrive pas à résoudre.

Dans Excel, comment fabriquer de toute pièce un objet Range affecté d'une série de valeurs ?

En clair, sur un exemple. J'ai programmé la function :

Function ResolMat(MatX As Range, MatY As Range, Optional i As Variant = 1)
ResolMat = WorksheetFunction.Index(WorksheetFunction.MMult(WorksheetFunction.MInverse(MatX), MatY), i)
End Function

... et je voudrais, à partir d'une Sub (et non pas du tableur, qui ne pose pas de problème), faire appel à cette fonction. Mais pour cela je dois envoyer à la fonction des objets Range, comme ceci : Sol1=resolmat(MatA,MatB,1)
JE peux créer MatA comme ceci : Dim MatA() as Range ... mais MatA est vide ! Et je n'arrive pas à trouver comment on lui affecte des valeurs ? ... comme on le ferait avec un tableau classique... Une idée ?


Us.

8 réponses

valtrase Messages postés 937 Date d'inscription lundi 19 janvier 2004 Statut Membre Dernière intervention 9 mai 2022 3
19 sept. 2005 à 00:10
Salut,
C'est confu ton histoire
1°) Tu peux affecter un tableau à un Objet range
Dim rTab
rTab = [D1:E5] '*** On rempli le tableau
[A1:A5] = Rtab '***
Donc dans ton cas tu rempli ton tableau et ensuite tu l'affecte à ton objet Range


2°) Pour affecter une valeur a un objet range utilises SET
Dim MatA As Range, MatB As RangeSet MatA [A1:A10]: Set MatB [D1:E10]
Sol1=resolmat(MatA,MatB,1)

3°) Si l'utilisateur doit choisir des plages de cellules utilises RefEdit
Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
3
Tu ne peux pas ......
Pour faire ce que je pense que tu veux faire c'est Charger un tableau avec tes valeurs, faire le traitement, mais ne pas remplrir ta feuille avec ton tableau.

Sub Calcul()

'*** Ceci ne te sert à rien dans ton code
<STRIKE>Dim rTab
rTab = [A1:C2]</STRIKE>

'*** Ici pas de déclaration en Range
Dim MatA , MatB

'*** Là tu charge tes tableaux, bien sur [A1:B2] et [C1:C2]
'*** Doivent contenir des données
MatA = [A1:B2]
MatB = [C1:C2]

'*** Donc ceci est inutile
<STRIKE>MatA(1, 1) = 2
MatA(1, 2) = 3
MatA(2, 1) = 5
MatA(2, 2) = 7
</STRIKE>
<STRIKE>MatB(1) = 11
MatB(2) = 13
</STRIKE>
'*** Ta fonction travaille sur des tableaux
'*** Et non plus sur des objets Range

sol1 = ResolMat(MatA, MatB, 1)
sol2 = ResolMat(MatA, MatB, 2)
MsgBox sol1(1)
MsgBox sol2(1)

'*** Cette ligne est inutile dans ton code
<STRIKE>[A1:C2] = rTab</STRIKE>

'*** Ensuite tu peux, si tu le désire, charger une plage de cellule avec
'*** Ton tableau

End Sub

Cordialement, Jean-Paul
______________________________________________________________________

Le Savoir n'a de valeur que s'il est partagé
3
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
17 sept. 2005 à 21:59
Salut 'Us',
Les arguments de ta fonction sont passés par valeur (par défaut), essais en les faisant passés par référence (byRef)
Lire le turtorial http://www.vbfrance.com/tutorial.aspx?id=182

Et si ta fonction ne retourne rien remplace Function par Sub


-----------------------------------------------------------------
Voici ta fonction avec ses paramètres passés par référence

Function ResolMat(ByRef MatX As Range,ByRef MatY As Range, Optional i As Variant = 1)
ResolMat = WorksheetFunction.Index(WorksheetFunction.MMult(WorksheetFunction.MInverse(MatX), MatY), i)
End Function

Bonne prog :)
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
18 sept. 2005 à 00:05
Non, désolé... mais mon problème n'est pas comment je peux apeller la fonction, mais comment affecter des valeurs à MatX directement en VBA. (donc sans passer par une feuille de calcul.)

Par exemple, si MatX était pas un objet Range, mais un tableau (tout à fait possible pour la fonction, mais plus pour Woksheetfunction, d'où mon problème), on ferait :

MatX(1,1)= Truc 1
MatX(1,2)= Truc 2
etc...

Ce que je cherche, c'est faire la même chose mais avec l'objet Range définissant MatX.



Merci pour ta tentative...

Amicalement,
Us.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
18 sept. 2005 à 01:13
Bonsoir,
OK je crois que j'ai saisis

Dim MatX as Range

'Ce qui sélectionne de B1 à J2
MatX = Range(Cells(1, 2), Cells(2, 10)).Select

Est-ce quelque chose comme ca que tu essais d'affecter à MatX ??
Tiens-moi au courant
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
18 sept. 2005 à 01:32
Euh... oui et non... ok, la syntaxe semble bonne, mais elle fait directement référence à la feuille de calcul. Or, moi je cherche justement à ne pas faire une référence directe. Le but étant d'utiliser la fonction Resolmat (paramètrée avec Range) comme si elle était paramétré avec un tableau (Dim).

Voilà, cela fait des heures que je planche sur le sujet, en fouillant un peu partout (livres et internet) et impossible de trouver... Est-ce possible ? ... je crains qu'il faut peut-être passer par une astuce... En fait, en simulant un utilisateur écrivant dans les cellules sur une feuille de calculs, les valeurs pour MatX et MatY, puis en sélectionnant les plages, je dois pouvooir récupérer la sélection en type Range... mais je trouve cette solution un peu barbare...

Voilà, donc si voit mieux ?

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
19 sept. 2005 à 23:00
Bonsoir,

Vous venez de m'apprendre des trucs sur Excel... Effectivement, je dois être un peu confu, l'heure tardive peut-être -:);

J'ai analysé attentivement vos explications, qui répondre presque à ma question, mais je n'arrive pas tout à fait à mon but, car je suis encore obligé de passer par la feuille de calcul.

Un exemple s'impose. Voici, une sub qui définie un système linéaire d'équations résolubles par la fonction ResolMat. Les cases A1:C2 étant remplies de données quelconques, que je veux préserver.

=

Sub Calcul()

Dim rTab
rTab = [A1:C2]

Dim MatA As Range, MatB As Range
Set MatA = [A1:B2]
Set MatB = [C1:C2]

MatA(1, 1) = 2
MatA(1, 2) = 3
MatA(2, 1) = 5
MatA(2, 2) = 7

MatB(1) = 11
MatB(2) = 13

sol1 = ResolMat(MatA, MatB, 1)
sol2 = ResolMat(MatA, MatB, 2)
MsgBox sol1(1)
MsgBox sol2(1)

[A1:C2] = rTab

End Sub

=

Cette Sub fonctionne correctement. Mais elle modifie (temporairement) aussi les cellules A1:C2. Or, c'est justement ce que je cherchais à éviter. D'où ma question, comment créer un objet Range de toute pièce, c.a.d. sans référence à une feuille de calcul ? Est-ce possible ?


Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
20 sept. 2005 à 22:23
Ok, je te remercie, et également Willi. Toutes ces informations m'ont bien éclairées.

Amicalement,
Us.
0
Rejoignez-nous