[Résolu] [Calc] Création zone selon la valeur d'une cellule

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 !
Briac44
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 16 oct. 2021 12:24

[Résolu] [Calc] Création zone selon la valeur d'une cellule

Message par Briac44 »

Bonjour,

Je bloque sur la manière de définir ma zone dans le code suivant.
Ma feuille est triée selon un critère ascendant alphabétique dans la colonne "A"
Je souhaite
1- récupérer la valeur de la cellule "A2" (OK)
2- créer une zone de toutes les lignes dont la colonne "A" est de la valeur de la cellule "A2" (Pas OK)
3- créer une nouvelle feuille nommée de la valeur de "A2" (OK)
4- copier les lignes de ma zone dans ma nouvelle feuille (Pas testé)
5- supprimer les lignes de ma zone copiée

De cette manière, je dois pouvoir créer autant de feuilles qu'il y a de noms dans la colonne "A" et vider ma feuille 1
Je cherche donc de l'aide pour dans un premier temps définir ma zone à copier.

Code : Tout sélectionner

option Explicite

Sub cop_feuille

Dim lesFeuilles As Object, maFeuille As Object, maZone As Object, maCellule As Object, lesLignes As Object
Dim uneLigne As Object, celluleArrivee As Object, newFeuille As Object
Dim valeur As String

	maFeuille = ThisComponent.Sheets.getByName("Feuille1")
	
rem faire une boucle : "tant que A2 n'est pas vide :
	' ????	
	
rem recupérer la valeur de la cellule A2	
	maCellule = maFeuille.getCellRangeByName("A2")
	valeur = maCellule.getString()
	print valeur
		
rem définir la zone de départ à copier
	maZone = maFeuille.getCellRangeByName(valeur)
	lesLignes = maZone.Rows
	uneLigne = lesLignes(1)
	
rem création d'une nouvelle feuille
	lesFeuilles = ThisComponent.Sheets
	lesFeuilles.insertNewByName(valeur,1)
	
rem copie de la zone départ dans la nouvelle feuille
	newFeuille = lesFeuilles.getByName(valeur) 	
	celluleArrivee = newFeuille.getCellRangeByName("A2")
	maFeuille.copyRange(CelluleArrivee.CellAddress, uneLigne.RangeAddress)
	
rem supprimer les lignes copiées dans la Feuille1 
        ' ???

End Sub
Merci par avance
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Briac44 le 17 oct. 2021 15:30, modifié 1 fois.
LibreOffice 6.0.7.3 Ubuntu 18.04.4
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Création d'une zone selon la valeur d'une cellule

Message par zeguedon »

Bonjour,

Le filtre standard est fait pour ça. Tu devrais trouver de nombreux exemple sur ce forum (là pas le temps de t'aider plus désolé)
@+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Briac44
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 16 oct. 2021 12:24

Re: [Calc] Création d'une zone selon la valeur d'une cellule

Message par Briac44 »

Merci.
J'ai cherché de ce coté-la. En revanche, j'ai un message d'erreur à l'exécution

Erreur d'exécution BASIC.
Propriété ou méthode non trouvée : CONTAINS.

Code : Tout sélectionner

	maZone = maFeuille.SpreadSheet
	monFiltre = maZone.createFilterDescriptor(True)
	With oFields(0)
		.Field = 1
		.IsNumeric = False
		.StringValue = "DUPOND"  
		.Operator = com.sun.star.sheet.FilterOperator.CONTAINS
	End With
	maZone.filter(monFiltre)
Je continue mes recherches.
Merci encore
LibreOffice 6.0.7.3 Ubuntu 18.04.4
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Création d'une zone selon la valeur d'une cellule

Message par zeguedon »

Briac44 a écrit :Erreur d'exécution BASIC.
Propriété ou méthode non trouvée : CONTAINS.
il faut utiliser :

Code : Tout sélectionner

com.sun.star.sheet.FilterOperator2.CONTAINS
note la présence du chiffre 2 après Operator

et pour copier les données vers une autre feuille, il faudra le préciser dans les propriété du filtre :

Code : Tout sélectionner

[...]
.CopyOutputData = True
.ContainsHeader = True
.Orientation = com.sun.star.table.TableOrientation.COLUMNS
.OutputPosition = pointResu.CellAddress
.SkipDuplicates = True
End With
ou pointResu.CellAddress se définit comme ça :

Code : Tout sélectionner

pointResu = feuilleResu.getCellRangeByName("A1")
tu as un exemple ici : https://forum.openoffice.org/fr/forum/v ... 57#p353931 pour lequel il faudra prendre le temps nécessaire pour le comprendre.
@+
Je devrais être un peu plus dispo demain pour approfondir si nécessaire. :)
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Briac44
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 16 oct. 2021 12:24

