[Résolu][Calc] Chercher la référence manquante

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 !
bastux
Fraîchement OOthentifié
Messages : 5
Inscription : 15 avr. 2017 01:08
Localisation : Brest

[Résolu][Calc] Chercher la référence manquante

Message par bastux »

Bonjour,

Merci pour les posts sur le balisage, c'est très intéressant et on voit bien l'intérêt. Je vais tacher de respecter ces codes pleins de bons sens.

Dans le cadre de mon boulot, j'utilise un tableur calc pour enregistrer tous mes produits. Je souhaite develloper ma première macro, qui me renvoie le premier numéro de référence non utilisé dans mon catalogue pour l'afficher dans une cellule. Le but est de savoir quelle référence donner à un nouveau produit que je rentre dans mon catalogue. Ça me serai utile car les références ne sont pas forcement dans l'ordre et il y a des lignes vides. Plus tard j'ajouterai une détection de doublon.

Bon, en premier lieu je suis content de vous annoncer que mon problème est résolu après pas mal de recherche sur le web. Voilà, merci, au revoir :D

:wink:

En vrai, il y a des hics et ma programmation n'est pas "propre" mais ça fonctionne.

Le code en gros c'est une boucle qui parcours une colonne à la recherche de la valeur 1, si elle est trouvée on passe à la valeur 2, etc. Si on trouve pas la valeur 4, alors on affiche 4 dans une case et la boulot est fini.

Code : Tout sélectionner

function refdisp (Cd As integer) as integer
Dim Doc As Object
Dim Sheet As Object
Dim Cell As Object
Dim i As Integer
Dim ref As Integer
Dim test As Integer

ref=1
test=1

Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)

do while test < ref+1 rem on boucle tant qu'on trouve la reference suivante
    For i = 2 To 1000 rem on parcours tout la tableau jusqu'à la ligne 1000 pour chercher une a une la valeur ref suivante
        Cell = Sheet.getCellByPosition(0, i)
        If Cell.Value = ref rem on a trouve la reference 
       then ref=ref+1 rem on cherchera la suivante au prochain tour
        End If
    Next i
    test=test+1
loop
rem

refdisp = ref

End function
Les défauts sont :

- Concrètement le calcul est trés long, j'ai lu dans un autre post qu'il fallait garder tout en mémoire pour que ça aille plus vite. Comment mettre ça en œuvre?
- J'ai fait une fonction au lieu d'une "sub" car c'est le moyen le plus simple que j'ai trouver de renvoyer une valeur dans un tableur. J'ai ajouter un argument inutile pour forcer la mise jour de la case en entrant une valeur dans une case. J'imagine qu'il vaut mieux convertir ma fonction en "sub" et utiliser le code qui permet d'écrire dans une cellule, comment faire?
- je voudrais que le calcul se lance tout seul "en permanence"

Je post toutes ces question ensemble car je "pressens" qu'elles sont liés entre elle, mais je serai déjà content d'avoir conseil sur un de ces points.

Merci de votre lecture et de votre aide!
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Oukcha le 19 avr. 2017 10:59, modifié 3 fois.
Raison : Balise [Basic] supprimée (implicite avec balise [Calc], relire les règles de cette section)
Libo Version: 7.0.1.2 (x64)
OS: Windows 10.0
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Calc][Basic] chercher la référence manquante

Message par Churay »

Bonjour,

Une solution :

Code : Tout sélectionner

'******************************************************************************************************************************
'   Code fourni sous licence CECILL par le forum officiel francophone : https://forum.openoffice.org/fr/forum/
'   https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=54407
'*******************************************************************************************************************************
Option ExplicitFunction Rechercher
Dim oSheet AS Object, oCursor As Object, oRA As Object, oRange As Object
Dim oSearch As Object, oFound As Object, nRef As Long

	oSheet = thisComponent.CurrentController.ActiveSheet
	oCursor = oSheet.createCursor : oCursor.gotoEndOfUsedArea(False)
	oRA = oCursor.RangeAddress : nRef = 1
	
	oRange = oSheet.getCellRangeByPosition(0, 2, 0, oRA.EndRow)
	oSearch = oRange.createSearchDescriptor
	With oSearch
		.SearchString = nRef
		.SearchCaseSensitive = false
		.SearchWords = True
	End With

	oFound = oRange.findFirst(oSearch)
	if NOT isnull(oFound) then
		Do While NOT(isNull(oFound))
			nRef = nRef + 1
			oSearch.SearchString = nRef
			oFound = oRange.findNext(oFound, oSearch)
		loop
	End If               
	' Pour une écriture directe
	oSheet.getCellByPosition(0,1).Value = nRef
	' Pour un retour de valeur
	Rechercher = nRef
End Function
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Calc][Basic] chercher la référence manquante

Message par Hubert Lambert »

Bonjour,

Une solution sans macro, juste pour info :

Code : Tout sélectionner

=EQUIV(0;FREQUENCE(A3:A1000;LIGNE(A1:A30000));0)
Cordialement.
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
bastux
Fraîchement OOthentifié
Messages : 5
Inscription : 15 avr. 2017 01:08
Localisation : Brest

Re: [Calc][Basic] chercher la référence manquante

Message par bastux »

Churay, hubert lambert, Bonjour et merci.

