Formule matricielle en code VBA

Bonjour,

De la même manière que l’on peut écrire une formule ainsi

Variable_X = WorksheetFunction.CountIf(Range("A4:A10"), "")

est-il possible d’écrire une formule matricielle en code VBA ?

Mais attention, je ne parle pas d’écrire la formule elle-même dans la cellule par la ligne

Range("G3").FormulaArray = "=SQRT(MMULT(MMULT(TRANSPOSE(R[-1]C[-3]:R[3]C[-3]),R[-1]C[2]:R[3]C[6]),R[-1]C[-3]:R[3]C[-3]))"

tel que le fait la macro dans le fichier ci-joint, mais bien de n’avoir comme inscription finale que le résultat du calcul dans la cellule.

A vous relire.

434student-v2.xlsm (16.89 Ko)

Bonjour,

Sub galopin()
Dim x
x = Evaluate([SQRT(MMULT(MMULT(TRANSPOSE(D2:D6),I2:M6),D2:D6))])
Range("G3") = x
End Sub

A+

Salut Galopin,

Merci pour ton intervention Mais en fait, ton code place également une formule dans la cellule et non pas un résultat. Selon des recherche sur Internet, il semble que ce que je désire n'existe effectivement pas ??

Comme j'avais posé cette question dans l'espoir d'aider Student sur un autre fil - mais qu'il semble que je ne vais pas y arriver - je te laisse éventuellement aller jeter un coup d'œil à son fil https://forum.excel-pratique.com/excel/produit-matriciel-t38244.html

Cordialement.

Bonjour,

Je ne sais pas ou tu vois une formule la dedans :

Range("G3") = x

sansformule

As-tu essayé ?

A+

Je suis absolument désolé, j'ai fait une grosse erreur dans mes essais (j'ai copié le bouton en place et j'ai oublié d'y affecter ta macro Un peu perturbé par mes essais d'hier, j'ai complétement zappé que le résultat obtenu ce matin n'était pas logique.

Alors oui, ta réponse répond parfaitement à mon attente et je te remercie infiniment pour ton aide

Bonne journée.

Super Galopin !

Maintenant, y a t'il moyen de remplacer le D6 et le M6 par un code qui adapte automatiquement la grandeur des matrices par rapport au nombre de données?

Par exemple, si j'ai 10 valeurs en D (jusqu'à D11), il faut que la plage sélectionne automatiquement jusqu'à D11. De même pour la matrice carrée du milieu (s'il y a 10 valeur pour la matrice 1, il y en aura 10 sur l'axe des x et 10 sur y)!

Ca serait parfais !

Merci en tout cas à vous 2 !!

Student

Salut Student,

Je pensais que tu reviendrais sur ton autre fil Je crois que j'ai enfin compris ce que tu désires. Regarde le code placé dans le fichier ci-joint. Si tu ajoutes par exemple des données sur la ligne 7 - en donc si je t'ai bien compris dans la colonne N également - la formule suit.

Sub aa()
Dim i As Integer
i = Range("D" & Rows.Count).End(xlUp).Row
Range("G3").FormulaArray = "=SQRT(MMULT(MMULT(TRANSPOSE(R2C4:R" & i & "C4),R2C9:R" & i & "C" & 7 + i & "),R2C4:R" & i & "C4))"
End Sub

Cordialement.

226student-v3.xlsm (18.78 Ko)

Merci Yvouille,

Ton code me donne un "valeur" :/

Tu as tout à fait compris ce que je désire mais est-il possible de le faire dans la formule de Galopin parce qu'on me demande que les formules n'apparaissent pas ... De plus, j'ai essayé d'adapter le code pour qu'il cherche la matrice du milieu sur la feuil4 à partir de B3 mais j'ai la valeur "nom" qui apparait :/

J'ai essayé qqch dans le VBA du classeur... J'ai mis la matrice carrée à sa place (feuille4)

Pour l'instant, j'ai fait ce code mais je ne comprends absolument pas pourquoi ca ne marche pas ...

Sub matrice()
Dim t

t = "D" & Application.WorksheetFunction.CountA(Feuil1.Range("$D:$D")) & ""

Range("G2") = Evaluate([SQRT(MMULT(MMULT(TRANSPOSE(D2:t),I2:M6),D2:t))])
Range("G4") = t

End Sub
120classeur1.xlsm (15.94 Ko)

Bonjour,

Je peux te dire pourquoi ça ne marche pas mais je n'ai pas de solution qui réponde à ta demande...

ça ne marche pas car tu es dans la manipulation de string or ma formule n'est pas un string et ne comporte pas de guillemets. Je m'étonne même parfois de retrouver des trucs comme ça...

