XL 2013 comment afficher sur un userform des valeurs venant de deux feuilles différentes avec n° de référence commun

donpopo

XLDnaute Occasionnel
Bonjour le forum,
Je m'explique:

J'ai deux feuilles Locataires et Biens.

Lorsque je crée un bail, un numéro de référence identique se met sur la ligne du locataire en colonne Y dans la feuille Locataires et sur la ligne du bien loué en colonne K dans la feuille Biens.

Sur un userform, je souhaite afficher les coordonnées du locataire à l'aide d'un combobox ne reprenant que les locataires ayant un bail (cela c'est OK).
Sur ce même userform, je souhaite aussi afficher automatiquement les coordonnées du bien lié par bail sur base du numéro de référence commun.

Là, je cale. J'ai compulsé plusieurs pages de forums: soit cela ne fonctionne pas, soit je ne comprends pas la manière de procéder.

J'espère avoir été assez clair dans mes propos.

Merci de votre aide.
Donpopo
 

donpopo

XLDnaute Occasionnel
Bonsoir,
je veux bien faire suivre le fichier, mais il est assez gros et de plus, beaucoup me diront encore que les procédures ont été construites en dépit du bon sens . Mais je programme comme un débutant; je ne suis pas un pro VBA.
Le fichier ne comporte aucune données personnelles.
Là où je bloque c'est dans la procédure du userform Form_Gest_Bail à la procédure Combobox Change.
Lorsque je clique sur le combobox, le bien apparait bien, mais je n'arrive pas à faire apparaitre le locataire lié à ce bien.
 

Pièces jointes

  • essai - Copie.xlsm
    200 KB · Affichages: 13

bbb38

XLDnaute Accro
Bonjour donpopo, Robert, le forum,
Attention, ta description des biens doit être plus complète, car si tu indiques 2EME ETAGE pour différents biens, il sera difficile de trouver le bien recherché (sauf erreur de ma part – les experts de ce forum pourront me contredire)
Dans ton exemple, la ComboBox indique bien le 2ème étage, mais les coordonnées correspondent à la description « les biens ».
Si tu me permets d’apporter quelques modifications sur ton formulaire, j’effectuerai les rectifications nécessaires (codes).
Cordialement,
Bernard
 

donpopo

XLDnaute Occasionnel
Bonjour Bernard,

J’avais déjà remarqué cette erreur lors du chargement des données avec la combobox. Pour ta remarque concernant l’identification du bien, c’est vrai que ce n’est pas très précis. Mais ce sont uniquement des données entrées pour tester.
Tu peux sans problème apporter des modifications à ce programme. Cela ne pourra que m’aider.
Bonne journée,
Georges
 

cp4

XLDnaute Barbatruc
Bonjour Donpopo, bbb38, Robert,

Robert a réclamé un fichier pour t'aider.
J'ai ouvert ton fichier. Les données ne sont pas correctement renseignées.
En effet, feuille locataires 2 premières lignes non renseignées.
1613294460080.png

Feuille Biens
1613294543996.png

BEYNE dans colonne code postal, cp 4100 dans ville.
Les données sont pratiquement identiques. Comment faire des tests sérieux?
Tu ne pourrais pas fournir au moins 2 ou 3 lignes avec des données reflétant la réalité.

Bon dimanche.

edit: un essai, attention la colonne C (Appartement) ne doit pas comporter de doublons.
 

Pièces jointes

  • Copie de essai - Copie.xlsm
    157.2 KB · Affichages: 5
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour le fil, bonjour le forum,

D'accord avec les autres pour dire que ton fichier est bien mal foutu pour les données. Quant au code ce n'est pas si mal que tu le dis... Mais quand on a besoin d'aide on prend au moins le temps de proposer un exemple correct...
Ceci étant dit, j'ai modifié ton fichier. Dans l'userform j'ai remplacé la TextBox par une Combobox pour le Numéro de Bail et fait l'inverse pour la Description.
Ensuite j'ai attribué une valeur à la propriété Tag des contrôles. Cette propriété est composée de deux parties séparées par un trait d'union, l'onglet et la colonne. Le code permet ainsi de récupérer les valeurs des deux tableaux dans les contrôles.
La partie de code modifié :

VB:
Private Nr_Lign As Integer
Private OB As Worksheet
Private OL As Worksheet

'---------------------------------------------------------
'A l'ouverture du userform, initialise la liste déroulante
'---------------------------------------------------------
Private Sub userform_initialize()
Dim I As Integer 'déclare la variable I (Incrément)

Me.ComboBox1.ColumnCount = 2 'définit le nombre de colonne de la ComboBox1
Me.ComboBox1.ColumnWidths = "0" 'taille des colonnes (ici la colonne 0 sera masquée)
Set OB = Worksheets("Biens") 'définit l'onglet OB
Set OL = Worksheets("Locataires") 'définit l'onglet OL
For I = 3 To OB.Cells(Application.Rows.Count, "A").End(xlUp).Row 'boucle sur toutes les lignes I (de 3 à la dernière ligne éditée de la colonne A de l'onglet OB)
    If OB.Cells(I, "K").Value <> "" Then 'condition : si la cellule ligne I colonne K de l'onglet OB n'est pas vide
        With Me.ComboBox1 'prends en compte la ComboBox1
            .AddItem 'ajoute un élément
            .Column(0, .ListCount - 1) = I 'récupère le numéro de ligne I dans la colonne 0 (masquée)
            .Column(1, .ListCount - 1) = OB.Cells(I, "K").Value 'récupère le numéro du bail dans la colonne 1
        End With 'fin de la prise en compte de la ComboBox1
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

