[Résolu] [Calc] Filtre sans les formules

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 !
tomasi
Membre prOOscrit
Messages : 17
Inscription : 14 mars 2019 14:34

[Résolu] [Calc] Filtre sans les formules

Message par tomasi »

Bonjour,

Ma macro pour effectuer un tri en fonction de la valeur d'une cellule fonctionne parfaitement sauf que j'aimerais que celle ci ne transpose pas les formules mais uniquement les valeurs.
Pourriez-vous m'aider s'il vous plaît ?
Voici la macro que dois je ajouter comme ligne pour arriver à mes fins.

Code : Tout sélectionner

Option Explicit
Sub Tri1


Dim oDoc as Object, fBase as Object, fSel1 as Object, fSel2 as Object
Dim maZone as Object, oFilterDesc as Object, maCellule as Object
Dim oFields(0) As New com.sun.star.sheet.TableFilterField
Dim CellVides as Variant, y as Long

	oDoc = thisComponent
	fBase = oDoc.Sheets.getByName("Tri O_U Today")
	fSel1 = oDoc.Sheets.getByName("Selection Over Today")
	fSel2 = oDoc.Sheets.getByName("Selection Under Today")
	maZone = fBase.getCellRangeByName("A1:A1000")
	CellVides = maZone.queryEmptyCells.RangeAddresses
	y = CellVides(UBound(CellVides)).StartRow
	maZone = fBase.getCellRangeByName("A1:Ak" & y)
	oFilterDesc = maZone.createFilterDescriptor(True)
	With oFields(0)
		.Field = 36
		.IsNumeric = True
		.NumericValue = 1.8
		.Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
		
	End With
	With oFilterDesc
		.CopyOutputData = True
		.ContainsHeader = False
		.Orientation = com.sun.star.table.TableOrientation.COLUMNS
		maCellule = fSel1.getCellRangeByName("A1")
		.OutputPosition = maCellule.CellAddress
		.FilterFields = oFields()
	End With
	maZone.filter(oFilterDesc)
	oFilterDesc = maZone.createFilterDescriptor(True)
	With oFields(0)
		.Field = 36
		.IsNumeric = True
		.NumericValue = 0.2
		.Operator = com.sun.star.sheet.FilterOperator.LESS
	End With
	With oFilterDesc
		.CopyOutputData = True
		.ContainsHeader = False
		.Orientation = com.sun.star.table.TableOrientation.COLUMNS
		maCellule = fSel2.getCellRangeByName("A1")
		.OutputPosition = maCellule.CellAddress
		.FilterFields = oFields()
	End With
	maZone.filter(oFilterDesc)
End Sub
Dernière modification par micmac le 19 sept. 2019 15:22, modifié 2 fois.
Raison : Ajout de [Résolu]. La coche verte ne suffit pas.
libO 5.4
windows 7 professionnel
Obligation de version
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12196
Inscription : 08 nov. 2005 17:23
Localisation : Caen, France
Contact :

Re: [Calc] Filtre sans les formules

Message par Bidouille »

Pour être aidé efficacement par les bénévoles et surtout leur faire gagner du temps, veuillez fournir les éléments suivants :
  1. insérer dans le corps du message le code de la macro exposant le problème
  2. joindre un document explicatif intégrant cette macro avec les données de départ (feuille1) et le résultat à obtenir (feuille2)
  3. fournir un mode pas-à-pas permettant de reproduire ce qui a été fait ou ce que vous cherchez à faire pour arriver au problème
  4. ajouter des copies écran (situation avant / après) si cela permet de mieux comprendre
Merci de publier ces informations à la suite.
tomasi
Membre prOOscrit
Messages : 17
Inscription : 14 mars 2019 14:34

Re: [Calc] Filtre sans les formules

Message par tomasi »

Bonjour,

Je voudrais juste savoir si il est possible de rajouter une ligne dans la macro qui permettrait que les lignes filtrées qui arrivent sur la feuille de destination ne prennent pas en compte les formules de la feuille de départ mais juste les valeurs.
Merci d'avance pour votre aide
Pièces jointes
Sans nom 3.ods
(84.64 Kio) Téléchargé 95 fois
libO 5.4
windows 7 professionnel
Obligation de version
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Calc] Filtre sans les formules

