[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 SubMais ç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 SubHello 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").FormulaJ'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 SubJe 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 = formuleJe 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 SubVoilà j'espère que ça pourra en aider certains ;)
Bonne journée à tous !