[Calc] Empêcher les doublons en fusionnant les données

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
MaUn78
Membre lOOyal
Membre lOOyal
Messages : 40
Inscription : 16 sept. 2014 13:46

[Calc] Empêcher les doublons en fusionnant les données

Message par MaUn78 »

Bonjour,

Je poursuis mon projet de gestion d'une petite bédéthèque. Voici le lien vers le sujet précédent consistant à centraliser les données saisies dans des fichiers différents :
viewtopic.php?t=66658

J'essaye maintenant de mettre en place un système qui empêcherait de saisir des doublons (en fonction du numéro ISBN), et permettrait de compléter / modifier une ligne dont l'ISBN existe déjà.

Il faudrait en gros que la macro fusionne les données de deux lignes dont l'ISBN serait identiques dans la plage "A2:E150000" de la feuille "Centralisation".
Je ne sais pas si c'est possible, mais j'espère ^^

Je vous remets en pièce jointe le document "Principal" avec aussi un fichier Secondaire pour qu'au besoin vous ayez un exemple de la structure final du projet.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Avatar de l’utilisateur
rollmops
PassiOOnné
PassiOOnné
Messages : 692
Inscription : 20 déc. 2017 14:45

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par rollmops »

Bonjour,

Pourquoi vouloir faire ça avec un tableur alors qu'empêcher une saisie de doublon se fait sans problème sous Base ?
OpenOffice 4.1.15 - Windows 10
MaUn78
Membre lOOyal
Membre lOOyal
Messages : 40
Inscription : 16 sept. 2014 13:46

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par MaUn78 »

C'est une contrainte, là où je souhaiterais utiliser ce projet on ne peux utiliser que Calc et pas Base.
En plus, Base est "mono-utilisateur" si on ne fait pas de modifs, et quand bien même il y aurait accès à Base, je n'aurais pas moyen de faire les modifs nécessaires pour le transformer en multi-utilisateurs
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17084
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par jeanmimi »

Bonjour,
Comme il s'agit de fusionner de données, le fichier Principal ne permet pas de voir ce qui doit être fusionné, peut-être parce que les liens externes sont désactivés.
Je constate qu'un nom d'emprunteur est saisi plusieurs fois. Que faudrait-il alors fusionner ?
LibreOffice : Version : 24.8.2 (x64)(10 novembre 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
MaUn78
Membre lOOyal
Membre lOOyal
Messages : 40
Inscription : 16 sept. 2014 13:46

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par MaUn78 »

Salut Jeanmimi !

Alors effectivement normalement les données sont liées entre les fichiers "Principal" et "Secondaire1" à "Secondaire10".

Les données contenues sur les feuilles "Données" de chaque fichier "Secondaire" (plage de données "A2:E15000") sont rapatriées sur le fichier "Principal" sur la feuille dédiée à chaque fichier "Secondaire". Ensuite, une macro sur le fichier principal récupère les plages "A2:E15000" (via un collage spécial des données sans les formules) de chaque feuille (de "Secondaire1" à "Secondaire10") et regroupe le tout dans la plage "A2:E150000" de la feuille "Centralisation".

Dans l'idéal, ce que je souhaiterais faire, c'est qu'à chaque fois que les feuilles "Secondaire1" à "Secondaire10" (du fichier "Principal") sont alimentées par tous les fichiers secondaires, alors les feuilles "Données" de ces fichiers secondaires soit vidées.

Ensuite, que la macro agisse sur la feuille "Centralisation" du fichier "Principal" pour repérer les doublons éventuels (doublons en fonction du numéro "ISBN"), et fusionner leurs données sur une seule ligne.

Par exemple, si sur un fichier "Secondaire1" quelqu'un rentre les infos suivantes :
ISBN : 1592634871591
Emprunteur : Marc
Date d'emprunt : 15/01/2022
Date de retour :
Synopsis : Blablabla

Et sur un autre fichier "Secondaire2" (par exemple) quelqu'un rentre ces infos là :
ISBN : 1592634871591
Date d'emprunt :
Date de retour : 31/12/2022
Synopsis : Blablabla

Alors sur le fichier "Principal", sur la feuille "Secondaire1" on aura les infos saisies sur le fichier "Secondaire1", et sur la feuille "Secondaire2" les infos saisies sur le fichier "Secondaire2". Alors,ces données sont rapatriées dans la plage "A2:E150000" de la feuille "Centralisation", mais il y a deux lignes avec le même ISBN. il faudrait donc que la macro détecte ces doublons, et fusionne les données de ces lignes ayant le même ISBN éventuellement dans une nouvelle plage de cette feuille) :
ISBN : 1592634871591
Emprunteur : Marc
Date d'emprunt : 15/01/2022
Date de retour : 31/12/2022
Synopsis : Blablabla