Message par OOotremer971 »

Bonjour,
En espérant que tu utilise xray :)
Il y une astuce qui consiste à remplacer les formules de la zone à trier par leurs valeurs respectives avant de trier puis de redonner à la zone les formules telles qu'elle étaient lorsque le tri est terminé.

Pour stocker dans une variable les formules :

Code : Tout sélectionner

maVariable = maZone.FormulaArray
Pour remplacer les formules par leurs valeurs :

Code : Tout sélectionner

maZone.FormulaArray = maZonne.DataArray
et enfin lorsque le tri est terminé :

Code : Tout sélectionner

maZone.FormulaArray = maVariable
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
tomasi
Membre prOOscrit
Messages : 17
Inscription : 14 mars 2019 14:34

Re: [Calc] Filtre sans les formules

Message par tomasi »

Malheureusement je n’utilise pas xray. Cette solution est-elle quand viable ?
libO 5.4
windows 7 professionnel
Obligation de version
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Calc] Filtre sans les formules

Message par OOotremer971 »

tomasi a écrit :Malheureusement je n’utilise pas xray.
C'est bien dommage car xray te permet d'être beaucoup plus efficace en programmation.
tomasi a écrit :Cette solution est-elle quand viable ?
Bien entendu, le principe ne fait pas appel à xray pour fonctionner. Xray t’aurait juste servi à mieux comprendre ce qu'il se passe.
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
tomasi
Membre prOOscrit
Messages : 17
Inscription : 14 mars 2019 14:34

Re: [Calc] Filtre sans les formules

Message par tomasi »

Merci pour ton temps est ce que cela serait trop te demander de me montrer comment intégrer cette mzcro dans la mienne ? Encore merci de ton aide
libO 5.4
windows 7 professionnel
Obligation de version
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Calc] Filtre sans les formules

Message par OOotremer971 »

Par contre j'ai un soucis avec ton fichier que je ne reproduis pas avec un fichier vierge.
J'ignore si ton fichier contient des scories venues d'Excel ou d'un copier/coller à partir d'internet ou des surcharges de style, mais après exécution de la macro, les colonnes sur lesquelles tu as appliqué 2 décimales reviennent à un format à 4 ou 5 décimales.
Tu devrais sélectionner toute la feuille puis clic droit dans une cellule>>Effacer le formatage direct et créer des styles pour formater tes cellules.

Code : Tout sélectionner

Option Explicit
Sub Tri1


Dim oDoc as Object, fBase as Object, fSel1 as Object, fSel2 as Object
Dim maZone as Object, oFilterDesc as Object, maCellule as Object
Dim oFields(0) As New com.sun.star.sheet.TableFilterField
Dim CellVides as Variant, formules As Variant, y as Long

	oDoc = thisComponent
	fBase = oDoc.Sheets.getByName("Feuille1")
	fSel1 = oDoc.Sheets.getByName("Feuille2")
	fSel2 = oDoc.Sheets.getByName("Feuille3")
	maZone = fBase.getCellRangeByName("A1:A1000")
	CellVides = maZone.queryEmptyCells.RangeAddresses
	y = CellVides(UBound(CellVides)).StartRow
	maZone = fBase.getCellRangeByName("A1:Ak" & y)
	
	'=================================
	formules = maZone.GetFormulaArray
	maZone.SetFormulaArray(maZone.DataArray)
	'=================================
	
	oFilterDesc = maZone.createFilterDescriptor(True)
	With oFields(0)
		.Field = 36
		.IsNumeric = True
		.NumericValue = 1.8
		.Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
		
	End With
	With oFilterDesc
		.CopyOutputData = True
		.ContainsHeader = False
		.Orientation = com.sun.star.table.TableOrientation.COLUMNS
		maCellule = fSel1.getCellRangeByName("A1")
		.OutputPosition = maCellule.CellAddress
		.FilterFields = oFields()
	End With
	maZone.filter(oFilterDesc)
	oFilterDesc = maZone.createFilterDescriptor(True)
	With oFields(0)
		.Field = 36
		.IsNumeric = True
		.NumericValue = 0.2
		.Operator = com.sun.star.sheet.FilterOperator.LESS
	End With
	With oFilterDesc
		.CopyOutputData = True
		.ContainsHeader = False
		.Orientation = com.sun.star.table.TableOrientation.COLUMNS
		maCellule = fSel2.getCellRangeByName("A1")
		.OutputPosition = maCellule.CellAddress
		.FilterFields = oFields()
	End With
	maZone.filter(oFilterDesc)
	
	'==========================
	maZone.SetFormulaArray(formules)
	'==========================
	
