Regrouper deux feuilles en une seule

Bonjour,

Je travaille sur un fichier me permettant de gérer les réservations de salle et de matériel sur ma commune.

Afin de poser ma question, j'ai créé un fichier exemple. Il est bien plus simple que celui que j'utilise (beaucoup moins de colonnes et de lignes).

Je mets le lien ici : https://docs.google.com/spreadsheets/d/151MGYtwAtf5wiw6HuXCBEmomBD6n4DVUqLFMYzIcACE/edit?usp=sharing

A la base je pars de deux formulaires différents. Je suis obligée d'utiliser deux formulaires, le premier est complété par les utilisateurs directement, le second est rempli par mes soins en fonction des informations du premier formulaire, après appel téléphonique aux utilisateurs. Il y a des données qu'ils ne connaissent pas et donc des questions pour lesquelles ils n'auraient pas la réponse. Il y en a d'autres pour lesquelles ils n'ont pas obligatoirement l'information au moment de la réservation (nombre de tables, de chaises).

J'avais vu précédemment dans une autre question posée en ligne, qu'il n'était pas possible de rappatrier directement les données de deux formulaires dans le même document, ça fait des bugs... Du coup, j'ai deux sheets qui récupérent les données. Je reprends ces données dans mon document de travail à partir de deux fonctions IMPORTRANGE qui devraient normalement se trouver dans les cellules A1 des feuilles Import1 et Import2 (pour simplifier, je ne suis pas passée par cette étape dans mon document test).

Afin de pouvoir gérer les données, j'ai créé un ID qui est unique pour chaque réservation et j'utilise le même ID quand je complète mon deuxième formulaire afin de faire le lien entre eux. Les deux formulaires ne sont pas obligatoirement remplits dans le même ordre.

Je veux donc maintenant regrouper mes données en fonction de l'ID dans une seule et unique feuille (dans mon document c'est la feuille BDD Total).

Dans la cellule A1, j'utilise la fonction QUERY pour rappatrier les information de ma feuille Import1, j'ai modifié l'ordre des colonnes et je fais un tri en fonction de la date de début.

A partir de la colonne G, j'utilise la fonction IFERROR(VLOOKUP afin de récupérer les données de la feuille Import2.

J'ai donc autant de formules que de colonnes à rappatrier et que de lignes existantes.

De plus, pour ne pas à avoir à rajouter une ligne avec les calculs à chaque fois qu'une nouvelle réservation est faite, je suis obligée de mettre plus de lignes de calculs que de lignes réellement utilisées. Ici j'utilise 9 lignes mais j'ai des formules jusqu'à la ligne 50.

Ca fait un nombre de cellules qui peut rapidement être important. Dans mon exemple ça en fait 196. Dans mon fichier de travail, j'ai à l'heure actuelle environ 220 lignes qui ne fera qu'augmenter (je mets les formules sur 300 lignes ) et je rapatries les informations d'une vingtaine de colonnes soit des formules sur environ 6000 cellules

De plus, cela me pose également un autre problème dans le tri. Si je demande à trier les dates en ASC, toutes les lignes vides se retrouvent en haut du tableau, logique, il n'y a pas de date. Il n'y a que le cas où je fais un tri en DESC où les résultats se trouvent en haut du tableau, mais ce n'est pas le tri que je souhaite utliser.

Je sais regrouper deux feuilles identiques l'une en dessous de l'autre gràce à la fonction SORT mais je ne sais pas les regrouper côte à côte par rapport à un ID, sans passer par ces multiples fonctions.

Peut-être est-il possible de créer cette page directement sans passer par les IMPORTRANGE des deux feuilles Import1 et Import2 en rappatriant directement les données de mes deux fichiers créés à partir des formulaire dans ma feuille BDD Total.

Connaissez-vos une solution pour répondre à mon besoin ?

Merci de m'avoir lu

Coloc

Bonjour,

Tu peux utiliser cette formule pour avoir un tri ASC:

=QUERY(Plimport1;"Select * where C is not null ORDER BY C ASC")


Et mettre ça en G2:


=query(MAP(UNIQUE(A2:A);LAMBDA(n;{n\(SIERREUR(QUERY(Plimport2;"Select D,E,B,C where A matches '"&n&"'";0);""))}));"select Col2,Col3,Col4,Col5")

Cordialement,

Fil.

Bonjour Fil,

Impecable, ça fait exactement ce que je voulais sans avoir une multitude de formules. Pourle tri, idem.

Merci bien. Une nouvelle formule a mettre dans mes connaissances de Sheet

Coloc

Bonjour Coloc,

Tu peux également utiliser une seule formule:

=byrow(unique(QUERY(Plimport1;"Select * where C is not null ORDER BY C ASC"));LAMBDA(n;{n\(SIERREUR(QUERY(Plimport2;"Select D,E,B,C where A matches '"&n&"'";0);""))}))

Bon week-end,

Fil.

Bonjour Filoche,

Je rouvre la question car du coup j'ai une nouvelle question dans la continuité de la première.

J'ai modifié mon fichier en lien dans la première question en conséquence de cette nouvelle question.

J'ai réussi à regrouper mes deux documents en utlisant les deux formules. Je vais essayer avec une seule comme tu viens de l'expliquer mais ça ne change rien pour ma question.

Après mes colonnes d'importations, j'ai un certain nombre de colonnes de calcul qui se remplissent en fonction des données des colonnes précédentes.

