XL 2010 Trouver Ligne A completer

cp4

XLDnaute Barbatruc
Bonjour,

J'ai besoin de votre aide. Je voudrai vérifier la présence dans un tableau la combinaison de 3 colonnes (clé).
J'ai utilisé un dictionnaire mais je bloque pour récupéré aussi le numéro (i) en item.

Autrement dit: Vérifier dans mon tableau la présence d'une clé (concaténation de 3 colonnes) et récupérer son numéro d’index (tableau structuré). Ouvert à toute proposition. Bien que je voudrais bien comprendre comment y parvenir avec un dictionnaire.

Merci.

Bonne journée.
edit: j'ai supprimé mon code car il était faux.
 
Dernière édition:
Solution
Re,

Ma proposition sans dictionary avec une fonction LigneAcompleter().
  • Le premier argument est le tableau structuré
  • Le deuxième argument est le terme n° 1 de la clef
  • Le troisième argument est le terme n° 2 de la clef
  • Le quatrième argument est le terme n° 3 de la clef
LigneAcompleter() renvoie 0 si la clef n'est pas trouvée sinon LigneAcompleter() renvoie le numéro de la ligne ListRow à compléter.

Modifier les valeur de x1, x2, x3 puis cliquer sur le bouton Hop !

VB:
Function LigneAcompleter(TS As ListObject, x1, x2, x3) As Long
  Dim T(), i As Long
  T = TS.DataBodyRange
  For i = LBound(T) To UBound(T)
    If T(i, 1) = x1 Then If T(i, 2) = x2 Then If T(i, 3) = x3 Then LigneAcompleter = i: Exit...

Dranreb

XLDnaute Barbatruc
Pourquoi persister pour une faculté dont on n'aura plus à s'occuper du tout dans la programmation de l'UserForm ?
Joignez un classeur de ce que vous avez.
Je peux éventuellement en joindre un qui gère ainsi la combinaison d'un nom et d'un prénom.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :), @cp4 :) ,

1) Attention ! une concaténation sans séparateur peut aboutir à des clefs identiques pour des données différentes.

Exemple 1 : les trois données sont 10, 11, 10. La clef serait 101110.
Exemple 2 : les trois données sont 101, 1, 10. La clef serait 101110.

Deux jeux différents de données aboutissent à la même clef.

2) Je n'ai toujours pas compris pourquoi utiliser un dictionnaire pour vérifier l'existence du triplet ("mo", "ml", "0xxx") dans le tableau T o_O et en trouver la ligne. Une simple boucle suffit, non ?
 

cp4

XLDnaute Barbatruc
La programmation d'un UserForm utilisant mon système est généralement simple. Il n'y a pas d'inquiétude à avoir. J'ai bien dit 3 ComboBox, pas 1.
Je te remercie de me tendre la main. J'ai téléchargé un de tes fichiers (CLsCAsContacts).
Par rapport à mon modeste niveau, tes codes sont au top.
Pour le moment, je les trouve trop compliqués. Je me suis inscrit au forum pour apprendre petit à petit.
Je ne parviens pas encore à me faire une fonction paramétrée.
Je n'aime pas utiliser des codes bêtement (sauf quelques fonctions de Tri du site de Feu Jacques Boisgontier [Repose en paix]), je dois au moins comprendre un minimum.
Ensuite, reprendre tout un projet autant me balancer du haut d'une tour (je plaisante).

Promis quand j'aurai plus de temps, je ferai un effort pour décortiquer tes codes (je vais faire souffrir la touche F8).

Merci.
 

Dranreb

XLDnaute Barbatruc
Il y a une fourniture munie d'une page d'aide expliquant toutes les propriétés, méthodes et évènements de mes objets ComboBoxLiées et ControlsAssociés. Mais je peux quand même répondre à toute question concernant leur utilisation. Il n'est pas utile de chercher à comprendre comment ils procèdent. Juste savoir quand se produisent les évènement Change, Résultat, Bingo et BingoUn (Un seul des 3 derniers est à prendre en charge normalement).
 
Dernière édition:

cp4

XLDnaute Barbatruc
Bonjour à tous :), @cp4 :) ,

1) Attention ! une concaténation sans séparateur peut aboutir à des clefs identiques pour des données différentes.

Exemple 1 : les trois données sont 10, 11, 10. La clef serait 101110.
Exemple 2 : les trois données sont 101, 1, 10. La clef serait 101110.

Deux jeux différents de données aboutissent à la même clef.

2) Je n'ai toujours pas compris pourquoi utiliser un dictionnaire pour vérifier l'existence du triplet ("mo", "ml", "0xxx") dans le tableau T o_O et en trouver la ligne.
Bonjour @mapomme ;),
Pour le 1), merci d'attirer mon intention. Mais pas de risque, 1er string, 2ème string et 3ème n° de sécu.