'--------------------------------------------------------
'Suivant choix du bien remplir formulaire non modifiable
'--------------------------------------------------------
Private Sub ComboBox1_Change()
Dim I As Integer 'déclare la variable I (Incrément)
Dim LB As Integer 'déclare la variable LB (Ligne Biens)
Dim LL As Integer 'déclare la variable LL (Ligne Locataire)
Dim CTRL As Control 'déclare la variable CTRL (ConTRôLe)
Dim O As Worksheet 'déclare la variable O (Onget)
Dim COL As String 'déclare la variable COL (COLonne)

If ComboBox1.ListIndex = -1 Then Exit Sub
For I = 5 To OL.Cells(Application.Rows.Count, "A").End(xlUp).Row 'boucle sur toutes les lignes I (de 5 à la dernière ligne éditée de la colonne A de l'onglet OL)
    'si la cellule ligne I colonne Y de l'onglet OL est égale au Numéro de bail dans la colonne 1 de la ComboBox1, définit la ligne de locataire LL, sort de la boucle
    If OL.Cells(I, "Y").Value = Me.ComboBox1.Column(1, Me.ComboBox1.ListIndex) Then LL = I: Exit For 'si la celllue ligne I colonne Y de l'onglet OL est égale au N0uméro de bail dans la colonne 1 de la ComboBox1, de;finit la ligne de 'ocataire LL
Next I 'prochaine ligne de la boucle
For Each CTRL In Me.Controls 'boucle sur tous les contrôle de l'userform
    If CTRL.Tag <> "" Then 'condition : si la propriété [Tag] du contrôle n'est pas vide
        Set O = Worksheets(Split(CTRL.Tag, "-")(0)) 'définit l'onglet O (texte avant le tiret de la propriété [Tag] du contrôle)
        COL = Split(CTRL.Tag, "-")(1) 'définit la colonne COL (texte après le tiret de la propriété [Tag] du contrôle)
        Select Case O.Name 'agit en fonction de l'onglet O
            Case "Biens" 'cas "Biens"
                LB = Me.ComboBox1.Column(0, Me.ComboBox1.ListIndex) 'définit la ligne Bien (dans la colonne masquée 0 de la ComboBox1)
                CTRL.Value = O.Cells(LB, COL) 'récupère la valeur de la cellue ligne LB colonne COL de l'onlet O dans le contrôle de la boucle
            Case "Locataires" 'cas "Locataires"
                CTRL.Value = O.Cells(LL, COL) 'récupère la valeur de la cellue ligne LL colonne COL de l'onlet O dans le contrôle de la boucle
        End Select 'fin de l'action en fonction de l'onglet O
    End If 'fin de la condition
Next CTRL 'prochain contrôle de la boucle
'Call Locked(True)
End Sub

Le fichier :
 

Pièces jointes

  • Donpopo_ED_v01.xlsm
    159.1 KB · Affichages: 14

donpopo

XLDnaute Occasionnel
Bonjour bb38, Cp4 et robert,

Merci pour les propositions. Je vais les examiner cet après-midi.

Pour les renseignements encodés dans Biens, il est vrai que, dans la précipitation, j'ai oublié de les mettre à jour d'une manière correcte.

Quant à la colonne Appartement, en fait, il s'agit d'une numérotation postale belge des immeubles à appartements; il risque donc d'y avoir des doublons (0=appart du rez, 01=appart 1 du rez, 02= appart 2 du rez, 2=appart 2ème étage et ainsi de suite). Mais je pense que je pourrais m'en passer. Cette référence postale n'est pas nécessaire dans un bail.

Par contre, j'ai remarqué un autre petit problème dans mon programme. En effet, j'ai voulu supprimer tous les biens par le formulaire gestion de biens afin de les réencoder correctement.
Les deux premiers des trois biens s'annulent sans problème; mais j'ai alors de suite une erreur "Impossible de définir la propriété Listindex", alors qu'il reste un bien. Je ne comprend pas où se situe l'erreur.

Merci encore,
Georges
 

Robert

XLDnaute Barbatruc
Repose en paix
Re,

Modification d'une partie du code de l'UserForm Form_Gest_Biens :

VB:
Option Explicit
Private OB As Worksheet
Private OL As Worksheet
Private Nr_Lign As Integer

'-----------------------
'Initialisation UserForm
'-----------------------
Private Sub userform_initialize()
Set OB = Worksheets("Biens")
Set OL = Worksheets("Locataires")
Bout_OK.Visible = False
Label43.Visible = False
Bout_suppr_gest_bien.Locked = False
Label45.Visible = False
Call SetComboBox
End Sub

'---------------------------
'Valorisation de la ComboBox
'---------------------------
Private Sub SetComboBox()
Dim DL As Integer

DL = OB.Cells(Application.Rows.Count, "A").End(xlUp).Row
If DL = 3 Then Me.ComboBox1.AddItem OB.Range("A3").Value Else ComboBox1.List = OB.Range("A3:A" & DL).Value
End Sub
 

Discussions similaires