VBA : convertir code enregistrant "formula array" dans cellule

Résolu/Fermé
Arkana0 Messages postés 4399 Date d'inscription mercredi 11 février 2009 Statut Modérateur Dernière intervention 10 février 2023 - Modifié par Arkana0 le 4/03/2016 à 18:15
Arkana0 Messages postés 4399 Date d'inscription mercredi 11 février 2009 Statut Modérateur Dernière intervention 10 février 2023 - 7 mars 2016 à 09:13
Bonjour,

J'ai un morceau de code VBA qui me pose problème :
Cells(ActiveCell.Row, ActiveCell.Column + 1).FormulaArray = "=CONCATENATE(""U"",MIN(IF('Export brut anomalies'!C[-13]=RC[-22],INT(RIGHT('Export brut anomalies'!C[-1],1)),"""")))"

Afin de vous aider à comprendre, voici ce que ça peut afficher dans une cellule excel :
{=CONCATENER("U";MIN(SI('Export brut anomalies'!J:J=A17;ENT(DROITE('Export brut anomalies'!V:V;1));"")))}

Je l'ai obtenu en enregistrant l'exécution d'une formule matricielle. Le soucis est que j'obtiens des formules beaucoup trop lourdes pour leur utilité.
Je voudrais à la place que le code VBA exécute une fonction équivalente à celle décrit et inscrive le résultat dans la cellule.

Pour info, cette formule regarde une référence donnée sur la ligne, puis va chercher dans une autre feuille l'urgence maximum sur tous les travaux renseignés pour cette même référence..

Je vous remercie d'avance pour votre aide !

1 réponse

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
5 mars 2016 à 09:54
Bonjour

Beaucoup de choses difficiles à comprendre dans ta demande:
Tu construis un tableau avec les lignes où il y a la valeur de A17 colonne J dans la feuille "export brut..."
alors pourquoi demander l'urgence maximum ?
de plus est ce min ou max ?

pour
ENT(DROITE('Export brut anomalies'!V:V;1));"")))
pourquoi "ENT" puisque tu extrait le dernier caractère de la donnée en colonne V:droite(.......,1)

le code ici est pour le principe et fait à l'aveugle, donc...

Option Explicit
'{=CONCATENER("U";MIN(SI('Export brut anomalies'!J:J=A17;ENT(DROITE('Export brut anomalies'!V:V;1));"")))}
Sub cccc()
Dim Ref, Nbre As Integer, T_out, Lig As Integer, Cptr As Integer

Application ScreenUpdating = False
Ref = ActiveSheet.Range("A17")
With Sheets("Export brut anomalies")
Nbre = Application.CountIf(.Columns("J"), Ref)
If Ref = 0 Then GoTo vide
ReDim T_out(1 To Nbre)
Lig = Cells.Rows.Count
For Cptr = 1 To Nbre
Lig = .Columns("J").Find(Ref, .Cells(Lig, "J"), xlValues).Row
T_out(Cptr) = "U" & Right(.Cells(Lig, "V"), 1)
Next
End With

With ActiveSheet.ActiveCell
.Offset(0, 1).Resize(Nbre, 1) = Application.Transpose(T_out)
End With
Exit Sub
vide:
MsgBox Ref & "inconnu dans la feuille Export brut anomalies", vbCritical
End Sub

1
Arkana0 Messages postés 4399 Date d'inscription mercredi 11 février 2009 Statut Modérateur Dernière intervention 10 février 2023 181
7 mars 2016 à 09:13
Bonjour et merci pour ta réponse,

En fait je cherchais plus quelque chose qui soit à ma formule ce que le [...].Value = SumIf est au [...].FormulaLocal = "=SOMME.SI. Mais à défaut je vais m'inspirer de ce code.

Pour les explications demandées :

- J'ai pris une ligne en exemple, il y en a plusieurs (nombre indéterminé pour chaque fois) qui fonctionnent sur le même principe.
- Il y a trois niveau d'urgence : U0, U1 et U2, le système est dégressif : la U0 est l'urgence maximum.
- J'ai mis le ENT() car je pioche mon chiffre dans un texte.
0