End Sub
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
tomasi
Membre prOOscrit
Messages : 17
Inscription : 14 mars 2019 14:34

Re: [Calc] Filtre sans les formules

Message par tomasi »

Ce sont des données externes de site internet et donc effectivement la macro ne fonctionne pas car le tri est faussé.
libO 5.4
windows 7 professionnel
Obligation de version
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 15:31

Re: [Calc] Filtre sans les formules

Message par OOotremer971 »

Bonjour,

Dans ce cas, si tu ne veux pas avoir les formules, il suffit d'écraser le résultat du filtrage par un copier/collage spécial en décochant formule.

Code : Tout sélectionner

Option Explicit
Sub Tri1


Dim oDoc as Object, fBase as Object, fSel1 as Object, fSel2 as Object
Dim maZone as Object, oFilterDesc as Object, maCellule as Object
Dim oFields(0) As New com.sun.star.sheet.TableFilterField
Dim CellVides as Variant, formules As Variant, y as Long

	oDoc = thisComponent
	fBase = oDoc.Sheets.getByName("Feuille1")
	fSel1 = oDoc.Sheets.getByName("Feuille2")
	fSel2 = oDoc.Sheets.getByName("Feuille3")
	maZone = fBase.getCellRangeByName("A1:A1000")
	CellVides = maZone.queryEmptyCells.RangeAddresses
	y = CellVides(UBound(CellVides)).StartRow
	maZone = fBase.getCellRangeByName("A1:Ak" & y)
	oFilterDesc = maZone.createFilterDescriptor(True)
	With oFields(0)
		.Field = 36
		.IsNumeric = True
		.NumericValue = 1.8
		.Operator = com.sun.star.sheet.FilterOperator.GREATER_EQUAL
		
	End With
	With oFilterDesc
		.CopyOutputData = True
		.ContainsHeader = False
		.Orientation = com.sun.star.table.TableOrientation.COLUMNS
		maCellule = fSel1.getCellRangeByName("A1")
		.OutputPosition = maCellule.CellAddress
		.FilterFields = oFields()
	End With
	maZone.filter(oFilterDesc)
	oFilterDesc = maZone.createFilterDescriptor(True)
	With oFields(0)
		.Field = 36
		.IsNumeric = True
		.NumericValue = 0.2
		.Operator = com.sun.star.sheet.FilterOperator.LESS
	End With
	With oFilterDesc
		.CopyOutputData = True
		.ContainsHeader = False
		.Orientation = com.sun.star.table.TableOrientation.COLUMNS
		maCellule = fSel2.getCellRangeByName("A1")
		.OutputPosition = maCellule.CellAddress
		.FilterFields = oFields()
	End With
	maZone.filter(oFilterDesc)
	maZone = fSel2.getCellRangeByName("A1:A1000")
	y = CellVides(UBound(CellVides)).StartRow
	CopierCollerSpecial(y)
End Sub


sub CopierCollerSpecial(derLigne)
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
dim args3(5) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "A1:Ak"&derLigne
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
args3(0).Name = "Flags"
args3(0).Value = "SVDT"
args3(1).Name = "FormulaCommand"
args3(1).Value = 0
args3(2).Name = "SkipEmptyCells"
args3(2).Value = false
args3(3).Name = "Transpose"
args3(3).Value = false
args3(4).Name = "AsLink"
args3(4).Value = false
args3(5).Name = "MoveMode"
args3(5).Value = 4
dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args3())
end sub
A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Verrouillé