Pour le 2), d'où l'ouverture de cette discussion. Mes connaissances sont modestes et mon expérience encore plus.
L'objectif est soit de rajouter une ligne de données au tableau si ce triplet est inexistant
ou bien
Si le triplet existe, Récupérer son n° index de ligne, pour y ajouter des données.

Bonne journée.
 

cp4

XLDnaute Barbatruc
Il y a une fourniture munie d'une page d'aide expliquant toutes les propriétés, méthodes et évènements de mes objets ComboBoxLiées et ControlsAssociés. Mais je peux quand même répondre à toute question concernant leur utilisation. Il n'est pas utile de chercher à comprendre comment ils procèdent. Juste savoir quand se produisent les évènement Change, Résultat, Bingo et BingoUn (Un seul des 3 dernier est à prendre en charge normalement).
Je te remercie. Je suis ici pour apprendre et comprendre.
Encore merci pour ta gentillesse.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Ma proposition sans dictionary avec une fonction LigneAcompleter().
  • Le premier argument est le tableau structuré
  • Le deuxième argument est le terme n° 1 de la clef
  • Le troisième argument est le terme n° 2 de la clef
  • Le quatrième argument est le terme n° 3 de la clef
LigneAcompleter() renvoie 0 si la clef n'est pas trouvée sinon LigneAcompleter() renvoie le numéro de la ligne ListRow à compléter.

Modifier les valeur de x1, x2, x3 puis cliquer sur le bouton Hop !

VB:
Function LigneAcompleter(TS As ListObject, x1, x2, x3) As Long
  Dim T(), i As Long
  T = TS.DataBodyRange
  For i = LBound(T) To UBound(T)
    If T(i, 1) = x1 Then If T(i, 2) = x2 Then If T(i, 3) = x3 Then LigneAcompleter = i: Exit Function
  Next i
End Function

Sub Test()
Dim Lig As Long, x1, x2, x3
  With Range("Tb").ListObject
    x1 = [g1]: x2 = [g2]: x3 = [g3]
    Lig = LigneAcompleter(Range("Tb").ListObject, x1, x2, x3)
    If Lig > 0 Then
      MsgBox "la ligne (ListRows) à compléter du TS est la ligne existante : " & Lig
    Else
      .ListRows.Add
      Lig = .ListRows.Count
      .ListRows(Lig).Range(1) = x1: .ListRows(Lig).Range(2) = x2: .ListRows(Lig).Range(3) = x3
      MsgBox "la nouvelle ligne (ListRows) du TS complétée avec la clef est la ligne : " & Lig
    End If
  End With
End Sub
 

Pièces jointes

  • CP4- recherche clef TS- v1.xlsm
    23 KB · Affichages: 7
Dernière édition:

cp4

XLDnaute Barbatruc
Re,

Ma proposition sans dictionary avec une fonction LigneAcompleter().
  • Le premier argument est le tableau structuré
  • Le deuxième argument est le terme n° 1 de la clef
  • Le troisième argument est le terme n° 2 de la clef
  • Le quatrième argument est le terme n° 3 de la clef
LigneAcompleter() renvoie 0 si la clef n'est pas trouvée sinon LigneAcompleter() renvoie le numéro de la ligne ListRow à compléter.

Modifier les valeur de x1, x2,; x3 puis cliquer sur le bouton Hop !

VB:
Function LigneAcompleter(TS As ListObject, x1, x2, x3) As Long
  Dim T(), i As Long
  T = TS.DataBodyRange
  For i = LBound(T) To UBound(T)
    If T(i, 1) = x1 Then If T(i, 2) = x2 Then If T(i, 3) = x3 Then LigneAcompleter = i: Exit Function
  Next i
End Function

Sub Test()
Dim Lig As Long, x1, x2, x3
  With Range("Tb").ListObject
    x1 = [g1]: x2 = [g2]: x3 = [g3]
    Lig = LigneAcompleter(Range("Tb").ListObject, x1, x2, x3)
    If Lig > 0 Then
      MsgBox "la ligne (ListRows) à compléter du TS est la ligne existante : " & Lig
    Else
      .ListRows.Add
      Lig = .ListRows.Count
      .ListRows(Lig).Range(1) = x1: .ListRows(Lig).Range(2) = x2: .ListRows(Lig).Range(3) = x3
      MsgBox "la nouvelle ligne (ListRows) du TS complétée avec la clef est la ligne : " & Lig
    End If
  End With
End Sub
Rebonjour @mapomme 👏👏👏

C'est parfait. Exactement comme je voulais.

Merci beaucoup.
 

Discussions similaires