Transformer des colonnes et leurs contenus d'un tableau

Bonjour,

Est-ce possible de transformer dans un tableau des valeurs comme 1 ou -1 en X par exemple. Exemple de tableau:

NXNYNZ
100
0-10
10-1
011

et cela nous donnerais :

Axe
X
Y
XZ
YZ

Je vous met le document en pièce jointe si besoin.

Bonjour,

Oui c'est possible, voir la formule dans la colonne "Formule"

Formule ligne 10:

=CONCAT(SI(E10:G10<>0;{"X"\"Y"\"Z"};""))

Bonjour à tous !

Pour le "fun", une proposition type "formule unique et dynamique" en K10 :

=BYROW(E10:G308;LAMBDA(x;UNICAR(119+EQUIVX(1;ABS(x);0))))

Bonjour,

Merci pour vos réponses rapides et claire, juste un petit problème. Comment puis-je écrire le code en VBA sans avoir un message d'erreur à cause des guillemets ? Utiliser les & ? Mais si je fais cela alors je n'aurais plus un "X" qui apparaîtra mais un "& X &" .

Sinon il y a la formule de JFL qui n'a pas de guillemets mais je reçois un message d'erreur "erreur définie par l'application ou par l'objet" en l'écrivant comme ceci :

classeurSources2.ActiveSheet.Range("C9").FormulaR1C1 = _ "=BYROW(J9:L367;LAMBDA(x;UNICAR(119+EQUIVX(1;ABS(x);0))))"

Une idée ?

J'ai résolu la deuxième partie de mon message précédent. Ce code-ci fonctionne dans le code VBA (c'est Excel qui me l'a donné en enregistrant une macro avec la formule manuellement) :

"=BYROW(RC[7]:R[358]C[9],LAMBDA(x,UNICHAR(119+XMATCH(1,ABS(x),0))))"

Cependant je reste curieux, existe-t-il une solution pour les guillemets ?

Bonjour à tous de nouveau !

Pour ma part, VBA est hors de mon champ d'appétence depuis quelques décennies....Alors je vais laisser les gourmands prendre la main.

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

Merci beaucoup pour la réponse. Je souhaiterais utiliser la fonction Call pour aller chercher ce Sub testVBA mais j'ai run problème. Si j'ai des variables que j'ai défini dans le programme principale et que j'utilise comme suivant :

Dim classeurSources1 As Workbook
Set classeurSources1 = Workbooks.Open("C:\Users\534\Downloads\Essais")

Est-ce que je dois réécrire ces lignes dans le sous programme testVBA ou bien juste en les mettant dans le main il va faire le rapprochement (c'est dans le document classeurSources que je souhaite faire la transformation du Sub testVBA) ?.

Bonjour,

Ce que l'on peut faire c'est passer la feuille à transformer au programme que j'ai écris.

Option Base 1

Sub testVBA(Feuille As Worksheet)
Dim ligFin As Long
Dim ligDep As Integer
Dim textes
Dim tableau As Variant, resultat As Variant
Dim colDep As String, colResultat As String

With Feuille
    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 With
End Sub

Et on peut l'appeler comme ça:

Sub monProgramme()
Dim classeurSources1 As Workbook
Set classeurSources1 = Workbooks.Open("C:\Users\534\Downloads\Essais")
testVBA classeurSources1.Sheets("Feuil1") 'ou Call testVBA(classeurSources1.Sheets("Feuil1"))
End Sub

Je préfère préciser la feuille directement pour éviter les erreurs dans un fichier qui aurait plusieurs feuilles.

Super, merci beaucoup pour la réponse et bon weekend

Bonjour à tous,

[EDIT] Ca ne fonctionne pas. Ne pas tenir compte.

Pour ta question restée sans réponse (sauf erreur) :

ActiveSheet.Range("C9").Formula = _
"=BYROW(J9:L367,LAMBDA(x,UNIChAR(119+XMATCH(1,ABS(x),0))))"

Daniel

Rechercher des sujets similaires à "transformer colonnes leurs contenus tableau"