Dans mon exemple, Dans la feulle BDD Total j'ai rajouté une colonne K "Titre". Pour faire simple ici, j'ai fait un regroupement des colonnes B, C et F avec des & et du texte mais dans mon tableau de travail les formules peuvent être bien plus complexes.

Comme pour le cas précédent, afin que les calculs se fassent pour toutes les lignes, dont les nouvelles, je mets ces formules sur un nombre de lignes plus important que les lignes réellement utilisées.

Je mets en début de formule IF(Ax="";"";ma formule). Ainsi, lorsqu'il n'y a rien dans ma ligne, je ne mets rien dans la cellule, sinon ici j'aurai () -

Y a-t'il un moyen pour simplifier tout cela car de nouveaux, j'ai beaucoup de colonnes de calcul multiplié par 300 lignes.

Merci

Coloc

Autres questions.

J'ai donc utilisé ta formule unique pour regrouper mes deux imports mais du coup, je n'ai pas les libellé de titre en hauts pour les colonnes correspondant à mont import 2. J'ai tenté de mettre rajouter LABEL dans la formule mais ça fait tout bugger. Je ne sais pas si on peut le faire où si je l'ai mis au mauvais endroit ou encore si j'ai oublié quelque chose.

Voici mes tests

Celui qui me paraissait le plus logique (il me met des REF# dans certaines cellules sur toutes les lignes qui ont des informations pour les deux imports et ne met que les informations de l'import 1 lorsqu'il n'y a rien dans l'import 2 et me met 'EdL début' dans la cellule de l'import 2)

=byrow(unique(QUERY(Plimport1;"Select * where C is not null ORDER BY C ASC"));LAMBDA(n;{n\(SIERREUR(QUERY(Plimport2;"Select D,E,B,C where A matches '"&n&"'LABEL D'Edl début'";0);""))}))

ou

Celui où on "sait jamais des fois que ça marche" (il ne met aucune information pour le deuxième import)

=byrow(unique(QUERY(Plimport1;"Select * where C is not null ORDER BY C ASC"));LAMBDA(n;{n\(SIERREUR(QUERY(Plimport2;"Select D,E,B,C where A matches LABEL D'Edl début''"&n&"'";0);""))}))
ou encore
=byrow(unique(QUERY(Plimport1;"Select * where C is not null ORDER BY C ASC"));LAMBDA(n;{n\(SIERREUR(QUERY(Plimport2;"Select D,E,B,C LABEL D'Edl début'where A matches '"&n&"'";0);""))}))

Coloc

Bonjour Coloc,

Mince, du coup il manque une partie des en-têtes...

Si tu utilises la formule unique, il faut mettre manuellement les en-têtes et utiliser cette formule:

=byrow(unique(QUERY(Plimport1;"Select * where C is not null ORDER BY C ASC";0));LAMBDA(n;{n\(SIERREUR(QUERY(Plimport2;"Select D,E,B,C where A matches '"&n&"'";0);""))}))

Cordialement,

Fil.

Bonsoir Filoche,

J'ai vérifié, je ne peux pas mettre manuellement les en-têtes puisqu'il ne faut rien inscrire dans toute la zone qui est complété par la formule. Ce n'est pas grave, c'est un détail, en cas je mets deux formules, ça fonctionne très bien.

Par contre, j'avais posé une autre question à 12h28 avant celle des titres. Partie sur ma lancé, j'ai posé deux questions à la suite, avant d'avoir la réponse à la première. C'est pas bien....

Je pense que tu ne l'as pas vu. Ca concerne le rajout de colonnes avec des formules de calculs.

Je te laisse regarder.

Merci

Coloc

Bonjour Coloc,

=byrow(unique(QUERY(Plimport1;"Select * where C is not null ORDER BY C ASC";0));LAMBDA(n;{n\(SIERREUR(QUERY(Plimport2;"Select D,E,B,C where A matches '"&n&"'";0);""))}))

Ce n'est pas exactement la même formule, celle-ci ne met aucune en-tête, donc tu mets manuellement les en-têtes de Plimport1 et Plimport2 et la formule en dessous.

Pour répondre à ta question, si j'ai bien compris tu souhaites mettre des formules dans des colonnes sans avoir à copier vers le bas jusqu'à la ligne 300???

Pour cela, il faut utiliser selon les cas, ARRAYFORMULA, BYROW + LAMBDA ou QUERY.

En exemple:

=arrayformula(SI(B1:B300="";"";B1:B300))

Cordialement,

Fil.

Bonjour Fil

Je viens de faire des essais avec Arrayformula que je ne connaissais pas et c'est exactement ce dont j'ai besoin.

Je vais étudier tes autres propositions.

Je te remercie pour le coup de main, je viens de supprimer plus de 10000 formules et je n'ai pas fini.

Je pense qu'avec tout ça mon document va fonctionner beaucoup plus rapidement.

Coloc

Bonjour Coloc,

Finalement, j'ai trouvé une solution pour avoir une seule formule et toutes les en-têtes:

=vstack(transpose({flatten({'Import 1'!A1:F1});flatten({query(Import2!A1:E1;"select D,E,B,C")})});byrow(unique(QUERY(Plimport1;"Select * where C is not null ORDER BY C ASC";0));LAMBDA(n;{n\(SIERREUR(QUERY(Plimport2;"Select D,E,B,C where A matches '"&N&"'";0);""))})))

Cordialement,

Fil.

Rechercher des sujets similaires à "regrouper deux feuilles seule"