Ah oui, j'ai oublié,
On est d'accord que
- tu n'as MAXIMUM que 2 prix différents pour un même article ... et pas 3
ou 4 ou + .....
- que tes articles sont triés par leur "nom / tailles"
car sinon, ça marchera pas.
Yves
Ah oui, j'ai oublié,
On est d'accord que
- tu n'as MAXIMUM que 2 prix différents pour un même article ... et pas 3
ou 4 ou + .....
- que tes articles sont triés par leur "nom / tailles"
car sinon, ça marchera pas.
Yves
Bonjour
tu vas devoir faire un compromis à un moment où l'autre, si tu veux que
la réponse à ta question soit exacte (mais tu as vraiment le choix).
Quelle que soit la solution proposée, il s'agît toujours d'un calcul
intermédiaire pour te permettre de supprimer les lignes dont tu ne veux
pas.Sélectionne la colonne avec le calcul en question. Copier, collage
spécial (reste sur la colonne sélectionnée) collage spécial : tu
décoche formules, et tu coches valeur. Tu confirme l'écrasement de
données => la formule sera perdue et tu n'auras plus que son résultat !
Si les cellules sont déplacées (tri par exemple), le résultat sera
visible et le calcul ne sera pas modifié.Mais dans l'absolu, pourquoi
t'embêter avec les lignes supplémentaires que tu veux supprimer ? Une
fois que tu sais celles que tu veux supprimer, tu tu les supprimes,
ensuite, peu importe les calculs (que tu peux aussi supprimer).A moins
que tu veuilles les garder car il y a autre chose à vérifier... avant !
Nous on peut pas le deviner ! il faut nous le dire !
Des réponses à chacun de tes points ci-dessous....
Claire
Bonsoir à tous,
Je viens de rentrer mais les réponses apportées ne me conviennent pas
vraiment ou en partie.
Le lien proposé par Patrick ne concerne pas tout à fait mon problème.
En fait, j'ai besoin de supprimer les lignes où les noms d'articles
sont identiques avec comme condition supplémentaire de supprimer le
doublon qui a le prix le plus faible.
Les solutions proposées :
1) Le lien donné par Patrick ne correspond pas à mon problème.
Laissons Patrick dormir, c'est Thierry.
2) la formule de Christian ne me permet pas de trier sur les valeurs
0 / 1. Toutes les valeurs passent à 0.
une fois le calcul fait, supprime les formules, comme indiqué ci-
dessus. Tu pourras faire tes tris pour supprimer.
3) la matrice, c'est peut-être bien mais trop complexe pour moi qui
n'ai pas assez d'expérience dans Calc.
surement mais elle répond à toutes tes contraintes, et je te l'ai
décomposée. Il n'existe pas toujours une solution simple à une question
qui peut ta paraitre basique. Mais pas grave. Du coup, il faut que tu
tries tes valeurs par libellé au moment de faire ton calcul, puis que
tu ne conserves que les résultats pour isoler les valeurs à supprimer
et les enlever.
De plus, quand le problème des doublons sera réglé, je vais scinder
le tableau avec un onglet correspondant à une catégorie, etc ....
Mais quand les problèmes des "doublons" (ce n'en est pas en fait
hein...) seront réglés, la formule n'a plus aucun intérêt d'être
conservée dans le tableau. Donc tu supprimes cette colonne !
4) la question du départ portait sur une solution données sur le site
Ask :
https://ask.libreoffice.org/fr/question/269608/filtrer-les-lignes-comportant-des-doublons-calc/?sort=latestLa solution sur ce site propose une formule avec 2 tests.
Le 1er test fonctionne. Mais la seconde partie du test comporte une
erreur de formule.
Comme je ne comprends pas la seconde partie de cette formule
On a justement essayé de te proposer des choses plus simples à
comprendre et à mettre en oeuvre. La syntaxe d'un si, d'un OU, d'un ET,
est simple, mais tu l'imbriques et il faut combrendre toutes les
branches des conditions, ça te demande plus de gymnastique d'esprit
, je l'ai modifié quand même en réfléchissant par analogie.
La modification que tu as faites, n'a pas de sens. Je précise.ce qui ne
va pas c'est ça
OU(ET(C5=C6;F5<f6);et(c5=c6;f5<f6))
les majuscules et minuscules importent peu.
Tu dis quand C5=c6 et F5 est inférieur à F6OU bien Quand C5=C6 et F5
est inférieur à F6 alors j'applique la valeur pour "Vrai"
Tu propose donc 2 conditions possibles pour que le test soit vrai mais
tes 2 conditions sont les mêmes !!!!
Michel lui propose OU(ET(C5=C4;F5<F4);ET(C5=C6;F5<F6))ce qui signifie
quand C5=C4 ET F5 est inférieur à F4Ou bien quand C5=C6 et F5 est
inférieur à F6 alors j'applique la valeur pour "Vrai"
Il ne faut pas oublier que ta formules va s'étirer sur les lignes du
dessous. La proposition de Michel prend en compte que tu pourrais avoir
plus de 2 libellés identiques et compare la valeur de la ligne du
dessus, et la valeur de la ligne du dessous.Le premier si considère que
tu pourrais avoir 2 lignes avec un prix et un libellé identique
Dans ton exemple => tu n'as pas 2 lignes de libellés identiques avec le
même prix => le premier si est donc inutileDans ton exemple => tu n'as
que 2 lignes de libellés identiques avec des prix différents => le ou
est donc inutile. C'est ce qui te donne l'illusion que ta correction de
formule est juste.
Au final, la correction de Christian te donnes la BONNE réponse, et te
simplifie la réflexion (oui tu te compliques la vie avec des Et et 2
SI, je t'assure que ce n'est pas le plus simple !) Elle n'oublie rien,
si, comme le précisait Yves hier soit : tu n'as bien que 2 prix
différents pour un même libellé.
La formule de Christian, avec un Si donneSi (et(C5=C6;F5<F6);"on
jette"; "on garde")pour la compréhension, mieux vaut du texte que vrai
ou faux.
Si tu n'utilises pas de texte pour exprimer le vrai / faux, tu n'as
plus besoin du Si. Et Christian, a multiplié les 2 conditions (C5=C6 /
F5<F6) c'est le role du ; dans la fonction.
En gros Christian t'as proposé et(C5=C6;F5<F6), mais sans la moindre
fonction. Il a bien tenu compte de Ask et l'a corrigée et simplifiée.
Elle n'en est pas moins juste.
Bonjour,
Je survole cette discussion, et il me semble que Claire aide sérieusement. Mais quand je lis :
2) la formule de Christian ne me permet pas de trier sur les valeurs 0 / 1. Toutes les valeurs passent à 0.
Quelque chose ne va pas. Je viens de retester et ma solution est strictement conforme à la formule existante, quelque soit le tri.
Donc 3 solutions possibles au sujet du tri:
-"La plage contient des étiquettes de colonnes" n'est pas cochée
- la plage de tri n'est pas correcte (une colonne vide ?)
- on ne valide la formule QUE sur un tableau de données triées, pas sur des résultats (au moins dans ce cas).
Une fois les doublons repérés, rien n'empêche de supprimer la ou les lignes en trop, ou de modifier les données.
Une des meilleures solutions, la plus longue pour un très bon résultat est de passer par une ou des macros.
Bon surf,
Christian
Bonjour à tous et bonjour à Christian,
Je viens de vérifier :
- les 2 premiers cas ne sont pas concernés : pas d'étiquette de colonne, pas de colonne vide même masquée.
- la 3ème raison possible : pas compris ta réponse
Christian tu me dis : "Une fois les doublons repérés, rien n'empêche de supprimer la ou les lignes en trop, ou de modifier les données.
Une des meilleures solutions, la plus longue pour un très bon résultat est de passer par une ou des macros."
Mais le problème, c'est qu'il y a des centaines de doublons à supprimer qui sont éparpillés sur plus de 12000 lignes. Le moyen le plus simple pour supprimer, ce serait pour moi que je puisse les supprimer quand elles seraient groupées.
Devant la multitude de solutions, je me sens un perdu et l'esprit embrouillé.
Merci.
Bonjour Yves,
S'il y avait 3 ou 4, ça ne marchera pas pour la formule ou pour la table dynamique ?
Merci de ta réponse.
Pour finir, j'ai récapitulé et j'ai fait une synthèse des réponses.
J'ai donc appliqué la formule de Christian et ensuite, j'ai fait le copier coller spécial du résultat du test de Christian. Cela m'a permis de trier toutes les lignes ayant une valeur VRAI ou 1 et de les supprimer.
J'espère que je vais enfin pouvoir reprendre la mise en forme de mon tableau.
Merci à tous ceux qui m'ont répondu et qui ont passé pas mal de temps chercher et à rédiger leurs réponses
Bon dimanche à tous.
A l'arrache... une petite macro pour résoudre un nombre important de lignes. Ce qui est important pour éviter les ennuis : bien respecter les variables NomFeuille, Col1, ...
J'ai mis des commentaires en espérant que ça suffise.
Bon surf,
Christian
Sub SupprimeDoublons
Dim oDocument As Object, oSheet As Object, oSheet1 As Object, oSheet2 As Object, oCell1 As Object, oCell2 As Object, oController
Dim Lig As Integer
Dim oRows
Dim oRange As Object
Dim NomFeuille As String
Dim Col1 As Integer, Col2 As Integer, Col3 As Integer, Col4 As Integer
NomFeuille = "Tous"
Col1 = 2 'Nom et taille
Col2 = 3 'Saison
Col3 = 5 ' Prix achat
Col4 = 7 ' Uniquement pour tests (affichage DOUBLON)
LigDebut = 4 ' ligne début comparaison
Feuil1 = thisComponent.sheets().getByName(NomFeuille)
' Affiche la bonne feuille au cas où...
ThisComponent.CurrentController.ActiveSheet = Feuil1
oController = ThisComponent.getCurrentController()
oDocument=ThisComponent
oSheet1=oDocument.Sheets.getByName(NomFeuille)
Lig = LigDebut
'MaVariable = MsgBox("Mon test", 64, "TEST")
Retour = MsgBox("Affichage DOUBLONS uniquement", 1+32, "Recherche doublons")
If Retour = 1 Then
Retour2 = MsgBox("Suppression des lignes en doubles", 1+32, "Recherche doublons")
Endif
Do
oCell1=oSheet1.getCellByPosition(Col1, Lig)
' Totalement inutile : ralentissement du programme, mais visualise la progression
oController.select(oCell1) 'déplace vers la cellule active
NomTaille = Ucase(Trim(oSheet1.getCellByPosition(Col1, Lig).String)) 'j'en profite pour supprimer les espaceas avant/après et passer en majusucules pour éviter des erreurs
Saison = Ucase(Trim(oSheet1.getCellByPosition(Col2, Lig).String))
PrixAchat = oSheet1.getCellByPosition(Col3, Lig).Value
If Lig + 1 > LigDebut Then ' début des comparaisons
If NomTaillePrec = NomTaille Then ' même article et taille
If PrixAchatPrec < PrixAchat Then
If Retour = 1 Then
oSheet1.getCellByPosition(Col4, Lig).String = "Doublon" ' uniquement si on passe les 4 lignes suivantes en REM (sans action)
Endif
If Retour2 = 1 Then
oCell1=oSheet1.getCellByPosition(Col1, Lig)
oController.select(oCell1) 'déplace vers la cellule active
oRows = ThisComponent.CurrentController.ActiveSheet.Rows
oRows.removeByIndex(Lig,1)
Endif
Endif
Endif
Endif
NomTaillePrec = NomTaille
PrixAchatPrec = PrixAchat
If NomTaille = "" Then
Exit Do 'sortie de la boucle infernale
Endif
'
Lig = Lig + 1
Loop
'
MsgBox("Traitement terminé")
End Sub
bonjour
mille excuse pour ma question
pour les néophyte des macros
que faut il faire de cette formule ou de cette macro ?
comment l'employer et l'appliquer dans un fichier ?
exemple typique de relation entre utilisateur et programmeur
sans être négatif ou péjoratif pour les uns ou les autres
cordialement
alain
Bonjour,
Il faut télécharger le document original
Voici le lien où l'on peut télécharger le tableau échantillon (celui avec la formule que j'ai modifiée mais sans trop la comprendre).
https://framadrop.org/lufi/r/vE6UbUok6V#Ds9/b8szJnmX2iOI3KwhIZA5tZ6yfpbGTyRsEb97890=
Ensuite, conseil, enregistrer et faire une copie, c'est plus sage. Ensuite, appliquer la macro dans un module
Bon surf,
Christian