BESOIN D'AIDE pour une Macro

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

@M_F_Gervais ,

Au lieu de joindre un fichier contenant les données indispensables, tu obliges chaque assistant à copier les données ici et à créer son propre fichier, très malin.

https://ask.libreoffice.org/faq#improve

Désolé, dans le post original, j’ai mis un lien pour le fichier.

1 Like

Bonjour,
C’est ton tri qui n’est pas bon. Je t’avoue que je n’ai pas le temps aujourd’hui mais je t’ai rajouté des messages pour que tu constates le problème. Avant le tri c’est ok.
Dans les macros exemples données avec le livre de Bernard Marcelly et laurebt Godard le châpitre 9 traite des tris.
Tu peux remplir des lignes résultats non triées et les trier ensuite avec ces macros.
Si tu tiens à le faire avant de remplir et si tu as des soucis, n’hésite pas à revenir vers nous.
[cijoint.org service libre pour pieces jointes libres (sud-ouest2.org)]

[cijoint.org service libre pour pieces jointes libres (sud-ouest2.org)]

Bon courage
Claude

Bonjour, mais comme je ne suis pas programmeur mais plutôt restaurateur qui fait de la généalogie dans ses temps libres… C’est ChatGPT qui a programmé la totalité de mes macros. Mais il n’arrive pas à bien saisir son erreur et tourne en rond sans me donner de vrais solutions. Moi ces trucs là, malheureusement pour moi, je n’y comprends rien. Donc si quelqu’un pouvait m’aider j’en serais très heureux!

Problème XY — Wikipédia

il serait plus raisonnable d’utliser des solutions dédiées → Les meilleurs logiciels de généalogie : explorez vos racines en quelques clics - Les Numériques

@fpy, sans blague, je demande de l’aide pour effectuer une tâche qui, j’en suis persuadé, se résoudrait plutôt simplement pour quelqu’un qui s’y connaît. Je demande de l’aide parce que je ne suis pas programmeur, comme vous n’êtes pas restaurateur. Je vous aiderais si vous le deveniez et que vous demandiez de l’aide. J’utilise déjà des « solutions dédiées » et c’est parce que j’ai à gérer des milliers d’individus que je crée une base de données avec un programme de création de base de données. Donc, encore une fois, une solution donnée et… raisonnable.

pourquoi pas. mais clairement; il existe beaucoup plus raisonnable. la liste de solutions donnée en lien précédemment est plutot claire. mais chacun est libre de s’informer, ou non.


et pour éviter toute confusion :

Base | Communauté LibreOffice francophone

merci! chatgpt m’a produit un business plan de 100 pages, qu’hélas la banque et les autorités sanitaires ont refusé parce que j’ai ni expérience ni fonds propres.
voudriez-vous le relire et le corriger pour que le projet aboutisse, parce que je suis persuadé qu’on peut faire 50 couverts avec 3 réchauds à gaz et une glacière de surgelés :expressionless:


Une étude révèle que les outils d'IA de codage ralentissent les développeurs tout en leur donnant l'illusion d'être plus rapides, ils ont mis 19 % plus de temps à accomplir les tâches de codage