XL 2021 PB Alimentation Tableau structuré depuis un ListBox

jeff1494

XLDnaute Occasionnel
Bonjour à toutes et tous;
Je me tourne vers vous car je rencontre un problème.
Je veux mettre à jour un tableau structuré depuis un ListBox à choix multiple, or mon problème est que la mise à jour dans la feuille de destination se fait toujours sur la même ligne.
Au départ le tableau est vide.

Le fichier possède 3 feuilles :
  1. Feuille "LISTE" qui correspond à celle que je veux remplir.
  2. Feuille "Params" qui contient des paramètres utilisés dans la version complète de mon fichier.
  3. Feuille "INVENDUS" qui contient les lignes qui chargent le ListBox, et qui doivent donc être copiées dans la feuille "LISTE".
En fait une fois le formulaire affiché je dois pouvoir sélectionner plusieurs lignes puis au travers du bouton "Valider" la procédure devrait mettre à jour la feuille "LISTE".

Pour aider je joins le fichier. La procédure se trouve dans le code du formulaire.

D'avance je remercie celui ou celle qui aura la gentillesse de se pencher sur mon soucis.
Je vous souhaite à toutes et tous une bonne et heureuse année 2025.
 

Pièces jointes

  • Vente-Vide-Grenier-V08.xlsm
    135.2 KB · Affichages: 6

ChTi160

XLDnaute Barbatruc
Bonsoir jeff
Pourquoi recherches tu en Colonne A de ton tableau de la feuille "INVENDUS" , le Numéro de l'objet que tu as sélectionné dans la ListBox , alors que celle-ci et alimentée des Lignes de Ton Tableau de la feuille "INVENDUS" ?
ensuite pour ajouter une Ligne a un Tableau (autre que structuré) il faudrait incrementé ta Variable !
VB:
 Lst_Derlig = Cells(Rows.Count, 1).End(xlUp).Row + 1
on recherche la dernière Ligne Non Vide
Code:
Cells(Rows.Count, 1).End(xlUp).Row
et on y ajoute 1 soit :
Code:
Lst_Derlig = Cells(Rows.Count, 1).End(xlUp).Row + 1
Mais si tu travailles sur un Tableau structuré , il faut utiliser exemple
Code:
Set NewLigne= .ListRows.Add
Bonne fin de Journée
jean marie
 

ChTi160

XLDnaute Barbatruc
re
j'ai ajouté la désélection des Lignes après transfère !
VB:
Sub Btn_Valid_Click()
    Dim LigneSource As ListRow
    Dim LigneCible As ListRow
    Dim i As Long, j As Long
    Dim NumUnique As String
    Dim Trouve As Boolean
With Range("Tbl_INVENDUS").ListObject
    If Not .DataBodyRange Is Nothing Then
    ' Parcourir les éléments sélectionnés dans la ListBox
    For i = 0 To Vte_Inv.LB_Inv.ListCount - 1
        If Vte_Inv.LB_Inv.Selected(i) Then
            ' Récupérer le numéro dans la première colonne
            NumUnique = Vte_Inv.LB_Inv.List(i, 0)
            
            ' Rechercher la ligne correspondante dans "Tbl_INVENDUS"
            Trouve = False
            For j = 1 To .ListRows.Count
                If .ListRows(j).Range.Cells(1, 1).Value = NumUnique Then
                       Trouve = True
                    
                    ' Ajouter une nouvelle ligne à "Tbl_LISTE"
                    Set LigneCible = Range("Tbl_LISTE").ListObject.ListRows.Add
                    
                    ' Copier les données de "Tbl_INVENDUS" vers "Tbl_LISTE"
                   Set LigneSource = .ListRows(j)
                    LigneCible.Range.Value = LigneSource.Range.Value
                    
           Vte_Inv.LB_Inv.Selected(i) = False '----Ici
                    
                    Exit For
                End If
            Next j
            ' Si le numéro unique n'a pas été trouvé
            If Not Trouve Then
                MsgBox "Numéro " & NumUnique & " introuvable dans Tbl_INVENDUS.", vbExclamation
            End If
        End If
    Next i
  End If
End With
End Sub
Bonne fin de soirée
Jean marie
 

jeff1494

XLDnaute Occasionnel
Bonjour @ChTi160 et @cathodique ;

Je vous remercie pour votre aide.
Je vais regarder de près vos solutions et conseils.

@ChTi160 merci pour ton code, et la modification que tu y as apporté. Je vais l'étudier pour le comprendre et certainement le mettre de coté comme exemple.

@cathodique je n'ai simplement pas pensé à charger toutes les colonnes dans le ListBox et n'afficher que les deux premières colonnes. En effet cela aurait facilité mon problème. On dirait que j'aime bien me faire des nœuds au cerveau pour pas grand chose. 🥵
En fait j'ai du mal avec les Tableaux Structurés, il va vraiment falloir que je m'y mette à fond une bonne fois pour toutes.
Ils apportent tellement de confort que cela va me devenir indispensable.

