Recherche dans une listbox avec colonnes

Résolu
DGVDR Messages postés 158 Date d'inscription   Statut Membre Dernière intervention   -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Grace à ce forum j'ai pu mettre en place une listbox composée de 5 colonnes.

L'idée maintenant, c'est de sélectionner ( par un clic) une ligne de ma liste box, et d'extraire la valeur de la colonne 1.

Car à l'heure actuelle j'ai :

Codification = Sheets("Stock").Columns(1).Cells.Find(PlagePièces.Value, LookAt:=xlWhole).Offset(0, -1).Value

Le code ne fonctionne pas et je pense que c'est lié au fait qu'il faille préciser la ligne ci-dessus en lui disant de chercher dans la 1ere colonne de ma listbox nommée "PlagePièces".
Que ma variable codification, prenne la valeur PlagePièce.Value, mais de la colonne 1 de cette dernière.

Avez-vous des idées ?
Est-ce possible ?

Merci.

DGVDR

8 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Pour extraire la valeur contenue dans la première colonne d'une listbox multi de la ligne sélectionnée :

    If ListBox1.ListIndex = -1 Then Exit Sub
    MsgBox ListBox1.List(ListBox1.ListIndex)

    0
  2. DGVDR Messages postés 158 Date d'inscription   Statut Membre Dernière intervention  
     
    Merci pijaku,

    Je regarde ça des que possible !

    DGVDR
    0
  3. DGVDR Messages postés 158 Date d'inscription   Statut Membre Dernière intervention  
     
    Bonjour,

    Peux tu m'expliquer ton code ?

    If ListBox1.ListIndex = -1 Then Exit Sub 

    MsgBox ListBox1.List(ListBox1.ListIndex)1

    Le "1" tout à la fin est une erreur ?

    Avec ce code, en fonction de ma selection dans la listbox,je ne vois pas comment extraire dans ma donnée codification la valeur de la première colonne. Peux tu m'expliquer ?

    Merci,

    DGVDR
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut,

      Le 1 est une erreur, d'ailleurs il ne figure pas dans le code que je t'ai donné plus haut...

      Listbox1.ListIndex représente l'index de la ligne de la listbox1 qui est sélectionné.
      Lorsque rien n'est sélectionné, Listbox1.ListIndex vaut - 1.
      Si tu sélectionne la 1ère ligne Listbox1.ListIndex vaut 0
      etc etc...

      Listbox1.List(Listbox1.ListIndex) renvoie la valeur correspondante à Listbox1.ListIndex, donc à la valeur sélectionnée dans la listbox.
      Cependant, ListBox1.List(ListBox1.ListIndex) renvoie une erreur si rien n'est sélectionné... D'où le :
      If ListBox1.ListIndex = -1 Then Exit Sub


      Je ne vois pas comment extraire dans ma donnée codification la valeur de la première colonne
      Qu'entends tu par 1ère colonne???
      1ère colonne de ta Listbox?
      1ère colonne de ta feuille "Feuil3"?
      Autre 1ère colonne?
      0
    2. DGVDR Messages postés 158 Date d'inscription   Statut Membre Dernière intervention  
       
      La 1ère colonne de ma Listbox !

      Merci,

      DGVDR
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Le code pour retourner la valeur contenue dans la ligne sélectionnée de :

      La 1ère colonne de la ListBox1 :
      If listBox1.listIndex = -1 Then Exit Sub
      MsgBox ListBox1.List(ListBox1.ListIndex)


      La deuxième colonne de la ListBox1 :
      ListBox1.List(ListBox1.ListIndex, 1)


      La troisième colonne de la ListBox1 :
      ListBox1.List(ListBox1.ListIndex, 2)


      Etc...
      0
  4. DGVDR
     
    Bonjour,

    Codification = Sheets("Stock").Columns(1).Cells.Find(ListBox1.List(ListBox1.ListIndex).Value, LookAt:=xlWhole).Offset(0, -1).Value

    Ca ne semble pas correct.

    Des idées de correction ?

    Merci,

    DGVDR
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Essaie ceci :
    Codification = Sheets("Stock").Columns(1).Cells.Find(ListBox1.List(ListBox1.ListIndex), LookAt:=xlWhole).Offset(0, 1).Value


    <italique>Cordialement,
    Franck
    'Pensez aux balises de code : bouton <>, 
    'Précisez le langage dans la liste déroulante. Ex : code java
    0
  7. DGVDR
     
    Bonjour,

    J'espère que vous avez passé de bonnes fêtes,

    La ligne de code ne convient pas :

    "Erreur d'execution "424" Objet requis"

    Merci,

    DGVDR
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Sans le fichier, ni boule de cristal, ça va devenir hard de t'aider...
      0
    2. DGVDR
       
      Je cherche à te joindre mon fichier, cependant Cjoin ne fonctionne pas.

      Connais-tu d'autres sites similaire de stockage sans inscription ?

      Merci,

      DGVDR
      0
  8. DGVDR
     
    Bonjour,

    Cjoin marche de nouveau :

    http://cjoint.com/?3LBiU5vtkqQ

    Le code pour accéder au VBA est "unzo"

    Le code mentionné ci-dessus ce trouve dans l'Userform "gestionstock"

    Merci,

    DGVDR
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour,

      J'ai regardé le fichier proposé. Le code est bon. Il s'agit maintenant de savoir l'adapter...

      1ère Erreur
      Je vais t'expliquer la méthode find utilisée ici, tu va l'adapter à ton cas. En cas de difficulté, je suis dispo...

      Codification = Sheets("Stock").Columns(1).Cells.Find(PlagePièces.List(PlagePièces.ListIndex), LookAt:=xlWhole).Offset(0, 1).Value

      Méthode Find = Je cherche

      Quoi?
      PlagePièces.List(PlagePièces.ListIndex)
      = Le contenu de la 1ère colonne de la ligne sélectionnée dans la listbox appelée PlagePièces.

      Ou?
      Sheets("Stock").Columns(1).Cells
      = Dans les cellules de la colonne 1 de la feuille Stock.
      Est ce vraiment là que se trouvent tes pièces?
      perso, je les vois plus en colonne 2...

      Qu'elle valeur renvoyer?
      .Offset(0, 1).Value
      Le contenu de la cellule à DROITE de la cellule trouvée. (Idem, ce n'est pas ce que tu veux).

      LookAt:=xlWhole
      Est un paramètre facultatif. Il indique que tu cherches la valeur exacte. Dans ton cas, il n'est pas primordial.


      2ème Erreur
      Qu'est ce que Codification?
      une variable.
      Que va t-elle être amenée à stocker?
      Une chaîne de caractère? Un nombre? Un Objet?
      Dans ton cas, une chaine de caractères. Donc ...
      déclare la As String, pas As Integer...
      Dim Codification As String
      0
  9. DGVDR
     
    Bonjour Pijaku,

    J'apprécis énormément la pédagogie que tu apportes, merci beaucoup.

    J'ai donc travailler dessus et ça donne :

    Private Sub Commander_Click()
    Dim i As Integer, j As Byte, rngTrouve As Range
    Dim Codification As String

    If PlagePièces.ListIndex = -1 Then Exit Sub

    i = 2

    Codification = Sheets("Stock").Columns(2).Cells.Find(PlagePièces.List(PlagePièces.ListIndex)).Value

    Do While Sheets("Stock").Cells(i, 2) <> ""

    If Left(Sheets("Stock").Cells(i, 2), 8) = Codification Then 'si les 8 premiers caractères du code pièce correspondent à la codification

    Pièce = Sheets("Stock").Cells(i, 2)
    Fourn = Sheets("Stock").Cells(i, 5)

    With Sheets("Commandes")

    j = .Range("A65536").End(xlUp).Row
    .Range("A" & j) = Pièce
    .Range("D" & j) = Fourn

    End With

    End If

    i = i + 1 'on passe à la ligne suivante

    Loop

    End Sub

    Cependant je ne retrouve pas mes infos dans la feuille "Commandes"

    Peux-tu m'éclairer de nouveau ?
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Et pourtant elles y sont...
      Regarde ta 1ère ligne (ligne d'entête)...

      En fait,
      j = .Range("A65536").End(xlUp).Row
      te donne le numéro de la dernière ligne non vide. Pour la 1ère ligne vide, ajoute 1 :
       j = .Range("A65536").End(xlUp).Row + 1

      Ensuite, je ne comprends pas bien tout le reste de ta macro... La boucle est inutile...
      En gros, tu cherches, dans ta feuille Stock, la pièce sélectionnée dans la listbox. Une fois trouvée cette pièce, tu cherches le fournisseur.
      Ce code devrait suffire :
      Private Sub Commander_Click()
      Dim i As Integer, j As Integer, Piece As String, Fourn As String

      If PlagePièces.ListIndex = -1 Then Exit Sub

      i = Sheets("Stock").Columns(2).Cells.Find(PlagePièces.List(PlagePièces.ListIndex)).Row
      Piece = Sheets("Stock").Cells(i, 2)
      Fourn = Sheets("Stock").Cells(i, 5)

      With Sheets("Commandes")
      j = .Range("A65536").End(xlUp).Row
      .Range("A" & j) = Pièce
      .Range("D" & j) = Fourn
      End With
      End Sub
      Ou encore :
      Private Sub Commander_Click()
      Dim i As Integer, j As Integer

      If PlagePièces.ListIndex = -1 Then Exit Sub
      i = Sheets("Stock").Columns(2).Cells.Find(PlagePièces.List(PlagePièces.ListIndex)).Row
      With Sheets("Commandes")
      j = .Range("A65536").End(xlUp).Row
      .Range("A" & j) = Sheets("Stock").Cells(i, 2)
      .Range("D" & j) = Sheets("Stock").Cells(i, 5)
      End With
      End Sub

      A moins que je n'ai pas tout compris...
      0
    2. DGVDR
       
      Petit problème lié au forum,

      J'ai beaucoup de mal à extraire le code de tes "boites"

      Ca me le met en ligne quand je le copie colle, avec le fameux "1" à la fin, ca n'est pas la méthode à suivre ?
      0
    3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Retente maintenant...
      0
    4. DGVDR
       
      Merci beaucoup,

      ça marche c'est parfait.

      Peux-tu quand même m'indiquer comment extraire le code de ce genre de "boite"

      Egalement, peux tu m'expliquer le Offset(0, 1).

      -> Ca prend selectionne la case à droite de ce que je cherchais.

      Je peux voir à selectionné à gauche ? deux cases à droite ...?

      Encore merci Pijaku
      0
    5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Peux-tu quand même m'indiquer comment extraire le code de ce genre de "boite"
      Il s'agit d'un bug (temporaire?) du site. Normalement un copié collé suffit... Ca va s'arranger...

      OffSet = décalage.
      (0, 1) = 0 ligne, 1 colonne à droite
      (-1, 2) = 1 ligne au dessus, 2 colonnes à droite
      (12, -15) = 12 lignes au dessous et 15 colonnes à gauche.

      Attention dans ces manipulations à vérifier systématiquement l'existence de la cellule.
      Les colonnes commencent à 1 (colonne A), les lignes également...

      Par exemple :
      Range("F5").Offset(0, -6) va renvoyer une erreur.
      0