Bonjour,
En fait, tu veux
trier et dédoublonner ta plage
$'Inscriptions'.$AD$2:$'Inscriptions'.$AD$898 sous forme de liste !?
Tu peux y parvenir avec une formule matricielle (merci
Jean-Loius Cadeillan que je salue au passage) :
1) il faut créer une zone nommée (
Plage pour la circonstance) par le raccourci clavier Ctrl+F3 :
Sélection_003.png
2) créer une nouvelle feuille nommée
Liste
3) valider la formule suivante par Ctrl+Maj+Entrée dans la cellule
A1 de la feuille
Liste:
Code : Tout sélectionner
=INDEX(Plage;EQUIV(MIN(SI(NB.SI($A$1:A1;Plage)=0;SI(Plage<>"";NB.SI(Plage;"<"&Plage);"")));SI(NB.SI($A$1:A1;Plage)=0;SI(Plage<>"";NB.SI(Plage;"<"&Plage);""));0))
4) étirer la formule vers la bas en maintenant la touche Ctrl enfoncée
A partir de là, il suffit de parcourir par macro la liste obtenue pour récupérer chacun des items en vue d'un traitement et de la supprimer ensuite si besoin.
Pour le fun, une macro qui fait le job :
Attention si ton fichier contient déjà une plage nommée Plage et/ou une feuille nommée Liste, elles seront supprimées par la macro
Code : Tout sélectionner
Option Explicit
Sub main()
Dim oDoc As Object
Dim oCell As Object
Dim zdn As Object
Dim nf As Object
Dim nfA1 As Object
Dim nfB1 As Object
Dim vecteur As Variant
Dim v As String
Dim sListe As String
Dim liste As String
Dim i As Long
'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'Reprise de ton code
'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
oCell = thiscomponent.sheets.getByName("Fiches").getCellRangeByName("D7")
sListe = oCell.getPropertyValue("Validation").Formula1
'"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
oDoc = Thiscomponent
REM oDoc.CurrentController.Frame.ContainerWindow.Enable = False
zdn = oDoc.NamedRanges
if zdn.hasByName("Plage") then
zdn.removeByName("Plage")
end if
zdn.addNewByName("Plage", sListe, oCell.CellAddress,0)
if oDoc.Sheets.hasByName("Liste") Then
oDoc.Sheets.removeByName("Liste")
end if
oDoc.Sheets.insertNewByName("Liste", oDoc.Sheets.Count)
nf = oDoc.Sheets.GetByIndex(oDoc.Sheets.Count - 1)
nfA1 = nf.GetCellByPosition(0,0)
nfB1 = nf.GetCellByPosition(1,0)
nfA1.SetFormula("=SUMPRODUCT(1/COUNTIF(IF(Plage<>"""";Plage);IF(Plage<>"""";Plage)))-1")
nfB1.ArrayFormula = "=INDEX(Plage;MATCH(MIN(IF(COUNTIF($B$1:B1;Plage)=0;IF(Plage<>"""";COUNTIF(Plage;""<""&Plage);"""")));IF(COUNTIF($B$1:B1;Plage)=0;IF(Plage<>"""";COUNTIF(Plage;""<""&Plage);""""));0))"
nf.GetCellRangeByPosition(1,0,1,nfA1.Value-1).fillAuto(com.sun.star.sheet.FillDirection.TO_BOTTOM, 1)
vecteur = nf.GetCellRangeByPosition(1,0,1,nfA1.Value-1).DataArray
For i = LBound(vecteur) To UBound(vecteur)
v = vecteur(i)(0)
liste = liste & v & Chr(10)
msgBox v
Next
msgBox liste
'oDoc.Sheets.removeByName("Liste")
'zdn.removeByName("Plage")
REM oDoc.CurrentController.Frame.ContainerWindow.Enable = True
End Sub
Si tu veux que le code supprime la feuille liste et la plage nommée, il faut dé-commenter les deux avant dernières lignes en retirant l'apostrophe en début de ligne :
Code : Tout sélectionner
'oDoc.Sheets.removeByName("Liste")
'zdn.removeByName("Plage")
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.