Je vais juste ajouter le fermeture du formulaire avec un MsgBox pour dire que tout a été fait.

Encore un grand merci à vous deux.
Je vous souhaite une bonne année 2025.
 

jeff1494

XLDnaute Occasionnel
Merci @cathodique ;
Je vais aller traduire cette page.
Par contre j'ai une autre question à laquelle tu pourras certainement répondre.

J'aimerai savoir si il est possible de charger un ListBox depuis un tableau auquel on applique un filtre?
Quitte à gérer l'application du filtre dans la procédure VBA.

Merci d'avance.
 

jeff1494

XLDnaute Occasionnel
@cathodique ; merci pour ton fichier je vais y jeter un coup d’œil.
Super ton code fonctionne parfaitement. Et correspond à ce dont j'avais besoin.
Ne me reste plus qu'a regarder de près car j'ai vu que tu utilisait une collection, voilà encore non pas un gros mot, mais un concept que je n'ai pas encore étudié.
Merci je vais pouvoir essayer de comprendre avec un exemple que je maitrise. Je pense que cela sera plus facile que l'abstrait des aides différentes.

@ChTi160 ; En fait je voudrais charger le ListBox avec uniquement les lignes dont une colonne ne contient pas une chaine de caractère spécifique.
Une fois que j'ai transféré une ligne vers la feuille liste je met la valeur "Transféré" dans la dernière colonne.
En évitant de charger ces lignes la prochaine fois dans le ListBox, cela me permet de ne pas transféré une deuxième fois une ligne, et ne pas avoir de doublons dans les objets.

Encore merci à vous deux pour votre aide précieuse.
 
Dernière édition:

jeff1494

XLDnaute Occasionnel
@cathodique ,
C'est dans la dernière colonne du TS invendus ou je voudrais mettre "Transféré"n une fois que la ligne est créée dans LISTE.
Et dans le chargement de la listBox ne pas prendre en compte les lignes du TS invendus ayant cette valeur "Transféré".
Ta solution fonctionne parfaitement je dois juste filtrer le TS manuellement avant que de lancer la copie.
En fait j'ai essayer le code suivant dans le chargement de la ListBox :

VB:
Function Charg_Invendus()

'   Chargement de la ListBox depuis la feuille "INVENDUS"

Dim lastRow As Long
Dim dataRange As Range
Dim rowData As Variant
Dim i As Long
    
LB_Inv.ColumnCount = 2
LB_Inv.ColumnWidths = "80;350"
Sheets("INVENDUS").Activate

    ' Ligne suivante rajoutée
    ActiveSheet.ListObjects("Tbl_INVENDUS").Range.AutoFilter Field:=11, _
        Criteria1:=Array("Erreur", "Manquant", "Rechercher dans magasin", "Voir avec le Vide-grenier", "Vente abandonnée", "="), Operator:=xlFilterValues

    lastRow = Cells(Rows.Count, "A").End(xlUp).Row
    lastRow = lastRow - 1           ' Eviter d'afficher une dernière ligne vide
    Set dataRange = Range("A2:B" & lastRow)
    ReDim rowData(1 To lastRow, 1 To 2)
        For i = 1 To lastRow
                rowData(i, 1) = dataRange.Cells(i, 1).Value
                rowData(i, 2) = dataRange.Cells(i, 2).Value
        Next i
    LB_Inv.List = rowData
End Function

J'applique donc un filtre avant de charger la liste des lignes.
Les valeurs utilisées viennent de la feuille params Colonne J. Cela correspond à des actions ou décisions prises ou à prendre.
En principe cette liste est figée et ne devrait pas recevoir de nouvelles valeurs.
A ma charge de me souvenir qui si j'en ajoute une je dois reprendre mon code.
Sauf bien sûr si tu as une autre solution, je suis alors preneur. Comme par exemple tout garder sauf la valeur "Transféré"

Ce n'est certainement pas un code des plus parfaits mais à priori il fonctionne.

Dans tous les cas un grand merci pour ton aide.
 
Dernière édition:

cathodique

XLDnaute Barbatruc
@cathodique ,
C'est dans la dernière colonne du TS invendus ou je voudrais mettre "Transféré"n une fois que la ligne est créée dans LISTE.
Et dans le chargement de la listBox ne pas prendre en compte les lignes du TS invendus ayant cette valeur "Transféré".
Ta solution fonctionne parfaitement je dois juste filtrer le TS manuellement avant que de lancer la copie.
Il est possible de "filtrer" le tableau par rapport à la colonne que tu m'as indiqué.
Cependant, dans cette colonne tu as mis une liste de validation dans laquelle, il n'y a pas le mot "Transféré".
 

Discussions similaires

Statistiques des forums

Discussions
315 261
Messages
2 117 859
Membres
113 355
dernier inscrit
aithalibi.yassmine@gmail.