Je sais pas si je suis très clair :marto:
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17084
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par jeanmimi »

En passant par le Menu :
Données > Plus de filtres > Filtre spécial
tu devrais pouvoir sélectionner les ISBN sans doublons.
Voir ici pour une Macro :
viewtopic.php?p=25857#p25857
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice : Version : 24.8.2 (x64)(10 novembre 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
MaUn78
Membre lOOyal
Membre lOOyal
Messages : 40
Inscription : 16 sept. 2014 13:46

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par MaUn78 »

Merci, je vais éplucher ce lien après le boulot. Par contre, j'ai un peu peur (en l'ayant survolé vite fait) que cela ne "fusionne" pas les données des lignes en doublon... Mais je vais déjà tester ce système via les filtres spéciaux :super:
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25602
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par Dude »

Salut,
MaUn78 a écrit : 13 févr. 2023 14:51Par exemple, si sur un fichier "Secondaire1" quelqu'un rentre les infos suivantes :
[...]
Et sur un autre fichier "Secondaire2" (par exemple) quelqu'un rentre ces infos là :
Je ne vois aucune règle claire qui indique que la donnée est à conserver ou à écraser?
Et si un 3e rentre des infos, tu fais quoi ?
MaUn78
Membre lOOyal
Membre lOOyal
Messages : 40
Inscription : 16 sept. 2014 13:46

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par MaUn78 »

Dude a écrit : 14 févr. 2023 08:30 Salut,
Je ne vois aucune règle claire qui indique que la donnée est à conserver ou à écraser?
Et si un 3e rentre des infos, tu fais quoi ?
Salut !
Alors effectivement j'avais pas envisagé une troisième saisie pour un même ISBN. Je m'étais dis qu'un livre ne pouvait être prêté qu'une fois, donc au pire, un départ et un retour, donc deux lignes avec juste la date de départ et la date de retour qui seraient à fusionner.
Mais effectivement, si pour une raison ou une autre une troisième personne saisie venait à être effectuée pour le même ISBN, ca se complique effectivement bcp.

Du coup, je songe à une macro anti-doublon qui s'appliquerait en deux temps/endroits :

1) au niveau des fichiers "Secondaires", lors de la "Saisie". En mettant par exemple un bouton "Rechercher" qui devra être activé après avoir saisie un ISBN dans la case B5 (de la feuille "Saisie") et qui fera cette manip' d'aller rechercher si cet ISBN est présent dans la plage "A2:E150000" de la feuille "DonnéesPrincipal". Si y a déjà une ligne avec cet ISBN, alors les cases D5, F5, H5 et B8 se pré-rempliraient automatiquement avec les données existantes, et la personne qui saisie pourrait compléter les données manquantes. En validant cet enregistrement "complété", il y aura un doublon ensuite dans le fichier principal, mais les données qui y étaient déjà présentes ne seront pas différentes, ce sont juste les cellules qui étaient vides qui seraient alors complétées.

2) Au niveau du fichier "Principal", sur la feuille "Centralisation", il faudrait trouver les lignes en doublon en juste les fusionner. Si l'étape 1 sur les fichiers secondaires a bien été remplie, alors il ne devrait y avoir aucune données à écraser lors de la fusion des doublons, mais juste des cases vides qui auront été complétées éventuellement. Et si pour une raison inconnue des anciennes données venaient à avoir été modifiées, il faudrait garder uniquement la saisie la plus récente. Pour ça, j'peux rajouter à ma "table de données" une colonne avec la date du jour de la saisie afin que la macro sache quelle est la saisie la plus récente.

Je sais pas si je suis clair , et si c'est réalisable :marto: :aie:
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17084
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par jeanmimi »

