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...

cp4

XLDnaute Barbatruc
Bonjour à tous


Avec ton code tu vas compter le nombre de fois où on trouve ta clé, par le numéro de ligne....
Cordialement
Bonjour @Efgé ,

Ce que tu dis, je l'ai compris ( le i correspond à l'index de ligne du tableau structuré).
J'enregistre des données via un formulaire. Je veux bloquer l’enregistrement en doublon (est considéré comme doublon 3 critères, ceci tu l'as compris en lisant le code).
Je bloque pour affecter de i à la valeur de la clé d(T(i, 1) & T(i, 2) & T(i, 3))
J'espère que tu m'as compris. Ma méthode est peut-être inadaptée, je suis donc ouvert à toutes propositions.

Bonne journée.

nb: je ne maîtrise pas parfaitement la manipulation de Dictionary.
 

Efgé

XLDnaute Barbatruc
Re
Une proposition non testée car pas d'exemple fourni:
VB:
Sub DoublonsNbOccurence()
   Dim T(), i As Long, clé, d As Object, K As Variant
   Set d = CreateObject("scripting.dictionary")

   T = Range("Tb").ListObject.DataBodyRange
   clé = "mo" & "ml" & "0xxx"

   For i = LBound(T) To UBound(T)
      If T(i, 1) & T(i, 2) & T(i, 3) = clé Then
         d(i) = ""
      End If
   Next i
   For Each K In d.Keys
    'boucle sur les lignes comprenant la clé
   Next K
End Sub
Mais attention : Lbound(t) risque de renvoyer 0 et la première ligne de ton .DataBodyRange est 1 ...
Cordialement
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Les 3 éléments étant saisis dans 3 ComboBox, habituellement je détermine automatiquement si ça va pouvoir donner lieu à un ajout ou à une modification. Pas de doublon possible donc. Pas de programmation dans l'UserForm pour gérer les ComboBox à part une séquence déclarative dans la Sub UserForm_Initialize. Des procédures de prises en charge d'évènements informent simplement l'UserForm du cas qui se présente, et de l'éventuel numéro de ligne concerné.
 

cp4

XLDnaute Barbatruc
Re
Une proposition non testée car pas d'exemple fourni:
VB:
Sub DoublonsNbOccurence()
   Dim T(), i As Long, clé, d As Object, K As Variant
   Set d = CreateObject("scripting.dictionary")

   T = Range("Tb").ListObject.DataBodyRange
   clé = "mo" & "ml" & "0xxx"

   For i = LBound(T) To UBound(T)
      If T(i, 1) & T(i, 2) & T(i, 3) = clé Then
         d(i) = ""
      End If
   Next i
   For Each K In d.Keys
    'boucle sur les lignes comprenant la clé
   Next K
End Sub
Mais attention : Lbound(t) risque de renvoyer 0 et la première ligne de ton .DataBodyRange est 1 ...
Cordialement
Je te remercie. Je n'ai pas encore testé ta propose.
En fait, une fonction aurait été plus indiquée (je n'ai encore appris à faire des fonctions avec paramètres) dans mon cas car j'alimente mon tableau depuis une autre procédure.

La clé est constituée de 3 TextBoxs. Dans le cas où la clé existe, récupérer l'index de ligne pour ajouter une donnée dans certaines colonnes. Sinon, ajouter une ligne de données au tableau structuré.
Je pense qu'ainsi présenté, c'est plus clair.

Merci.
 

cp4

XLDnaute Barbatruc
Bonjour.
Les 3 éléments étant saisis dans 3 ComboBox, habituellement je détermine automatiquement si ça va pouvoir donner lieu à un ajout ou à une modification. Pas de doublon possible donc. Pas de programmation dans l'UserForm pour gérer les ComboBox à part une séquence déclarative dans la Sub UserForm_Initialize. Des procédures de prises en charge d'évènements informent simplement l'UserForm du cas qui se présente, et de l'éventuel numéro de ligne concerné.
Bonjour @Dranreb ,

Merci de m'avoir répondu. la clé est la concaténation de 3 textboxs.
Si tu as une fonction dans le même sens qu'expliquer dans ma réponse à @Efgé au post#8.

Bonne journée.
 

Dranreb

XLDnaute Barbatruc
Il vaut mieux bénéficier de la faculté de recherche dans sa liste d'une ComboBox pour cela. C'est avant tout une zone de saisie. C'est une erreur de croire qu'elle ne doit s'utiliser qu'en se précipitant sur son DropButton pour en afficher la liste.
 

cp4

XLDnaute Barbatruc
Il vaut mieux bénéficier de la faculté de recherche dans sa liste d'une ComboBox pour cela. C'est avant tout une zone de saisie. C'est une erreur de croire qu'elle ne doit s'utiliser qu'en se précipitant sur son DropButton pour en afficher la liste.
Je te remercie d'essayer de me convaincre d'utiliser une combobox.
Mais je te confie que j'ai la hantise de modifier mon fichier.

Encore merci.
 

cp4

XLDnaute Barbatruc
Re,
Ma solution. SVP, comment la transformer en fonction?
VB:
Dim Lig
Sub LigneExiste()
   Dim T(), i As Long, clé, d As Object
   Set d = CreateObject("scripting.dictionary")

   T = Range("Tb").ListObject.DataBodyRange
   clé = "mo" & "ml" & "0xxx"

   For i = LBound(T) To UBound(T)
      If T(i, 1) & T(i, 2) & T(i, 3) = clé Then
         If d.Exists(T(i, 1) & T(i, 2) & T(i, 3)) Then
            d(T(i, 1) & T(i, 2) & T(i, 3)) = i
         Else
            d(T(i, 1) & T(i, 2) & T(i, 3)) = d.Count + 1
            i = d.Count
         End If
      Next i
      Lig = i
   End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 276
Messages
2 086 711
Membres
103 377
dernier inscrit
fredy45