J'ai passé une bonne nuit de recherche hier sur ce problème ainsi que pour apprendre à me servir des macros (un peu par curiosité) et je ne regrette pas de l'avoir fait mais c'est vraiment appréciable d'avoir de l'aide!

@ Churay, ta macro est rapide! Je suis curieux de comprendre qu'est ce qui ralentit le calcul dans mon code et qui rend ta macro si agile 8) ? Sinon je ne comprends pas bien le fonctionnement interne mais ça marche plutôt bien. Dans certains cas cependant il ne renvoie pas forcement le nombre attendu. En effet pour certaines obscures raisons, les références de mon "catalogue" peuvent être dans le désordre: la 2 aprés la 4 et ainsi de suite et parfois elle renvoie autre chose que le numéro manquant. voir PJ bouton "macro churay" je ne suis pas assez calé pour m'approprier ta macro et la corriger. Merci encore à toi.

@ Hubert, Je ne tiens pas à utiliser une macro pour cette tache bien que je suis curieux d'apprendre à m'en servir. J'ai bien vu que ta formule marchait mais j'ai mis un moment à comprendre comment fonctionnait cette imbrication de fonction. Au final c'est excellent parce que ça tiens en une ligne. J'ai voulu remodeler le code pour demander un >2 à equiv de façon à sortir les doublons ou triplons de mon catalogue un par un mais c'est pas si simple, on ne peut demander qu'un nombre à equiv. Il faudrait donc adapter le résultat de fréquence pour avoir une liste qui contienne par exemple un 2 dés qu'il trouve au moins deux fois la même valeur, ou faire complétement différemment... Ah j'y suis je crois, il faut tester 'les' résultats de fréquence par rapport à '1' et remplir un autre tableau avec le résultat pour qu'equiv nous dise le numéro. Je pense que je vois le principe mais il va me falloir chercher un peu pour mettre ça en forme.

A suivre ...

Mais si j'ai bien compris les règles, vu que j'ai posé plusieurs questions dans un seul post alors que je n'aurai pas dû et que j'ai la réponse à mon problème principal, je classe en résolu.

Merci encore
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libo Version: 7.0.1.2 (x64)
OS: Windows 10.0
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

Re: [Calc][Basic] [Résolu] chercher la référence manquante

Message par Churay »

Bonjour,
bastux a écrit : les références de mon "catalogue" peuvent être dans le désordre
Je n'y avais pas prêté attention.... : l'utilisation de findNext avait un sens dans une liste triée.
Puisque ce n'est pas le cas, il faut utiliser uniquement findFirst et adapter le code en conséquence :

Code : Tout sélectionner

'******************************************************************************************************************************
'   Code fourni sous licence CECILL par le forum officiel francophone : https://forum.openoffice.org/fr/forum/
'   https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=54407
'*******************************************************************************************************************************
Option Explicit
Function Rechercher
Dim oSheet AS Object, oCursor As Object, oRA As Object, oRange As Object
Dim oSearch As Object, oFound As Object, nRef As Long, nRow AS Long

	' La feuille
	oSheet = thisComponent.CurrentController.ActiveSheet
	' un curseur qui permet de déterminer la plage utilisée
	oCursor = oSheet.createCursor : oCursor.gotoEndOfUsedArea(False)
	 ' décrite par ses indexes
	oRA = oCursor.RangeAddress

	' La plage des références : colonne A, de la ligne 2 à la dernière ligne utilisée
	oRange = oSheet.getCellRangeByPosition(0, 2, 0, oRA.EndRow)

	' on décrit ce que l'on cherche
	oSearch = oRange.createSearchDescriptor
	With oSearch
		.SearchCaseSensitive = false
		.SearchWords = True
	End With

	' à partie de la réf. 1
	nRef = 1
	' de la ligne 2 à la dernière ligne utilisée
	FOR nRow = 2 TO oRA.EndRow
		' on cherche
		oSearch.SearchString = nRe
		' résultat de la recherchef
		oFound = oRange.findFirst(oSearch)
		' si on a trouvé
		if NOT isnull(oFound) then
			' on incrémente la référence
			nRef = nRef + 1
			oSearch.SearchString = nRef
		ELSE 
			' sinon, la référence recherchée est la première référence disponible
			' donc on sort de la boucle
			Exit For
		End If
	Next nRow
	' Pour une écriture directe dans la case A1
	oSheet.getCellByPosition(0,1).Value = nRef
	' Pour un retour de valeur de la fonction
	Rechercher = nRef
End Function
J'ai opté pour une boucle qui balaye la plage en incrémentant nRef à chaque tour, une autre option aurait été de copier la colonne A dans une colonne vide, trier cette nouvelle colonne et l'utiliser pour la recherche : le premier code restait valade, il suffisait d'insérer le code de copie et de tri.
bastux a écrit :e ne comprends pas bien le fonctionnement
J'ai commenté le code
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
bastux
Fraîchement OOthentifié
Messages : 5
Inscription : 15 avr. 2017 01:08
Localisation : Brest

Re: [Résolu][Calc][Basic] chercher la référence manquante

Message par bastux »

Ça marche aussi!

Je pense avoir compris ton code grâce à tes commentaires.

Merci bien!
Libo Version: 7.0.1.2 (x64)
OS: Windows 10.0