MaUn78 a écrit : 14 févr. 2023 10:48 et si c'est réalisable
rollmops a donné la solution un peu plus haut pour ce que tu veux faire et qui s'apparente à une gestion de stock avec des entrées et des sorties de produits, ici des livres, qui peuvent avoir le même ISBN si plusieurs exemplaires sont proposés au prêt.
Avec Calc, on voit que ce n'est pas simple.
LibreOffice : Version : 24.8.2 (x64)(10 novembre 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25602
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par Dude »

Toujours dans le cadre des tableaux mémoires et d'une recherche dans ses éléments, tu peux te servir de PartStringInArray
Relire : https://beaussier.com/sections/viewtopi ... 3&start=15


MaUn78 a écrit : 14 févr. 2023 10:48Je sais pas si je suis clair , et si c'est réalisable
C'est toujours réalisable mais au prix de contorsions qui me font rejoindre l'avis général de rollmops et jeanmimi.
MaUn78
Membre lOOyal
Membre lOOyal
Messages : 40
Inscription : 16 sept. 2014 13:46

Re: [Calc] Empêcher les doublons en fusionnant les données

Message par MaUn78 »

Désolé pour le retour un peu tardif.

Alors déjà merci pour vos infos. Je suis d'accord avec Rollmops et Jeanmimi pour le fait que Base est bien mieux adapté, mais les contraintes font que je ne peux pas utiliser Base pour ce projet. C'est soit Calc, soit rien du tout... :fou:

Du coup, j'ai quand même regardé toutes les pistes données (et chercher encore de nouvelles) pour essayer de contourner les problèmes, et une qui pourrait être intéressante serait celle là (indiquée par Dude :super: ) :
https://beaussier.com/sections/viewtopi ... dca1#p2066
Ca permettrait effectivement de fusionner toutes les lignes dont l'ISBN est en doublon, et de reporter chacune des données différentes contenues dans la case adjacente à la suite vers la droite. Pour décomplexifié le truc, je vais partir du principe qu'il ne pourra y avoir que 2 lignes avec le même ISBN (tant pis si pour une raison incompréhensible il venait à y avoir 3 "enregistrement différents pour un seul bouquin, j'improviserais à ce moment là ^^).

Du coup, si j'applique la macro ci-dessus, je vais avoir potentiellement un tableau centralisateur qui devra être de la forme suivante :
ISBN | EMPRUNTEUR | EMPRUNTEUR | DATE D'EMPRUNT | DATE D'EMPRUNT | DATE DE RETOUR | DATE DE RETOUR | SYNOPSIS | SYNOPSIS

Il faudra que je trouve la formule pour que le formulaire de la feuille "Consultation" aille bien récupérer les infos dans les bonnes cases (on va dire les plus récentes, donc logiquement dans la deuxième colonne de chacun des champs autre qu'ISBN). Ca c'est pas bien compliqué je pense en soit.

Ma question concerne donc la macro indiquée plus haut... Comment faire en sorte qu'elle transpose les enregistrements de chaque "champ" (colonne autre qu'ISBN) et pas juste celui du 1er champ (colonne B en l'occurrence) ?

Pour info, voilà le code de la macro que je devrais utiliser pour cette question de gestion des doublons (qui n'est pas encore adapté à mon fichier) :

Code : Tout sélectionner

   sPlage = "A1:B12"
   
   oDoc = ThisComponent ' Le classeur
   oFeuil = oDoc.Sheets(0) ' La 1ere feuille qui est indexée à 0
   oPlage = oFeuil.getCellRangeByName(sPlage)
   oTab = oPlage.DataArray
   
   ' Déclaration du tableau de regroupement
   m = UBound(oTab) ' valeur maximum
   Dim oRgp(0 To m) as variant
   For o = 0 to m
      oRgp(o) = DimArray(m)
   Next o

   While i <= Ubound(oTab)
      l = 1
      oRgp(k)(0) = oTab(i)(0)
      ' Complete le sous-tableau à vide
      For j = 1 to m
         oRgp(k)(j) = ""
      Next j
      For j = i to m         
         if (oRgp(k)(0) = oTab(j)(0)) then
            oRgp(k)(l) = oTab(j)(1)
            l = l + 1
         else
            exit for
         endif
      Next
      k = k + 1
      i = j
   Wend
   Redim Preserve oRgp(0 To k-1)
   
   oFeuil = oDoc.Sheets(1) ' La 2e feuille
   i = UBound(oRgp)
   j = UBound(oRgp(i))
   oPlage = oFeuil.getCellRangeByPosition(0,0,j,i)
   oPlage.DataArray = oRgp
J'y comprends quasiment rien à ce code :marto: le début ça va, puis dès qu'on passe à " ' Déclaration du tableau de regroupement" là je suis perdu :aie:
Obligation de version : LibreOffice 6.2.7.1lin1 (x64)
Windows 10