[Résolu]Recopier à la suite les cases non nulles d'une ligne

Discussions à propos du tableur Calc.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est uniquement dédiée au tableur Calc. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
s05b
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 12 août 2017 12:42

[Résolu]Recopier à la suite les cases non nulles d'une ligne

Message par s05b »

Bonjour,

J'aimerais trouver un moyen de faire - sans macro - la recopie de toutes les cases non nulles d'une ligne donnée vers un autre tableau où elles apparaîtraient à la suite et sans blanc.

Dans cet exemple, j'aimerais que le tableau "valeurs en vrac sur historique" placé dans l'onglet "B" soit utilisé pour insérer dans l'onglet "A" les valeurs du mois N sélectionné dans une case, ainsi que du mois N+1.
Comme indiqué dans la "Synthèse par mois en fonction de l'historique", j'aimerais trouver le moyen de les faire s'afficher à la suite, sans blanc et avec les valeurs MOIS, TITRE et VALEUR, quel que soit le nombre de valeurs effectivement présentes dans le mois.
CaptureOoo.JPG
Auriez-vous des pistes ?

Remerciements :wink:
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par s05b le 15 août 2017 17:04, modifié 1 fois.
Libre Office 6.2.8.2 sous Windows 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9254
Inscription : 28 août 2010 08:45

Re: Recopier à la suite les cases non nulles d'une ligne

Message par micmac »

Bonjour et beinvenue,

Pour faciliter la compréhension de votre problème par les personnes qui vont vous aider, plutôt qu'une copie d'écran, vous devriez joindre un exemple de fichier dépersonnalisé à votre prochain message.
Comment joindre un fichier
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
s05b
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 12 août 2017 12:42

Re: Recopier à la suite les cases non nulles d'une ligne

Message par s05b »

J'ajoute effectivement pour plus de clarté un fichier d'exemple :
ExempleOoo_RecopieCasesNonNulles.ods
Merci pour cette remarque :)
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office 6.2.8.2 sous Windows 10
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: Recopier à la suite les cases non nulles d'une ligne

Message par zeguedon »

Bonjour,

Si pour un même mois il y a plusieurs titre renseignés (exemple mois 3 Titre C et Titre F -- mois 4 Titre D et Titre F)
comment le tableau de synthèse doit-il afficher cela ?

Merci
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
s05b
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 12 août 2017 12:42

Re: Recopier à la suite les cases non nulles d'une ligne

Message par s05b »

Bonjour Zeguedon,

Merci pour les retours :)

Il me suffit que les éléments s'affichent à la suite (une ligne chacun), du moment qu'ils existent.
C'est pour ça que dans mon exemple, j'ai volontairement laissé un seul élément concernant MOIS 5 et deux concernant MOIS 6.

En fait, je vais me retrouver avec environ 20 TITRES possibles mais environ 2 ou 3 uniquement de remplis chaque mois.
Je n'aimerais donc pas alourdir inutilement le document avec des valeurs nulles.

Je reste dispo si besoin d'éclaircir un peu plus la demande :)
Libre Office 6.2.8.2 sous Windows 10
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: Recopier à la suite les cases non nulles d'une ligne

Message par zeguedon »

Bonjour,

Une solution à base de formules matricielles et de plages nommées.
Je me suis planté dans la lecture de l’énoncé, le tableau de synthèse affiche le mois sélectionné et le mois précédent au lieu du mois suivant. C'est corrigeable.

Pour les explications concernant l'adaptation à ton fichier réel, je reviendrai plus tard car je dois m'absenter encore une bonne parie de la journée. En attendant je te laisse décortiquer :lol:

Je me suis aussi permis la liberté de modifier les libellés des mois afin qu'ils soient des valeur numériques (plus facile à gérer que du texte).

et le fichier qui va avec :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par zeguedon le 13 août 2017 23:07, modifié 1 fois.
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
s05b
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 12 août 2017 12:42

Re: Recopier à la suite les cases non nulles d'une ligne

Message par s05b »

Merci beaucoup Zeguedon pour cette approche !

Je sentais bien le côté matrice mais la lecture de tes formules reste déjà bien compliqué pour en subodorer l'autoconstruction :D

Ok pour les 3 plages de données Titre, Données et Mois. Je n'ai pas encore ce réflexe.

Le renommage des mois en chiffres me va très bien ; cela peut également être très pratique à l'usage si je veux rappeler un mois d'une autre année dans l'historique...
Libre à moi également de rajouter une colonne pour les mois et laissant ce "numéro d'ordre".
Par contre, si j'ajoute cette colonne, il ne faudrait pas qu'elle soit dans la plage de données j'imagine ?

J'ai également vu ta case de choix insérée dans l'onglet B.
J'imagine que c'est celle-ci que je devrai déplacer dans l'onglet A pour coller à mon exemple initial ?