Elle ne répondait spécifiquement qu'à la question posée : Remplacer une formule matricielle supposée connue par sa valeur calculée en VBA. ...Ce qui n'est déjà pas si mal !

On est déjà dans de la voltige macrostique pour mecs qui fûment le VBA à longueur de journée et j'ai vraiment du mal à concevoir qu'on puisse poser ce genre de question à un quelqu'un qui se définit comme un novice...

Es-tu sur d'avoir bien compris la question ?

La solution ne consiste-t-elle pas simplement de mettre le format personnalisée "" (sur la cellule qui contient la formule) et de protéger la feuille ? Ainsi la formule est invisible.

ça me parait plus probable.

A+

Oui mais c'est qu'avec la solution d'Yvouille, la sélection de cellule ne se faisait pas correctement ...

student a écrit :

Oui mais c'est qu'avec la solution d'Yvouille, la sélection de cellule ne se faisait pas correctement ...

Je n'ai plus tout compris à tes derniers soucis, mais si la seule chose que tu désires est d'avoir un chiffre à la place d'une formule en finale, tu places ce bout de code tout à la fin, juste avant End Sub :

Range("G3") = Range("G3")

Amicalement.

student a écrit :

Oui mais c'est qu'avec la solution d'Yvouille, la sélection de cellule ne se faisait pas correctement ...

Au lieu d'aller poser une nouvelle question sur un autre fil, tu aurais peut-être mieux fait d'indiquer ici ce qui ne jouait pas dans ma proposition. Je suis persuadé qu'on tient là un début de solution très intéressante.

Peux-tu placer plusieurs exemples de calculs à effectuer (avec plus ou moins de données de base) et indiquer également la formule que tu désirerais à chaque fois ?

Cordialement.

Oui,

J'ai beau regarder ta formule, les cellules sont justes mais quand je lance la macro, la sélection ne se fait pas correctement (prends de D1 à D2 au lieu de D2 à D6 ...)

Voici si joint un exemple avec 10 unités (sélection de D2 à D11, ...)

La sub matrice et une de mes inventions mais le seul hic est le F que je n'arrive pas à changer.

Cordialement

34classeur1.xlsm (20.01 Ko)

Salut,

Dans le fichier ci-joint, tu as trois situations différentes, sur les feuilles 1, 2 et 3 qui sont calculées avec la même macro. On s'approche du résultat désiré ?

On pourrait modifier le code de manière à ce qu’il se déclenche à chaque modification de la plage D2:D11 de la Feuil1, plutôt que de devoir réactualiser la formule par l’intermédiaire du bouton mis en place.

Cordialement.

169student-v4.xlsm (27.84 Ko)

OHHHHH écoute Yvouille, je te suis infiniment reconnaissant !!!!!!!

CA MARCHE EXACTEMENT COMME JE LE SOUHAITE !!!

Par contre un tout petit détail de rien du tout:

Lorsque je copie le code à la suite d'une procédure, j'ai le résultat "valeur" qui s'affiche. Par contre si je le copie dans un nouveau module et que je l'appelle par un bouton ça marche parfaitement... Alors j'ai pensé à mettre un call dans ma procédure mais à nouveau le "valeur". Je ne te mets pas le fichier Excel car j'ai 500ko de code, même moi jme perds

Par hasard as-tu une idée ?

Mais si tu ne sais pas de première abord, ne te casse pas la tête, tu te l'es déjà assez fait avec ces matrices !!

Merci encore infiniment !

Student

Re,

Chez moi j’ai le résultat #VALEUR qui s’affiche lorsque je supprime par exemple des données de la plage D2:D11 de la Feuil1 alors qu’il y a une formule avec des références plus élargies en place (mais bien entendu que ce n’est pas le cas si je rajoute des données à cette plage).

Ensuite, si je lance la macro une nouvelle fois – que ce soit par l’intermédiaire d’un code, comme je l’ai fait maintenant dans le fichier ci-joint ou directement – la nouvelle formule est (re)mise en place et le tour est joué.

Peut-être que tu devrais me fournir ton fichier réel par courriel. Si ça te dis, envoi-moi par message privé ton adresse électronique et je te fournis mon adresse en retour.

Cordialement.

118student-v5.xlsm (22.47 Ko)

Ah mais je suis vraiment bête.....

J'ai mis le code produitmat avant le code de génération de la colonne D .... Tellement fixé, que je n'ai pas vu l'essentiel ...

Tout marche à merveille !!!!

Je te remercie infiniment pour tout ce que tu as fait !!!

Student

Rechercher des sujets similaires à "formule matricielle code vba"