2 votes

Ajouter un blanc avec FilterXML

J'ai reformulé cette question car je n'ai pas eu de réponse à la première... peut-être était-ce un peu long.

Mes données originales sont ci-dessous.
Remarque - il ne s'agit que de données de test, dans mon fichier, il s'agit d'une plage déversée créée à partir d'une formule (cf. Formule pour créer un produit cartésien à partir de deux ensembles de données dans une plage déversée pour cette formule)

Date

Texte

29/08/2021

A

29/08/2021

B

29/08/2021

C

30/08/2021

A

30/08/2021

B

30/08/2021

C

J'ajoute des balises XML aux données à l'aide de cette formule (remarque : la balise !null! c'est là que se situe mon problème) :
Date : ="<a>" & IF($B$4:$B$9=OFFSET($B$4:$B$9,-1,0),"!null!",$B$4:$B$9) & "</a>"
Texte : ="<b>" & $D$4:$D$9 & "</b>"

enter image description here

Et puis FILTERXML pour transformer les résultats en une plage de déversement à deux colonnes.

=LET(xml,"<y><x>" & TEXTJOIN("",FALSE,D3#,E3#) & "</x></y>",
     x,"//x/a",
     y,"//x/b",
     CHOOSE({1,2},FILTERXML(xml,x),FILTERXML(xml,y)))  

enter image description here

Comment puis-je changer le !null! des marqueurs de place pour les cellules vides réelles ?
"" , "&#0;" , "<a></a>" et tout ce que j'ai essayé retourne #VALUE! erreurs.

Réponse :

La réponse donnée par @HasanNahiyanNobel m'a donné l'idée d'utiliser SUBSTITUTE . Par lui-même, il fait apparaître les dates sous leur valeur numérique et le formatage des cellules n'y change rien. Utilisation de TEXT le formatage autour du FILTERXML qui fournit les dates a réglé ce problème.

Ma formule finale est la suivante :

=LET(xml,"<y><x>" & TEXTJOIN("",FALSE,Z4#,AA4#) & "</x></y>",
           x,"//x/a",
           y,"//x/b",
           CHOOSE({1,2},TEXT(SUBSTITUTE(FILTERXML(xml,x),"!null!",""),"dd-mmm"),FILTERXML(xml,y)))

2voto

Si votre jeu de données n'est pas まったくもって de grande taille, vous pouvez simplement utiliser une condition si dans G3 comme ça :

=IF(LET(xml,"<y><x>" & TEXTJOIN("",FALSE,D3#,E3#) & "</x></y>",
        x,"//x/a",
        y,"//x/b",
        CHOOSE({1,2},FILTERXML(xml,x),FILTERXML(xml,y)))="!null!",
    "",
    LET(xml,"<y><x>" & TEXTJOIN("",FALSE,D3#,E3#) & "</x></y>",
        x,"//x/a",
        y,"//x/b",
        CHOOSE({1,2},FILTERXML(xml,x),FILTERXML(xml,y)))
)

Cependant, cela doit passer par le même LET fonction deux fois. Si vous voulez éviter cela, vous pouvez utiliser les colonnes I y J où :

Cellule

Fonction

I3

=IF(G3:G8="!null!", "", G3:G8)

J3

=H3:H8

S'il est possible que vous recueilliez d'autres données, disons quelques centaines de plus, alors utilisez :

Cellule

Fonction

I3

=IFS(G3:G1000="!null!", "", G3:G1000="", "", TRUE, G3:G1000)

J3

=IF(H3:H1000="", "", H3:H1000)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X