Bonjour
Voici ma Version: 7.5.4.2 (X86_64) / LibreOffice Community, Build ID: 36ccfdc35048b057fd9854c757a8b67ec53977b6
Voici le fichier concerné dans ce post: https://drive.google.com/file/d/1wWcXSU5-fq4uHJWJFKdhntBxMr4h1KSD/view?usp=sharing
J’ai une fichier base de données.
Le fichier a 3 feuilles: InfoBox, Données et Liste.
La feuille Données a quelques milliers de lignes dont voici le nom des colonnes: Prénom, Famille, DateNaissance, DateDécès, NumTitre, Titre, ComplémentTitre, DébutRègne, FinRègne, Image et NomComplet. De A à K.
Toutes les colonnes de la feuille Données sont au format texte, même si quelque fois le texte contenu est en chiffres, les cellules sont tout de même formatées en texte. Mais il faut préciser que malgré ça, les colonnes C, D, H et I ne contiennent que des chiffres.
Voici les 10 premières lignes de la feuille Données:
Prénom | Famille | DateNaissance | DateDécès | NumTitre | Titre | ComplémentTitre | DébutRègne | FinRègne | Image | NomComplet | Name | Num | of | family | , | title | title compl. | from | date1 | to | date2 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
François | Lorraine-Guise | 1519 | 1563 | ? | Baron of Lambesc | 1550 | 1563 | François of Lorraine-Guise (1519–1563) | François | ? | of | Lorraine-Guise | , | Baron of Lambesc | from | 1550 | to | 1563 | |||
Archambaud | Grailly | 1330 | 1412 | I | Captal of Buch | 1356 | 1412 | Archambaud of Grailly (1330–1412) | Archambaud | I | of | Grailly | , | Captal of Buch | from | 1356 | to | 1412 | |||
Enguerrand | Coucy | 1035 | 1116 | I | Count of Amiens | 1085 | 1116 | Enguerrand of Coucy (1035–1116) | Enguerrand | I | of | Coucy | , | Count of Amiens | from | 1085 | to | 1116 | |||
Louis | Valois-Orléans | 1372 | 1407 | I | Count of Angoulême | 1394 | 1407 | Louis of Valois-Orléans (1372–1407) | Louis | I | of | Valois-Orléans | , | Count of Angoulême | from | 1394 | to | 1407 | |||
François | Valois-Angoulême | 1494 | 1547 | I | Count of Angoulême | 1496 | 1515 | François of Valois-Angoulême (1494–1547) | François | I | of | Valois-Angoulême | , | Count of Angoulême | from | 1496 | to | 1515 | |||
Geoffroy | Gâtinais-Anjou | 1113 | 1151 | V | Count of Anjou | 1129 | 1151 | Geoffroy of Gâtinais-Anjou (1113–1151) | Geoffroy | V | of | Gâtinais-Anjou | , | Count of Anjou | from | 1129 | to | 1151 | |||
Henri | Plantagenet | 1133 | 1189 | I | Count of Anjou | 1151 | 1189 | Henri of Plantagenet (1133–1189) | Henri | I | of | Plantagenet | , | Count of Anjou | from | 1151 | to | 1189 | |||
Richard | Plantagenet | 1157 | 1199 | I | Count of Anjou | 1189 | 1199 | Richard of Plantagenet (1157–1199) | Richard | I | of | Plantagenet | , | Count of Anjou | from | 1189 | to | 1199 | |||
Jean | Plantagenet | 1166 | 1216 | I | Count of Anjou | 1199 | 1204 | Jean of Plantagenet (1166–1216) | Jean | I | of | Plantagenet | , | Count of Anjou | from | 1199 | to | 1204 | |||
Jean | Valois | 1319 | 1364 | II | Count of Anjou | 1332 | 1350 | Jean of Valois (1319–1364) | Jean | II | of | Valois | , | Count of Anjou | from | 1332 | to | 1350 |
Colonne A Prénom: est vraiment le prénom d’une personnes
Colonne B Famille: est la Maison à laquelle la personne appartient
Colonne C DateNaissance: est l’année de naissance de la personne en chiffre mais dans une case formatée en texte
Colonne D DateDécès: est l’année de décès de la personne en chiffre mais dans une case formatée en texte
Colonne E NumTitre: est la numérotation romaine du titre que la personne de la ligne en question, donc I, II, III, IV etc
Colonne F Titre: c’est le titre de noblesse que la personne de la ligne en question a porté, donc King of France par example. Si la personne a portée plusieurs titres, elle a plusieurs lignes dans ma base de données
Colonne G ComplémentTitre: est généralement associé aux femmes pour préciser qu’elle règnent de leur plein droit ou à leur enfants pour dire qu’ils règnent du droit de leur mère
Colonne H et I: est l’année de début et de fin du règne du titre en question, encore une fois la donnée inscrite est en chiffre mais dans une case formatée en texte
Colonne J Image: case peu importante
Colonne K NomComplet: est le nom unique par lequel je peux reconnaître la personne, la case contient une formule, la voici:
=A5 & " of " & B5 & " (" & C5 & “–” & D5 & “)”
Donc le nom unique de la première personne de la base de donnée est François of Lorraine-Guise (1519-1563)
Maintenant j’ai une macro qui filtres tous les noms uniques de colonne K NomComplet (puisque pour une même personne il y a souvent plusieurs lignes car la personne a portée plusieurs titres dans sa vie) et filtre le tout pour enlever tous les doublons et lister le tout dans la colonne A de la feuille Liste. Donc un colonne de noms uniques.
Sur la feuille InfoBox, une case avec un menu déroulant affichant cette fameuse liste me permet d’afficher une petite fiche visuellement plus agréable de la personne avec tous les titre qu’elle a portée dans sa vie par ordre croissant de date de début de règne.
En colonne B de la feuille Liste, une macro filtre de manière identique les titres de noblesse de la colonne F de la feuille Données et me permet de sortir les titres de noblesse uniques et de les lister là.
MON PROBLÈME COMMENCE ICI
Juste à coté de ma première Infobox qui se situe en gros de A1 jusqu’à F au complet sur la feuille InfoBox, j’aimerais avoir une seconde infobox pour les titres.
Suite à la sélection d’un titre de noblesse unique que l’on mettrait dans un menu déroulant en case G2 de la feuille Données, menu déroulant qui listerait les titres uniques déjà listés en Colonne B de la feuille Liste, une liste apparaîtrait à partir de la ligne 4 de la feuille InfoBox en colonne G à L certaines des données de la feuille Données.
Donc le menu déroulant en G2 me permettrait de choisir un titre qu’une macro irait rechercher au sein de la colonne F de la feuille Données et en ressortirait toutes les occurrences ainsi que d’autre données. J’aimerais que le résultat final ressemble à ça.
J’ai besoin que la colonne G4 en descendant liste les NomComplet uniques de la colonne K de Données
J’ai besoin que la colonne H4 en descendant liste les NumTitre de la colonne E de Données
J’ai besoin que la colonne I4 en descendant liste les Titre de la colonne F de Données
J’ai besoin que la colonne J4 en descendant liste les ComplémentTitre de la colonne G de Données
J’ai besoin que la colonne K4 & L4 en descendant liste les DébutRègne & FinRègne des colonnes H & I de Données
Mon problème est que je n’y arrive pas et que peu importe ce que je fais j’obtiens toujours une suite de nom et dates identiques. Si le titre est listé 40 fois dans la colonne F Titre, j’aurai dans mon infobox 40 lignes du même nom et des mêmes dates. Donc ma macro recherche bien, et trouve, le bon nombre de personnes ayant portés le titre mais est incapable de les lister. Voici ce à quoi ressemble ma liste une fois que je lui demande les Count of Anjou
NomComplet | NumTitre | Titre | ComplémentTitre | DébutRègne | FinRègne |
---|---|---|---|---|---|
Jean of Valois (1319–1364) | II | Count of Anjou | 1332 | 1350 | |
Jean of Valois (1319–1364) | II | Count of Anjou | 1332 | 1350 | |
Jean of Valois (1319–1364) | II | Count of Anjou | 1332 | 1350 | |
Jean of Valois (1319–1364) | II | Count of Anjou | 1332 | 1350 | |
Jean of Valois (1319–1364) | II | Count of Anjou | 1332 | 1350 |
Voici le code de ma macro qui me fourni les mauvais résultats et comment puis-je obtenir les bons résultats :
Sub AfficherTitresParSelection()
Dim oDoc As Object
Dim oSheetInfobox As Object
Dim oSheetData As Object
Dim oCellTitre As Object
Dim titreSelectionne As String
Dim oRangeData As Object
Dim dataArray As Variant
Dim i As Long, j As Long
Dim matches() As Variant
Dim matchCount As Long
' Obtenir les feuilles
oDoc = ThisComponent
oSheetInfobox = oDoc.Sheets.getByName("Infobox")
oSheetData = oDoc.Sheets.getByName("Données")
' Lire le titre sélectionné en G2
oCellTitre = oSheetInfobox.getCellRangeByName("G2")
titreSelectionne = Trim(oCellTitre.String)
If titreSelectionne = "" Then
MsgBox "Veuillez sélectionner un titre."
Exit Sub
End If
' Nettoyer la zone de résultat (G4:M1000)
oSheetInfobox.getCellRangeByName("G4:M1000").clearContents(7)
' Charger les données A2:K10001 (10 000 lignes)
oRangeData = oSheetData.getCellRangeByPosition(0, 1, 10, 10000)
dataArray = oRangeData.getDataArray()
matchCount = 0
For i = 0 To UBound(dataArray)
If dataArray(i)(5) = titreSelectionne Then ' Colonne F (Titre)
' Créer une NOUVELLE ligne indépendante à CHAQUE itération
Dim ligneTrouvee(5) As Variant
ligneTrouvee(0) = dataArray(i)(10) ' K - NomComplet
ligneTrouvee(1) = dataArray(i)(4) ' E - NumTitre
ligneTrouvee(2) = dataArray(i)(5) ' F - Titre
ligneTrouvee(3) = dataArray(i)(6) ' G - ComplémentTitre
ligneTrouvee(4) = dataArray(i)(7) ' H - DébutRègne
ligneTrouvee(5) = dataArray(i)(8) ' I - FinRègne
' Ajouter à matches()
ReDim Preserve matches(matchCount)
matches(matchCount) = ligneTrouvee
matchCount = matchCount + 1
End If
Next i
' Trier matches() par DébutRègne (index 4)
Dim sorted As Boolean
Dim temp As Variant
Do
sorted = True
For i = 0 To matchCount - 2
If matches(i)(4) > matches(i + 1)(4) Then
temp = matches(i)
matches(i) = matches(i + 1)
matches(i + 1) = temp
sorted = False
End If
Next i
Loop Until sorted
' Afficher les résultats à partir de G4
For i = 0 To matchCount - 1
For j = 0 To 5
oSheetInfobox.getCellByPosition(j + 6, i + 3).String = matches(i)(j)
Next j
Next i
MsgBox matchCount & " résultat(s) affiché(s) pour le titre : '" & titreSelectionne & "'"
End Sub