Re: [Calc] Création d'une zone selon la valeur d'une cellule

Message par Briac44 »

Merci Zeguedon.
Le filtre fonctionne bien et copie la zone dans une nouvelle feuille.
Ci-joint le code complet commenté pour les suivants

Code : Tout sélectionner

option Explicit

Sub copie_zone

Dim lesFeuilles As Object, maFeuille As Object, maZone As Object, monFiltre As Object
Dim feuilleResu As Object, pointResu As Object, maCellule As Object
Dim valeur As String
Dim champsFiltre(0) As New com.sun.star.sheet.TableFilterField2 ' index 0 car il n'y a qu'un filtre 

rem recupération de la valeur à trier
	maFeuille = ThisComponent.Sheets.getByName("Feuille1")
		maCellule = maFeuille.getCellRangeByName("A2")
		valeur = maCellule.getString()  ' recupération de la valeur à trier 
		
rem création d'une zone par filtre selon la valeur de la cellule 'A2'
	With champsFiltre(0) ' index du premier filtre
		.Field = 0  ' colonne A : Nom
		.IsNumeric = False
		.StringValue = valeur  ' tri selon la variable valeur
		.Operator = com.sun.star.sheet.FilterOperator2.CONTAINS
	End With

	maZone = maFeuille.SpreadSheet
	monFiltre = maZone.createFilterDescriptor(True)

rem création d'une nouvelle feuille de nom = valeur de la cellule 'A2'
	lesFeuilles = ThisComponent.Sheets
	lesFeuilles.insertNewByName(valeur,1) ' index à 1 : feuille placée juste à droite de la dernière feuille existante

rem copie de la zone filtrée au point d'arrivée dans une nouvelle feuille a partir de la cellule "A1"
	With monFiltre
		.CopyOutputData = True
		.ContainsHeader = True
		.Orientation = com.sun.star.table.TableOrientation.ROWS
		feuilleResu = lesFeuilles.getByName(valeur)
		pointResu = feuilleResu.getCellRangeByName("A1")
		.OutputPosition = pointResu.CellAddress
		.SkipDuplicates = False
		.FilterFields2 = champsFiltre()
	End With
	maZone.filter(monFiltre)

End Sub
En revanche, il me reste une étape car je souhaite supprimer les lignes de la zone filtrée dans ma zone d'origine.
Je continue à chercher
LibreOffice 6.0.7.3 Ubuntu 18.04.4
zeguedon
ManitOOu
ManitOOu
Messages : 3031
Inscription : 02 juil. 2014 17:25

Re: [Calc] Création d'une zone selon la valeur d'une cellule

Message par zeguedon »

Bonjour,
Briac44 a écrit :il me reste une étape car je souhaite supprimer les lignes de la zone filtrée dans ma zone d'origine.
Je ne m’étais pas trop arrêté sur ce point parce que dans ton premier message tu disais :
Briac44 a écrit :De cette manière, je dois pouvoir créer autant de feuilles qu'il y a de noms dans la colonne "A" et vider ma feuille 1

Donc logiquement, lorsque tous les noms de la feuille sont ventilés chacun dans une feuille respective, la feuille de départ peut tout simplement être supprimée. Non ?

Sinon, lorsque tu as filtré en copiant le résultat vers une autre feuille, tu filtres une nouvelle fois sur la feuille d'origine sans exporter le résultat (tu passe .CopyOutputData à False au lieu de True). Cela a pour effet de masquer les lignes non concernées. Ensuite avec une boucle, tu parcours toutes les lignes de ta feuille? Si elles sont visibles tu les supprimes sinon tu les laisses. Ça devrait normalement faire l'objet d'un nouveau sujet.

Code : Tout sélectionner

Sub Main
oDoc = Thiscomponent
oSheet = oDoc.Sheets(0)
lesLignes = oSheet.Rows
For x = 1000 To 1 step -1
	uneLigne = lesLignes(x)
	If uneLigne.IsVisible = True Then
		lesLignes.RemoveByIndex(x,1)
	end If
next
End Sub
Ensuite tu filtres une dernière fois avec une descripteur de filtre vierge pour ré-afficher toutes les lignes masquées :

Code : Tout sélectionner

monFiltre = maZone.createFilterDescriptor(True)
maZone.filter(monFiltre)

@+
Comment baliser [Résolu] ?
AOO
LibreOffice
Sous Linux
Briac44
NOOuvel adepte
NOOuvel adepte
Messages : 19
Inscription : 16 oct. 2021 12:24

Re: [Calc] Création d'une zone selon la valeur d'une cellule

Message par Briac44 »

Merci encore.
Ça répond pile poil au besoin.
LibreOffice 6.0.7.3 Ubuntu 18.04.4