[VBA] Formule Matricielle

Bonjour tout le monde,

J'espère que vous allez bien,

J'aimerais réussir à faire un code VBA qui viendrait mettre de manière automatique une formule matricielle dans toute ma colonne. Pour cela j'ai fait un code dans ce style :

Sub creationformule_Nomdescriptifbois()

Sheets("Nom descriptif BOIS").Activate
Application.ScreenUpdating = False

Range("F2:H1000").ClearContents
Range("B2:B1000").FormulaArray = "=SIERREUR(INDEX('Modele'!$A$2:$A$1000;PETITE.VALEUR(SI(FREQUENCE(SI('Modele'!$C$2:$C$1000<>"""";EQUIV('Modele'!$A$2:$A$1000&"" ""&'Modele'!$B$2:$B$1000&"" ""&'Modele'!$D$2:$D$1000&"" ""&'Modele'!$E$2:$E$1000;'Modele'!$A$2:$A$1000&"" ""&'Modele'!$B$2:$B$1000&"" ""&'Modele'!$D$2:$D$1000&"" ""&'Modele'!$E$2:$E$1000;0));LIGNE('Modele'!$A$2:$A$1000)-LIGNE('Modele'!$A$2)+1);LIGNE('Modele'!$A$2:$A$1000)-LIGNE('Modele'!$A$2)+1);LIGNES(B$2:B2)));"""")"

End Sub

Mais ça ne fonctionne pas ... Je ne sais pas vraiment où est le problème est-ce parce que ma formule est en français ? Est-ce à cause des guillemets je suis totalement à la ramasse ..

Merci d'avance à vous :)

bonjour,

fomulaarray nécessite des formules en anglais

tu peux cependant y arriver en 2 étapes (je pense que cela devrait le faire) non testé, si ça plante sur la première instruction range, il doit y avoir une faute dans la formule.

Range("B2").Formulalocal = "=SIERREUR(INDEX('Modele'!$A$2:$A$1000;PETITE.VALEUR(SI(FREQUENCE(SI('Modele'!$C$2:$C$1000<>"""";EQUIV('Modele'!$A$2:$A$1000&"" ""&'Modele'!$B$2:$B$1000&"" ""&'Modele'!$D$2:$D$1000&"" ""&'Modele'!$E$2:$E$1000;'Modele'!$A$2:$A$1000&"" ""&'Modele'!$B$2:$B$1000&"" ""&'Modele'!$D$2:$D$1000&"" ""&'Modele'!$E$2:$E$1000;0));LIGNE('Modele'!$A$2:$A$1000)-LIGNE('Modele'!$A$2)+1);LIGNE('Modele'!$A$2:$A$1000)-LIGNE('Modele'!$A$2)+1);LIGNES(B$2:B2)));"""")"
Range("B2:B1000").FormulaArray = Range("B2").Formulalocal 

End Sub

Hello h2so4,

Merci pour ta réponse, je viens d'essayer, ça casse au niveau de la deuxième partie :

Range("B2:B1000").FormulaArray = Range("B2").Formulalocal 

Il me dit "Impossible de définir la propriété FormulaArray de la classe Range".

Merci à toi :)

je me suis planté sur la 2ème instruction, cela devrait être formula tout court au lieu de formulalocal

Range("B2:B1000").FormulaArray = Range("B2").Formula

J'ai toujours le même soucis je me demande si le problème ne viendrait pas du fait que ma formule est trop grande ? :/

J'essaye de faire des replace mais toujours et encore le même problème ... Je désespère ...

Sub creationformule_Nomdescriptifbois()
Dim FormulePart1 As String
Dim FormulePart2 As String
Dim FormulePart3 As String

Sheets("Nom descriptif BOIS").Activate
Application.ScreenUpdating = False

FormulePart1 = "=IFERROR(INDEX(Modele!$A$2:$A$1000,SMALL(IF(FREQUENCY(IF(Modele!$C$2:$C$1000<>""""," & _
                "X_X_X()," & _
                "Y_Y_Y()"
FormulePart2 = "MATCH((Modele!$A$2:$A$1000&"" ""&Modele!$B$2:$B$1000&"" ""&Modele!$D$2:$D$1000&"" ""&Modele!$E$2:$E$900," & _
                "Modele!$A$2:$A$1000&"" ""&Modele!$B$2:$B$1000&"" ""&Modele!$D$2:$D$1000&"" ""&Modele!$E$2:$E$1000,0))"

FormulePart3 = "ROW(Modele!$A$2:$A$1000)-ROW(Modele!$A$2)+1),ROW(Modele!$A$2:$A$1000)-ROW(Modele!$A$2)+1),ROWS(B$2:B2))),"""")"