Pour la suite, je ne m'amuserai pas à essayer de modifier ta formule pour inverser la sélection de "mois N-1" en "mois N+1" car je pense faire plus de dégâts qu'autre chose :aie:
Mais laisser le fichier en historique pourra peut-être aider d'autres personnes par la suite car le cas semble effectivement plus classique :D
En tout cas, si tu arrives à m'en glisser deux mots de français pour essayer d'en comprendre le fonctionnement, c'est avec grand plaisir !

Au plaisir d'en rediscuter pour finaliser ton idée :super:
Libre Office 6.2.8.2 sous Windows 10
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: Recopier à la suite les cases non nulles d'une ligne

Message par zeguedon »

Au temps pour moi, je ne t'ai pas transmis le bon fichier.

Il faudrait que tu me donne les dimension de ton tableau final pour adapter les formules.

A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
s05b
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 12 août 2017 12:42

Re: Recopier à la suite les cases non nulles d'une ligne

Message par s05b »

Tu est sur la bonne piste, c'est génial ! :bravo:

Plutôt que de te donner mon fichier cible, je préfère bien comprendre comment modifier ton travail sans le casser.
(si besoin, je pourrai te donner le tableau, il n'y a rien de bien confidentiel... mais je préfère cette démarche)

Par exemple, sur mes essais ci-dessous :
ExempleOoo_RecopieCasesNonNulles_Mod2.ods
- j'ai vu que je pouvais ajouter des colonnes de Titre (onglet B) mais il semble que la zone de la matrice (onglet A) soit limitée.
En effet, lorsque je sélectionne les zones matricielles sur l'onglet A avec CTRL+/, je vois le surlignage des zones concernées.
Peut-être que la limitation rencontrée est liée à la plage A8:A13 de l'onglet A qui est plus courte de 2 cases des zones B8:B15 et C8:C15 ?
Dans ce cas, je ne sais pas comment agrandir la zone de la matrice A8:A13 sans message d'erreur "#NOM ?" (si je rallonge la zone de la colonne A) ou "Impossible de modifier uniquement une partie de la matrice." (si je rallonge la zone de la colonne B ou C).

D'ailleurs, saurais-tu m'expliquer pourquoi il y a cette différence de traitement dans les erreurs entre ces colonnes ?

- je vois que tu as devancé mon travail en créant la liste déroulante de choix sur l'onglet A en E3 (Merci !)
Pour bien maitriser le sujet sur LibreOffice, j'avais besoin de mieux comprendre comme c'était fabriqué et géré...
Si d'autres lecteurs venaient à être intéressés,
un tuto clair est dispo sur https://forum.openoffice.org/fr/forum/v ... 29&t=22412 :D

Merci beaucoup ! :mrgreen: :mrgreen: :mrgreen:
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office 6.2.8.2 sous Windows 10
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: Recopier à la suite les cases non nulles d'une ligne

Message par zeguedon »

Bonjour,
s05b a écrit :saurais-tu m'expliquer pourquoi il y a cette différence de traitement dans les erreurs entre ces colonnes ?
Là comme ça non !
s05b a écrit :j'ai vu que je pouvais ajouter des colonnes de Titre (onglet B) mais il semble que la zone de la matrice (onglet A) soit limitée.
Non seulement, il faut aussi que tu édites les formules nommées pour modifier les formules nommées _LigneRecherchee et _MoisPrecedent
Pour éditer ces formules, clique dans la liste déroulante de la zone de nom (en haut à gauche des entêtes lignes et de colonnes). Tu as en haut de la liste, une entrée de liste nommée Gérer les noms sur laquelle il faut cliquer pour ouvrir le dialogue des zones et formules nommées.

Les formules _LigneRecherchee et _MoisPrecedent définissent dynamiquement les lignes recherchées mais la largeur de ces plages est fixée par le nom des colonnes. C'est cette partie qu'il faut modifier :

Code : Tout sélectionner

INDIRECT("$'Onglet B'.B"&EQUIV(Cel_mois;Pl_mois;0)&":G"&EQUIV(Cel_mois;Pl_mois;0)) 
Avant le dernier EQUIV(), la lettre G détermine la dernière colonne de ta ligne. C'est cette lettre qu'il faut modifier pour que toute la largeur de ton tableau soit traitée. Idem pour _MoisPrecedent ; tu peux définir à l'avance une zone plus large en prévision de l'évolution susceptible d'être apportée à ton tableau.

Il faut aussi modifier la plage Pl_mois

Code : Tout sélectionner

$'Onglet B'.$A$1:$A$8
Pour qu'elle atteigne un nombre de ligne suffisant A30 par exemple. Attention, quelle que soit la ligne à partir de laquelle commence ton tableau, il faut que cette plage commence à la ligne 1 (A1).

Après, pour modifier tes formules matricielles, je te conseille de commencer par toutes les supprimer en ayant pris le soin de les copier en amont (sans le signe égal (=) et sans les valider par Ctl+Maj+Entrée) dans des cellules vides du fichier. Cela te permettra de les recopier ensuite après avoir modifié les formules nommées et les revalider à nouveau par Ctrl+Maj au bon endroit.

A+ pour la suite... :)
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
s05b
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 12 août 2017 12:42

