Obtenir le numéro d'index d'une colonne selon son nom d'en-tête

Bonjour,

J’ai une question simple à laquelle je n’arrive pas à trouver de réponse.
Comment puis-je obtenir le numéro d’index d’une colonne selon son nom d’en-tête, c’est à dire pas “B” ou “AA”, mais “category” par exemple.
Mon code ci-dessous, je cherche juste à trier des colonnes selon leur nom en évitant d’avoir à coder en dur leur numéro d’index.

Sub Sort_l

Dim oSheet1
oSheet1=ThisComponent.CurrentController.getActiveSheet.GetName

if oSheet1 = “List” then’ [‘A’, ‘B’], sort : Name, Type

oSheet = ThisComponent.Sheets.getByName(oSheet1)
oCellrange = oSheet.getCellrangeByName("B1:BA7000")

SortDesc = oCellrange.createSortDescriptor
SortDesc(1).Value = TRUE 'ContainsHeader

Dim l1(0) as New com.sun.star.table.TableSortField
l1(0).Field = 2
l1(0).IsAscending = "True"

SortDesc(3).Value = l1() 'SortFields
oCellrange.sort(SortDesc)

Dim l2(0) as New com.sun.star.table.TableSortField
l2(0).Field = 1
l2(0).IsAscending = "True"

SortDesc(3).Value = l2() 'SortFields
oCellrange.sort(SortDesc)

end if

End Sub

Bonjour @jilo

Je ne comprends pas l’objectif puisque tu codes “en dur” la plage ? L’ordre des colonnes peut avoir été modifié ?

Sinon, sans “voir” le classeur, une possibilité serait simplement de rechercher la position du nom dans la plage.

Cordialement

1 Like

Oui l’idée c’est bien que les colonnes puissent changer de position, d’où l’importance de ne pas changer en dur. Idéalement j’aimerai aussi ne pas avoir à définir de structure rigide comme les plages. Simplement ajouter, déplacer ou supprimer des colonnes rapidement et rendre le tout automatisé au maximum.

Bonjour @jilo

Une solution simple serait de définir des noms utilisateurs sur tes plages ce qui permet d’y accéder via leur nom et de pouvoir obtenir leur position comme dans l’exemple joint (on trie ici par date croissante et montant décroissant).

Nota : on suppose ici que la plage reste contiguë. Je te rappelle que le tri utilise la position relative de la colonne dans la plage de tri. On n’indique pas ici le numéro de la colonne dans le tableau…

sub PysTri

dim oFeuille as Object, oPlage as Object

dim ConfigTri(1) as new com.sun.star.table.TableSortField
dim Desc(1) As New com.sun.star.beans.PropertyValue 

dim lColData as long, lColDate as long, lColMontant as long

oFeuille = thiscomponent.CurrentController.ActiveSheet

oPlage = oFeuille.getCellRangeByName("data")

lColData = oPlage.RangeAddress.StartColumn
lColMontant = oFeuille.getCellRangeByName("Montant").cellAddress.Column - lColData
lColDate = oFeuille.getCellRangeByName("Date").cellAddress.Column - lColData

ConfigTri(0).Field = lColDate
ConfigTri(0).IsAscending = true
ConfigTri(1).Field = lColMontant
ConfigTri(1).IsAscending = false

Desc(0).name = "SortFields"
Desc(0).value = ConfigTri()
Desc(1).name = "ContainsHeader"
Desc(1).value = true
oPlage.Sort(Desc())

end sub

Voir
Tri.ods (20,2 Ko)

Cordialement

1 Like

Merci beaucoup pour cette réponse qui m’a permi de mieux comprendre le fonctionnement du LO BASIC. Dommage tout de même que l’on doive définir des plages cases par cases, mais au moins ça marche.

Voilà le code amélioré ci-dessous pour ceux que ça intéresse.

Sub Sort_l

nom_feuille = ThisComponent.CurrentController.getActiveSheet.GetName

if nom_feuille = “List” then’ sort : Name, Type

	oSheet = ThisComponent.Sheets.getByName(nom_feuille)
	oCellrange = oSheet.getCellrangeByName("B1:AB7000")

	decalage = oCellrange.RangeAddress.StartColumn
	num_col_Name = oSheet.getCellRangeByName("Name").cellAddress.Column - decalage
	num_col_Type = oSheet.getCellRangeByName("Type").cellAddress.Column - decalage

	Dim Tri(1) as New com.sun.star.table.TableSortField

	Tri(0).Field = num_col_Name
	Tri(0).IsAscending = "True"

	Tri(1).Field = num_col_Type
	Tri(1).IsAscending = "True"

	SortDesc = oCellrange.createSortDescriptor
	SortDesc(1).Value = TRUE 'ContainsHeader
	SortDesc(3).Value = Tri() 'SortFields

	oCellrange.sort(SortDesc)

end if

End Sub

Ma réponse était plus complète car elle répondait à :

Autrement dit, ce que je propose permet de changer l’ordre des colonnes contrairement à ta simplification qui ne prend en compte que la position de “départ” de la plage. D’autre part cette dernière reste fixe dans ton code puisque tu y fais référence par “B1:AB7000”.

Cordialement

1 Like