us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
17 sept. 2005 à 21:12
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 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 ?
valtrase
Messages postés937Date d'inscriptionlundi 19 janvier 2004StatutMembreDernière intervention 9 mai 20223 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
______________________________________________________________________
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
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 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
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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...
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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]
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 ?