Positionnement dans un fichier

Bonjour tout le monde,

Voilà mon problème.

J'ai un fichier Excel A qui représente un arbre généalogique.

Dans chacune des cellules de l'arbre il y a le nom d'un ancêtre.

Dans un autre fichier Excel B il y a la liste de chaque ancêtre suivi de renseignements sur ce dernier (tout sur la même ligne).

Je voudrais qu'en cliquant sur un ancêtre du fichier A, le fichier B s'ouvre et sélectionne la ligne de l'ancêtre en question.

Merci d'avance si vous pouvez m'aider

Cordialement

Bonjour,

Joins une version allégée de ton "arbre", ainsi que du fichier avec la liste, qu'on puisse visualiser, tester (le cas échéant) et proposer des pistes concrètes.

Merci U.Milité !

Ci-joints deux fichiers légers.

Cordialement

14fichier-a.xlsx (10.11 Ko)
13fichier-b.xlsx (8.64 Ko)

Salut Landry, U.Milité,

bête question, me diras-tu mais pourquoi n'inclus-tu pas ton FichierB dans le FichierA?

Tu aurais tout sous la main!

A+

Bonjour,

Une piste à mettre dans le module de la feuille du fichier "Fichier_A.xlsx". Le résultat en ligne 1 à partir de A1. Comme curulis57 ( U. Milité ), je pense qu'il serait plus simple d'utiliser une autre feuille du classeur plutôt qu'un autre classeur mais c'est toi qui vois :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim Cls As Workbook
    Dim Plage As Range
    Dim Cel As Range

    If Target.Value = "" Then Exit Sub

    On Error Resume Next
    Set Cls = Workbooks("Fichier_B.xlsx")
    If Err.Number <> 0 Then Set Cls = Workbooks.Open(ThisWorkbook.Path & "\" & "Fichier_B.xlsx")
    On Error GoTo 0

    With Cls.Worksheets("Feuil1"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    Set Cel = Plage.Find(Target.Value, , xlValues, xlWhole)

    If Not Cel Is Nothing Then

    End If

    With Cls.Worksheets("Feuil1"): Set Plage = .Range(.Cells(Cel.Row, 1), .Cells(Cel.Row, Columns.Count).End(xlToLeft)): End With

    With ThisWorkbook.Worksheets("Feuil1"): .Range(.Cells(1, 1), .Cells(1, Plage.Columns.Count)).Value = Plage.Value: End With

End Sub

Merci à vous Curulis57 et Theze (dis-donc les gars, vous vous levez de bonne heure !

Effectivement, je peux mettre la liste sur une autre feuille du même fichier, il n'empêche qu'il faudra se positionner sur 1 des 3000 ancêtres présents dans la liste (pour éviter une recherche fastidieuse).

Vos remarques me donnent une idée : Serait-il possible qu'en cliquant sur un ancêtre au niveau de l'arbre, une fiche reprenant tous les renseignements s'affiche ?

Bien à vous

Landry

Tu aurais même 1.000.000 d'ancêtres que ça ne poserait pas de problème....

Réunis tes deux fichiers et explique-nous ta fiche !

A+

Re,

Voici le code modifié pour une seconde feuille nommée "Feuil2" servant de base de données :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim Fe As Worksheet
    Dim Plage As Range
    Dim Cel As Range

    If Target.Value = "" Then Exit Sub

    Set Fe = Worksheets("Feuil2")

    With Fe: Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    Set Cel = Plage.Find(Target.Value, , xlValues, xlWhole)

    If Not Cel Is Nothing Then

    End If

    With Fe: Set Plage = .Range(.Cells(Cel.Row, 1), .Cells(Cel.Row, Columns.Count).End(xlToLeft)): End With

    With Worksheets("Feuil1"): .Range(.Cells(1, 1), .Cells(1, Plage.Columns.Count)).Value = Plage.Value: End With

End Sub

A noter que la méthode Find() est très rapide pour la recherche par rapport à une boucle

Merci les gars ! C'est sympa de me consacrer du temps.

Thèze

Je vais étudier (pour la comprendre) et essayer ta macro dans les jours qui viennent. Je ne sais pas si elle me servira pour ce fichier mais elle me servira à coup sûr pour d'autres.

Curolis57

Actuellement je travaille sur des fiches manuelles dont je t'envoie un exemple (réel). J'en ai fait 600 ... et j'en ai marre ! D'autant plus que j'ai déjà 3000 ancêtres et ce n'est qu'un début !

Donc mon idée : Puisque je vais avoir un fichier avec 2 feuilles, "feuille A" pour l'arbre et "feuille B" pour la base de données des ancêtres, serait-il possible qu'en cliquant sur un ancêtre de la "feuille A", Excel m'affiche une fiche (formulaire ?) reprenant tous les renseignements pompés dans la base de données de la "feuille B". Une fiche du style de celle que je t''envoie et où j'ai supprimé les champs qui n'ont que peu d'intérêt (donc on ne les garde pas).

Merci encore à tous les deux de vous être penchés sur mon problème.

Salut Landry,

Salut Theze,

petite précision : j'imagine que, dans ton arbre, les étiquettes comportent autre chose que le NOM ? Un ou deux ou... prénoms ?

Important pour adapter le code de recherche...

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Cancel = True
If Target = "" Then Exit Sub
'
With Worksheets("BDD")
    On Error Resume Next
    iRow = .Range("B:B").Find(what:=Target, lookat:=xlWhole).Row
    If iRow <> "" Then
        .Activate
        .Rows(iRow).Select
    Else
        MsgBox "Inconnu dans la BDD !", vbInformation, "BDD - Info"
    End If
    On Error GoTo 0
End With
'
End Sub

Pour le reste, pas de panique, hein!

A+

Bonjour,

Désolé, j'avais mal lu la question (tu voulais la sélection du nom dans la base et non le rapatriement des valeurs)

Une piste avec ton formulaire. Le fichier contient trois feuille, l'organigramme, la base de données et le formulaire. Un clic sur un nom de l'organigramme affiche le formulaire avec les valeurs. Un tableau de correspondance contient les adresse de cellules où doivent être inscrites les différentes valeurs. Les adresses dans le tableau doivent correspondre aux entêtes de la base de données afin de pouvoir boucler. Le code et le fichier :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim Fe As Worksheet
    Dim Plage As Range
    Dim Cel As Range
    Dim Tbl()
    Dim I As Integer

    If Target.Value = "" Then Exit Sub

    ReDim Tbl(1 To 8) '<--- redimensionner par rapport au nombre de champs

    'faire correspondre les adresses avec les entêtes !
    Tbl(1) = "B3": Tbl(2) = "F3": Tbl(3) = "H1": Tbl(4) = "B11": Tbl(5) = "F11" 'Nom, Prénom, N°SOSA, Père, Mère
    Tbl(6) = "B5": Tbl(7) = "D5": Tbl(8) = "G5" 'Date naissance, Lieu naissance, Pays naissance
    'etc...

    Set Fe = Worksheets("BDD")

    With Fe: Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With

    Set Cel = Plage.Find(Target.Value, , xlValues, xlWhole)

    If Not Cel Is Nothing Then

        With Fe: Set Plage = .Range(.Cells(Cel.Row, 1), .Cells(Cel.Row, Columns.Count).End(xlToLeft)): End With

        For I = 1 To Plage.Count

            Worksheets("Formulaire").Range(Tbl(I)).Value = Plage(I).Value

        Next I

    End If

    Worksheets("Formulaire").Select

End Sub
11fichier-a.xlsm (23.62 Ko)

Merci Curulis57,

Effectivement, mes étiquettes ont 3 lignes :

Ligne 1 : Le nom

Ligne 2 : 1, 2 ou 3 prénoms

Ligne 3 : Une date de naissance (jj/mm/aaaa) OU une année de naissance (1859 - ?) ou une année de décès (? - 1758) OU les années de naissance et de décès (1874 - 1941)

Cordialement

Salut Landry,

voilà ton fichier à l'heure actuelle.

  • double-clic sur une cellule blanche la prépare pour un encodage d'étiquette (fond jaune + bordure) ;
  • double-clic sur une cellule jaune mais vide = annulation de la préparation à l'encodage ;
  • double-clic sur une cellule jaune complétée = recherche de l'ancêtre dans la 'BDD' :
* si présent, la ligne s'allume en 'BDD' et affichage ;

* parallèlement, la fiche se remplit via formules. Elle ne sert donc pas à encoder l'arbre généalogique!

* message si absent de 'BDD'.

- pour l'encodage de tes étiquettes, le plus facile est :

* d'abord de compléter la 'BDD' ;

* de taper simplement le code SOSA, la macro faisant le reste!

A toi de guider la suite de la manoeuvre!

A+

10genealogie.xlsm (32.89 Ko)
Rechercher des sujets similaires à "positionnement fichier"