Création de colonne dans une matrice
bonjour
je cherche à savoir comment créer des colonnes contenant différentes grandeurs dans une matrice et ce en vba. je suis actuellement en train e programmer une fonction sous vba et les résultats doivent être présentés comme sur la photo.
Le début de mon programme est :
Function générale(tbldonnées)
PAlpha = 5
NbrC = 5
Pi = Application.WorksheetFunction.Pi()
ReDim mtxgénérale(NbrC, 180 / PAlpha + 1)
For C = 0 To (3.5 / 1000 + 100 / 1000) / (tbldonnées(5, 2))
Mext = tbldonnées(10, 6) + tbldonnées(1, 6) * ((tbldonnées(4, 2)) / Pi) ^ 2 * C
For eb = 0 To ec1 * (1 + tbldonnées(19, 2))
Yhc = eb / C
For Ybi = -tbldonnées(2, 2) / 2 To tbldonnées(2, 2) / 2
'déformations
eci = ((Yhc - Abs(Ybi)) * Courbure) / (1 + tbldonnées(19, 2))
ecii = ((Yhc - Abs(Ybi + 1)) * Courbure) / (1 + tbldonnées(19, 2))
esc = eb - (((tbldonnées(2, 2) / 2) - Abs(tbldonnées(4, 4))) * C)
est = eb - (((tbldonnées(2, 2) / 2) - Abs(tbldonnées(3, 4))) * C)
Bonjour
Merci mais ça ne répond pas a ma question..
Bonjour,
Il me semble que si, ce que tu cherches à faire c'est une fonction personnalisée matricielle qui retourne un tableau au lieu d'une valeur unique.
A toi de dimensionner ta table en fonction de ton besoin, d'y mettre les bonnes valeurs avant de retourner le résultat.
Prend au moins le temps de regarder l'exemple et de comprendre comment ça fonctionne...
eric
En fait je souhaiterai réaliser ceci...
Je n'ai pas accès a votre code vba. Est ce normal ?
Désolé mon code est:
Function generale(tbldonnees)
PAlpha = 5
NbrCoupure = 10
CourbureMax = (((tbldonnees(13, 2)) + 100)) / (tbldonnees(5, 2))
Pi = Application.WorksheetFunction.Pi()
ReDim mtxgenerale(NbrCoupure, 180 / PrécisionAlpha + 1)
For i = 0 To 180 / PrécisionAlpha
alpha = i * PrécisionAlpha
mtxgenerale(0, i + 1) = alpha
For k = 1 To NbrCoupure
mtxgenerale(k, 0) = k
mtxgenerale(0, 0) = "Coupure"
mtxgenerale(0, 1) = "Courbure"
For Each NbrCoupure In mtxgenerale(k, 0)
For j = 1 To CourbureMax - 1
mtxgenerale(j, 1) = (j - 1) / 1000
Next
Next
Next
Next
generale = mtxgenerale
End Function
Avec tbldonnees un tableau remplit par l'opérateur dans excel
Je n'ai pas accès a votre code vba. Est ce normal ?
Bizarre, il est dans le module 1 :
Function Mat(tabl1 As Range) As Variant
' fonction personnalisée matricielle
' le type retourné est obligatoirement Variant
' ici result a le même nombre de colonne que tabl1, ce n'est pas une obligation
Dim C() As Double, lig As Long, col As Long
ReDim result(1 To 3, 1 To tabl1.Columns.Count)
For lig = 1 To 3
For col = 1 To tabl1.Columns.Count
result(lig, col) = tabl1(1, col) * lig * 3.14
Next col
Next lig
Mat = result
End FunctionMettre une image ne sert pas à grand chose, c'est le fichier qu'il faut.
On pourrait voir si tu utilises Option Base 1 car là tu démarres les index de mtxgenerale à 0 au lieu de 1
Donc soit tu mets Option Base 1
soit tu mets ReDim mtxgenerale(1 to NbrCoupure, 1 to 180 / PrécisionAlpha + 1)
Et tu ne dis même pas quel est ton problème....
Un message d'erreur ? Pas de données ? Ou que sais-je encore ?
Et sélectionnes-tu la plage résultat de la même taille que ta variable tableau du résultat avant de saisir ta formule et de la valider en matriciel ?
Et oublies les cellules fusionnées, ça risque de ne pas le faire. Tu testeras ça en dernier pour voir si ça passe.
Bref, sans fichier on ne sait pas ce que tu fais.
eric
Bonjour Eric,
Merci de prendre la peine de répondre à mon sujet.
Je vous joints mon fichier Excel
LA matrice me retourne "#VALEUR". Or je souhaiterai obtenir les résultats de la manière dont c'est présenté sur la photo (concernant la fusion des cellules je sais qu'on ne peut pas le faire en déclarant la matrice tel que je l'ai fait)
J'ai regardé votre code , merci. Mais il ne correspond pas tout à fait à ce que je recherche, j'ai du mal m'exprimer.
Je souhaite en fait regrouper des valeurs (les A(courbure) sur la photo) qui dépendent de 3 variables finalement:
- la courbure
- le nombre de coupure
- l'angle considéré
Est ce plus clair?
La fonction que j'étudie est la derniere située dans le module 1 et appellée "fonction generale"
Elle fait appel au tableau "donnees" situé dans la feuille Excel
Merci pour votre aide
J'ai regardé votre code , merci. Mais il ne correspond pas tout à fait à ce que je rechercheMême pas du tout, c'est un exemple.
Sans tout regarder en détail tu ne respectes pas les impératifs que je t'ai indiqués pour une telle fonction : les index de ton tableau doivent commencer à 1 pour pouvoir être collés correctement sur la feuille.
Met un point d'arrêt au début et exécute-là en pas à pas. Tu verras où elle plante.
Et déclare et type toutes tes variables, là je pense que c'est indispensable.
D'autre part pose-toi la question si c'est la meilleure solution à ton problème. Pour quelles raisons as-tu fait ce choix ?
Une fonction matricielle impose des contraintes.
Ta fonction sera ré-évaluée à chaque saisie et risque de ralentir celle-ci. D'autant plus qu'elle fait elle-même à d'autres fonctions matricielles et que nulle part tu ne types tes variables pour essayer d'alléger un peu les calculs.
Utilises des Long tant que tu peux, et des Doubles (ou encore mieux des Single) que là où c'est nécessaire.
Si c'est pour ne l'utiliser qu'une fois dans le classeur, avec des paramètres d'entrée et le résultat au même endroit un sub classique est plus simple.
eric
Merci, je débute en VBA donc je galère pas mal..
"les index de ton tableau doivent commencer à 1 pour pouvoir être collés correctement sur la feuille." --> si je fais commencé le le k par 0 je vais avoir dans mon tableau un nombre de coupure = 0...ce qui n'est pas le cas d'où le For k = 1 To NbrCoupure
Il s'agit d'un programme faisant appel à un processus itératif..ce que j'ai envoyé ne correspond qu'au début du programme..j'ai besoin de stocker toutes mes informations dans une matrice je ne vois pas comment faire autrement.
J'ai réussi à débloquer (un peu) la situation..je n'obtiens plus de "#VALEUR" mais les valeurs obtenues ne correspondent pas à celle que je voudrais comme indiqué sur l'image du précédent post..
Est ce que quelqu'un pourrait m'aider à résoudre ce problème?
Comme apparemment l'index 0 ne t'a pas gêné oublie ce que j'ai dit.
mtxgenerale fait 38 colonnes x 331 lignes, ta plage sur la feuille doit faire pareil si tu veux voir tous les résultats.
Avec un sub que tu lances manuellement tu pourrais adapter la plage résultat au besoin s'il varie.
eric
Bonjour,
Tu dis toujours ce n'est pas bon sans jamais expliquer en quoi.
Tu ne tiens aucun compte des réponses et des conseils qui sont faits, j'ai l'impression de parler dans le vide.
Je préfère abandonner le suivi.
Bonne continuation.
eric
bonjour
si tu ne souhaite pas répondre à mon problème abstient toi alors.
j'ai tenu compte de tes remarque jai changé des choses en ce qui concerne les compteurs. je ne peux pas passez par un sub donc je vais pas modifier cela pour te faire plaisir. et je ne peux pas être plus claire , j'ai envoyé le fichier, des images, et expliquer que pour les 66 premières lignes ma boucle fonctionnait mais pas pour le reste. c'est un forum d'aide, si tu n'as pas envie de m'aider ,inutile de cliquer sur le sujet pour me faire des leçons de morale.
sur ce, salut
Il ne s'agit pas du sub obligatoire, je te dis simplement que sont utilisation te permettrait de modifier ton pas ou autre critère sans à avoir à supprimer et reprendre toute ta plage matricielle sur ta feuille. Si tu préfères bosser comme ça ce n'est pas un pb pour moi.
Il s'agit des explications : c'est pas bon est très explicite !
Il s'agit de déclarer et typer tes variables : indispensable pour l'efficacité du code et pour un débogage efficace.
Il s'agit de
, et toujours que 3 colonnes.mtxgenerale fait 38 colonnes x 331 lignes, ta plage sur la feuille doit faire pareil si tu veux voir tous les résultats.
Il s'agit de : dsl petite erreur de fichier. Et tu laisses les 2, lequel est le bon ?
si tu ne souhaite pas répondre à mon problème abstient toi alors.
Tu es resté 1 journée sans réponse, j'ai voulu t'aider tu ne peux pas le nier.
Si seulement on savait à l'avance à qui on a à faire...
Je ne le ferai plus, rassure-toi.
eric
La raison pour laquelle 3 colonnes apparaissent sur les fichiers est que pour le moment les autres colonnes ne m'interressent pas. Elles me renvoient des 0 ce qui est normal!
Je m'interesse pour le moment aux 2 premières colonnes, si j'arrive à résoudre le problème (que jai expliqué moult fois) je n'aurai pas de soucis pour la suite du programme.
Enfin, merci d'avoir répondu meme si cela ne correspondait pas à ce que je cherchais.