Re: Recopier à la suite les cases non nulles d'une ligne

Message par s05b »

Merci !

(je reformule en mode pas-à-pas)

J'ai donc modifié la plage des formules _LigneRecherchee et _MoisPrecedent dans "Gérer les noms" du menu déroulant permettant de nommer les plages de données : pour étendre la plage au delà de la colonne G, j'ai modifié par BZ dans les deux, avant le dernier EQUIV(). Cela correspond à un maxi du nombre de colonne que j'aurai à exploiter selon mes brouillons.

De plus, pour comprendre un plus grand nombre de lignes (par exemple un max de 50 ans de mois successifs puisque mon ordinateur a l'air de le tolérer facilement lors des essais), je modifie dans le même menu la plage de données Pl_mois en allant de A1 (important selon ce que tu m'expliques) à A600.

Je vois, en faisant CTRL+/ dans chaque colonne de l'onglet A, que cela a pour effet d'agrandir les plages des colonnes Titre (B) et Valeur (C).
Mais la colonne Mois (A) reste limitée à 6 lignes et le résultat se limite aux données des colonnes A à J dans l'onglet B.

Je modifie donc les autres plages de données :
- Pl_entete passe de A1:J1 à A1:BZ1
- Pl_donnees passe de A1:J8 à A1:BZ600

Le résultat n'étant pas suffisant, je vois que la seule formule matricielle qui comprenne des plages "absolues" (nommément désignées dans la formule, hors plages dynamiques) est celle de la colonne Mois (A) de l'onglet A.

J'ai donc copié la formule sans le = et les accolades de début et fin (elles disparaissent automatiquement lorsqu'on sélectionne la formule), pour la mettre dans une autre case (on est obligés de sélectionner toute la plage par CTRL+/ pour pouvoir cliquer dans la formule, sinon message d'erreur bloquant).
Pour cela, on est obligés de faire copier, puis echap, puis coller dans une autre case. Pas de validation de formule matriucielle par CTRL+Maj+entrée à ce stade ni d'ajout de = en début de formule.

Je supprime ensuite la formule dans son emplacement initial en sélectionnant toute la plage par CTRL+/ puis en y faisant un clic droit, "effacer le contenu", tout décocher sauf "formules".

Je retourne dans la case avec la copie de la formule initiale : j'y modifie la plage "B8:B13=" en "B8:B20=" car j'estime que cela englobera les données max possibles pour un mois donné, puis je copie la formule.
Je sélectionne la première case de la plage en devenir (B8), puis j'écris = dans la barre de formule et j'y colle ensuite la formule. Je n'oublie pas de valider par CTRL+Maj+entrée pour transformer en formule matricielle : la formule est automatiquement appliquée à toute la zone B8 à B20 concernée par la formule.

:alerte: Reste un dernier détail que je n'arrive pas à comprendre :alerte: : pourquoi est-ce que les données récupérées de l'onglet B semblent ne pas intégrer les données des dernières colonnes "Titre F" et "Titre G", notamment quand on sélectionne le mois 6 ?
ExempleOoo_RecopieCasesNonNulles_Mod3.ods
Ce sujet est très enrichissant pour découvrir les formules matricielles :D :D :marto:
Merci pour ta patience très pédagogique !!!
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office 6.2.8.2 sous Windows 10
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: Recopier à la suite les cases non nulles d'une ligne

Message par zeguedon »

s05b a écrit ::alerte: Reste un dernier détail que je n'arrive pas à comprendre :alerte: : pourquoi est-ce que les données récupérées de l'onglet B semblent ne pas intégrer les données des dernières colonnes "Titre F" et "Titre G", notamment quand on sélectionne le mois 6 ?
Je ne reproduis pas :
s05b.png
essaye d'enregistrer ton fichier puis recharge le afin que les formules soit réévaluée.


J'ai lu ta réponse en diagonale (suis occupé ailleurs), je reviendrai dessus plus tard pour voir si je n'ai rien oublié.

Concernant l'affichage du numéro du mois, afin qu'il affiche mois xyz tu peux définir un format de cellule personnalisé:

Code : Tout sélectionner

"Mois "#,##
Tes cellules afficherons alors Mois x mais la valeur de la cellule sera toujours une valeur numérique. Valable poàur la colonne A et la cellule contenant la liste déroulante de sélection du mois.

A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
s05b
Membre lOOyal
Membre lOOyal
Messages : 34
Inscription : 12 août 2017 12:42

Re: Recopier à la suite les cases non nulles d'une ligne

Message par s05b »

Bien vu, il suffisait effectivement de recharger le document pour recharger les formules.

Merci beaucoup pour ton astuce finale !
Elle me sera effectivement très utile.

Bonne continuation à toi :super:

Je passe le sujet en [Résolu].
Libre Office 6.2.8.2 sous Windows 10