Bonsoir,
Visiblement avec la formule que j'ai proposé, il faut passer par autre chose en VBA...
Range("A10").FormulaArray = "=CONCAT(IF(E10:G10<>0,{""X"",""Y"",""Z""},""""))"
Par exemple si on veut écrire pour A10 ça donne FormulaArray parce qu'on a une formule "matricielle" (le SI renvoie un tableau). Dans les anciennes versions d'Excel on était obligé de valider la formule avec le raccourci Maj + Ctrl + Entrée. Et VBA est vieux aussi, donc il faut passer par ça aussi... (J'ai essayé formulaLocal en utilisant "{=CONCAT(SI(E10:G10<>0,{""X"",""Y"",""Z""},""""))}" mais ça ne marche pas, ça écrit bien ça dans la barre de formule mais ne calcule rien).
Pour les guillemets dans la formule, il faut les doubler pour qu'elles soient bien prises en compte.
Si on veut faire une boucle sur par exemple les 10 premières lignes pour affecter la formule, on peut écrire:
Sub test()
Dim lig As Integer
For lig = 1 To 10
Range("A" & lig).FormulaArray = "=CONCAT(IF(E" & lig & ":G" & lig & "<>0,{""X"",""Y"",""Z""},""""))"
Next lig
End Sub
Mais entre nous, si on veut passer par du VBA je pense que c'est presque plus rapide de directement calculer nous même le résultat.
Le code peut s'écrire:
Option Base 1
Sub testVBA()
Dim ligFin As Long
Dim ligDep As Integer
Dim textes
Dim tableau As Variant, resultat As Variant
Dim colDep As String, colResultat As String
ligDep = 10
ligFin = Range("A" & Rows.Count).End(xlUp).Row
colDep = "E"
colResultat = "L"
textes = Array("X", "Y", "Z")
tableau = Range(Range(colDep & ligDep), Range(colDep & ligFin).Offset(0, 2)).Value
ReDim resultat(1 To UBound(tableau, 1), 1 To 1)
For i = 1 To UBound(tableau, 1)
For j = 1 To 3
If tableau(i, j) = -1 Or tableau(i, j) = 1 Then
resultat(i, 1) = resultat(i, 1) & textes(j)
End If
Next j
Next i
Range(Range(colResultat & ligDep), Range(colResultat & ligFin)).Value = resultat
End Sub