Range("A2:A1000").Formula = "=IF(B2<>"""",Generalites!$B$2,"""")"
With Range("B2:B1000")
.FormulaArray = FormulePart1
.Replace "X_X_X()", FormulePart2
.Replace "Y_Y_Y()", FormulePart3

End With

End Sub

Je suis pas sûr de le faire correctement mais toujours le même problème ça casse sur la partie FormulaArray qui me dit un problème 1004 de range ..

bonjour,

il y a effectivement une limite à 255 caractères pour la propriété formulaarray.

voici une solution qui fonctionne chez moi

Range("B2").FormulaLocal = "'=SIERREUR(INDEX('Modele'!$A$2:$A$1000;PETITE.VALEUR(SI(FREQUENCE(SI('Modele'!$C$2:$C$1000<>"""";EQUIV('Modele'!$A$2:$A$1000&"" ""&'Modele'!$B$2:$B$1000&"" ""&'Modele'!$D$2:$D$1000&"" ""&'Modele'!$E$2:$E$1000;'Modele'!$A$2:$A$1000&"" ""&'Modele'!$B$2:$B$1000&"" ""&'Modele'!$D$2:$D$1000&"" ""&'Modele'!$E$2:$E$1000;0));LIGNE('Modele'!$A$2:$A$1000)-LIGNE('Modele'!$A$2)+1);LIGNE('Modele'!$A$2:$A$1000)-LIGNE('Modele'!$A$2)+1);LIGNES(B$2:B2)));"""")"
formule = Range("B2").Formula
formule = Replace(formule, "Modele!$A$2:$A$1000", "moda")
formule = Replace(formule, "Modele!$B$2:$B$1000", "modb")
formule = Replace(formule, "Modele!$C$2:$C$1000", "modc")
formule = Replace(formule, "Modele!$D$2:$D$1000", "modd")
formule = Replace(formule, "Modele!$E$2:$E$1000", "mode")
ActiveWorkbook.Names.Add Name:="moda", RefersToR1C1:="=modele!R2C1:R1000C1"
ActiveWorkbook.Names.Add Name:="modb", RefersToR1C1:="=modele!R2C2:R1000C2"
ActiveWorkbook.Names.Add Name:="modc", RefersToR1C1:="=modele!R2C3:R1000C3"
ActiveWorkbook.Names.Add Name:="modd", RefersToR1C1:="=modele!R2C4:R1000C4"
ActiveWorkbook.Names.Add Name:="mode", RefersToR1C1:="=modele!R2C5:R1000C5"
Range("b2").FormulaArray = formule
Range("b2").Copy Range("B3:B1000")

Bonjour h2so4,

Désolé du retard pour cette réponse, je viens d'essayer celle-ci mais j'ai encore une erreur sur le

Range("B2").FormulaArray = formule

Je ne sais pas pourquoi si ça fonctionne de ton côté :/

Bonjour tout le monde,

Pour ceux qui sont dans le même cas que moi, j'ai enfin trouvé la solution :

Sub FormuleAIntegrer()
Application.ScreenUpdating = False
With Sheets("Modele BOIS")
    .[A2:A1000].Name = "CA"
    .[B2:B1000].Name = "CB"
    .[C2:C1000].Name = "CC"
    .[D2:D1000].Name = "CD"
    .[E2:E1000].Name = "CE"
    .[A2].Name = "MoA"
End With
With Sheets("Nom descriptif BOIS")
    .[B2].FormulaArray = "=IFERROR(INDEX(CA,SMALL(IF(FREQUENCY(IF(CC<>"""",MATCH(CA&"" ""&CB&"" ""&CD&"" ""&CE,CA&"" ""&CB&"" ""&CD&"" ""&CE,0)),ROW(CA)-ROW(MoA)+1),ROW(CA)-ROW(MoA)+1),ROWS(B$2:B2))),"""")"
    .[B2].Copy .[B3:B1000]
    .[A2].Formula = "=IF(B2<>"""",Generalites!$B$2,"""")"
    .[A2].Copy .[A3:A1000]
End With
Application.ScreenUpdating = True
End Sub

Voilà j'espère que ça pourra en aider certains ;)

Bonne journée à tous !

Rechercher des sujets similaires à "vba formule matricielle"