Conditions pour remplir listbbox et tb

Et cela serait que pour le bon unique ou pour tous les autres également ?

pour faire simple, cette manière de fonctionner pourrait se faire pour n'importe quel bon.
Mais si vous ne pouvez remplir les remarques que pour le bon num 10, on ne donne accès à la textbox "remarque" que dans ce cas

Pour bien saisir le process :
on remplit le num de bon et la textbox initiale --> Cela affiche les données disponibles dans la listbox.
Vous faites votre choix dans la listbox pour afficher les données dans les textbox Date, Batiment et remarque si on a choisi le bon 10

Je trouve cette méthode idéale pour le n° de bon unique mais je préfèrerais garder le système actuel pour les autres bons, sachant que je n'aurai jamais de date ou de remarque différentes si le combo n°bon + initiale est identique. (dans le cas des bons nomaux).

Merci

Ok. Faites les modifications suivantes :

1. Dans le code Private Sub TextBox9_Change() après le SET CEL = ... , modifiez les lignes suivantes

    If Not cel Is Nothing Then
      If Right(TextBox9.Value, 2) <> 10 Then Me.TextBox1 = cel.Offset(0, -1): Me.TextBox12 = cel.Offset(0, 10)
      Me.TextBox10 = cel.Offset(0, 1)
    Else
    End If

2. Ajoutez le code ci-dessous

Private Sub TextBox1_Afterupdate()
Dim cel As Range

If Right(TextBox9.Value, 2) = 10 And TextBox11.Value <> "" Then
    With Sheets("SORTIE").ListObjects("TABsortie").ListColumns(2)
        For Each cel In .DataBodyRange
            If cel.Offset(0, 1) = TextBox9.Value And cel.Value = CDate(TextBox1.Value) Then
                TextBox12.Value = .DataBodyRange.Item(cel.Row - 16, 12)
                Exit Sub
            End If
        Next cel
    End With
End If
End Sub

A noter que vous devez entrer les dates comme ceci dans l'usf avec le trait 20-09-2021. Il faut que la date entrée soit identique à celle trouvée dans votre tableau

Cordialement

C'est presque parfait !

Petit souci, il récupère une remarque alors qu'il ne devrait pas. Dans l'image ci-dessous, le combo 2021/10 ; AM ; 25-09-21 récupère la remarque "test 5" alors qu'elle est attachée à l'initiale AA sur l'ID 11.

1

Et aussi du coup, le code pour rafraichir la listbox n'est plus à jour puisque pour le cas du bon unique, il devrait récupérer les infos après que la date soit mise, et pas qu'avec le n°bon + initiale comme les bons classiques.

Sinon, tout à l'air de fonctionner à merveille !

Merci

C'est bien en changeant la date que vous avez cela ?

Pour plus de facilité, peut être pourriez-vous me donner le fichier correspondant à la vue que vous placez

Aussi un détail, pourquoi votre ligne 1 est-elle vide de données ?

Bonjour Dan,

J'ai gardé la 1ère ligne vide comme ça si jamais un jour je transfère toutes les données du tableau et que je le remets vierge, je garde mes formules en colonne ID et stock. Sans doute y-a-t'il une meilleure solution mais cela ne me dérange pas

Voici le fichier

4stock-copie.xlsm (99.10 Ko)

Merci

Bonjour,

J'ai gardé la 1ère ligne vide comme ça si jamais un jour je transfère toutes les données du tableau et que je le remets vierge, je garde mes formules en colonne ID et stock. Sans doute y-a-t'il une meilleure solution mais cela ne me dérange pas

Pour l'ID, vous pouvez plus simplement enlever cette formule et ajouter cette ligne dans votre code --> Private Sub CommandButton1_Click() juste en dessous de la ligne L = Sheets("SORTIE")...

Range("B" & L) = WorksheetFunction.Max(Range("B:B")) + 1

Pour le stock, cela peut aussi se faire par code via recherche dans la feuille stock. Cela supprimerait les formules

Pour ce qui concerne le souci faites ceci :

1. remplacer ce code par celui ci-dessous

Private Sub TextBox1_Afterupdate()
Dim cel As Range

If Right(TextBox9.Value, 2) = 10 And TextBox11.Value <> "" Then

    With Sheets("SORTIE").ListObjects("TABsortie").ListColumns(2)
        For Each cel In .DataBodyRange
            If cel.Offset(0, 1) = TextBox9.Value And cel.Value = CDate(TextBox1.Value) Then
                TextBox12.Value = .DataBodyRange.Item(cel.Row - 16, 12)
                Call RemplirListbox
                Exit Sub
            End If
        Next cel
    End With
End If
End Sub

2. Ajouter le code suivant

Sub RemplirListbox()
Dim strNumBS As String
Dim i As Long, lngLastRowMouvs As Long, y As Long, j As Long
Dim wksMouvs As Worksheet

strNumBS = TextBox9.Value
Set wksMouvs = Sheets("SORTIE")
If strNumBS <> "" Then
    y = 0
    With wksMouvs
        ListBox3.Clear
        lngLastRowMouvs = .Range("D" & Rows.Count).End(xlUp).Row
        For i = 17 To lngLastRowMouvs
            If .Cells(i, "D") = strNumBS And TextBox11.Value = .Cells(i, "F").Value And CDate(TextBox1.Value) = .Cells(i, "C").Value Then
                For j = 1 To 10
                    ListBox3.AddItem
                    ListBox3.List(y, j - 1) = .Cells(i, j + 1)
                Next j
                y = y + 1
            End If
        Next i
    End With
End If
End Sub

Si ok pour vous, je peux vous modifier le fichier pour que le code remplir soit unique dans votre userform plutôt qu'à trois endroits différent. A voir si intérêt pour vous

C'est top !

En effet, c'est mieux de retirer les formules.

J'ai tenté cela du coup pour afficher le stock.

If Range("H17") <> "" Then
  Range("L" & L).Value = WorksheetFunction.XLookup(.Range("H17").Value, Sheets("SORTIE").Range("TABsortie"), 2, False)

Evidemment tout n'est pas correct puisque la range ne doit pas être fixe.. Mais surtout, est ce que ça permettra de mettre le stock automatiquement à jour comme la formule, et ce sur toutes les lignes ?

Si ok pour vous, je peux vous modifier le fichier pour que le code remplir soit unique dans votre userform plutôt qu'à trois endroits différent. A voir si intérêt pour vous

Là je n'ai pas tout compris

Merci !

Autant pour moi,

Encore une petite erreur avec la remarque:

2021/10AA22/09/21A
2021/10AM22/09/21Il récupère la remarque "A" alors qu'il ne devrait pas puisque l'initial n'est pas le même

Ce cas-ci avec 2 initiales différents le même jour sur le bon unique est peu probable mais sait-on jamais.

Egalement, j'ai retiré le code pour rafraîchir la listbox dans le bouton "valider", et je l'ai remplacer par

Call RemplirListbox

Cela à l'air de fonctionner

Merci

Bon, pour remplacer la formule du stock j'ai mis ceci:

If Range("L" & L).Value <> 0 Then
  Range("L" & L).Value = Application.WorksheetFunction.XLookup(Range("H" & L), Sheets("STOCK").Range("TABstock[CODE]"), Sheets("STOCK").Range("TABstock[STOCK]"))

ça à l'air de fonctionner également, est-ce correct ?

Bonjour

Bon, pour remplacer la formule du stock j'ai mis ceci:

If Range("L" & L).Value <> 0 Then Range("L" & L).Value = Application.WorksheetFunction.XLookup(Range("H" & L), Sheets("STOCK").Range("TABstock[CODE]"), Sheets("STOCK").Range("TABstock[STOCK]"))

Pas sûr que ce soit correct car si votre valeur change en feuille stock, elle ne sera pas calculée directement
Par rapport à cela j'ai une question lorsque vous dites dans un précédent message --> J'ai gardé la 1ère ligne vide comme ça si jamais un jour je transfère toutes les données du tableau et que je le remets vierge

Comment faites-vous cela ? Je suppose que si vous transférez le tableau vous faites juste un copier - Coller, non ?

Bonjour,

Pas sûr que ce soit correct car si votre valeur change en feuille stock

Vous parlez du code d'article ? L'article et donc le code pourrait être amené à être supprimé à l'avenir oui et donc je me retrouverais avec des erreurs, exact.Mais j'aurais eu le même problème avec les formules sans doute.

Plutôt que de supprimer la ligne de l'article dans ma feuille "stock", je pourrais la masquer? comme cela, mes tableaux entrées et sorties pourraient toujours retrouver le code .

-En effet, je ferais un simple c/c, j'ai cherché une solution alternative sans succès. Je cherchais une autre solution surtout dans le cas ou je devrais faire des modifications au fichier. Que je puisse travailler sur une copie du fichier de façon à ce que mes collègues puissent continuer à travailler sur l'original sans soucis et que par après, je puisse importer les données du fichier original vers mon fichier modifié où les données ne sont plus à jour. Mais c'est pas le plus important pour le moment.

Vous parlez du code d'article ? L'article et donc le code pourrait être amené à être supprimé à l'avenir oui et donc je me retrouverais avec des erreurs, exact.Mais j'aurais eu le même problème avec les formules sans doute.

Je parlais pas d'une suppression mais d'un ajout de ligne avec un code existant. La ligne de code que vous utilisez ne va actualiser les données existantes en colonne L en cas d'ajout d'un code qui existe déjà dans les autres lignes. Pour que les stocks soient mis à jour dans chaque ligne identique à celle que vous ajouterez, il vous faut une formule en colonne L.
Mettez cette formule en L17 --> =SIERREUR(RECHERCHEV([@CODE];TABstock[[CODE]:[DIFFERENCE]];3);"")
Appuyer sur la touche ENTREE et la formule sera recopiée automatiquement vers le bas.

Dès que vous allez ajouter une ligne dans la feuille sortie, la formule sera recopiée automatiquement et l'information de stock sera toujours à jour.

-En effet, je ferais un simple c/c, j'ai cherché une solution alternative sans succès. Je cherchais une autre solution surtout dans le cas ou je devrais faire des modifications au fichier.

Dans ce cas, vous pouvez compléter la ligne 1 également sans souci.

Faites le test et dites moi si ok.
Je vous donnerai ensuite la modification de code pour l'ajout de vos données via le bouton Valider

Cela fonctionne bien, mais n'aurais-je pas pu garder celle-ci du coup ?

=SI(H17<>""; RECHERCHEX(H17;TABstock[CODE];TABstock[STOCK]);"")

Et de toute manière, la 1ère ligne reste toujours vide puisque je ne peux pas retirer la 1ere ligne du tableau et ne garder que l'en-tête.Donc quand je fais ma sortie, il créer forcément une seconde ligne.Mais en effet l'ID ne commence plus à la 1ere ligne du tableau.

Et de toute manière, la 1ère ligne reste toujours vide puisque je ne peux pas retirer la 1ere ligne du tableau et ne garder que l'en-tête.

Exact elle reste vide au début

Donc quand je fais ma sortie, il créer forcément une seconde ligne.Mais en effet l'ID ne commence plus à la 1ere ligne du tableau.

Non cela c'est juste une question de code qui ne doit pas être celui que vous avez. La seule chose qu'il faut éviter c'est que si vous supprimez les données il faut conserver la formule en L de la première ligne (donc ligne 17 dans votre cas). Mais on peut aussi prévoir de la remettre par code lorsque l'on ajoute la première donnée en ligne 17 (donc première ligne du tableau). Dites moi ?

Pour votre formule, je vous ai mis la formule rechercheV car je n'ai pas la formule RechercheX dans ma version excel

Dans l'attente de votre retour pour vous poster le code à modifier

Bonjour Dan,

Non cela c'est juste une question de code qui ne doit pas être celui que vous avez. La seule chose qu'il faut éviter c'est que si vous supprimez les données il faut conserver la formule en L de la première ligne (donc ligne 17 dans votre cas). Mais on peut aussi prévoir de la remettre par code lorsque l'on ajoute la première donnée en ligne 17 (donc première ligne du tableau). Dites moi ?

Si ce n'est pas trop long à mettre en place, c'est toujours un plus oui !

Tout à l'air parfaitement fonctionnel sinon, excepté la remarque qui s'affiche alors qu'elle ne devrait pas.

Merci

EDIT : J'ai fait comme cela pour que la remarque s'affiche uniquement si n°bon + in + date sont identiques. C'est correct ?

Private Sub TextBox1_Afterupdate()
Dim cel As Range

If Right(TextBox9.Value, 2) = 10 Then

    With Sheets("SORTIE").ListObjects("TABsortie").ListColumns(2)
        For Each cel In .DataBodyRange
            If cel.Offset(0, 1) = TextBox9.Value And cel.Value = CDate(TextBox1.Value) And cel.Offset(0, 3) = TextBox11.Value Then
                TextBox12.Value = .DataBodyRange.Item(cel.Row - 16, 12)
                Call RemplirListbox
                Exit Sub
            End If
        Next cel
    End With
End If
End Sub

Bonjour

Si ce n'est pas trop long à mettre en place, c'est toujours un plus oui !

Je l'avais déjà préparé. Faites comme ceci :

- Allez dans l'userform à la macro Private Sub CommandButton1_Click()
- En dessous de la ligne -->" '//Rafraichissement listbox pour n° de bon, supprimez l'instruction "Dim wksMouvs As Worksheet"
- Remplacez la partie de code qui se trouve au dessus de l'instruction Textbox3.value = "" par celle ci-dessous

Private Sub CommandButton1_Click()
Dim Lig As Integer
Dim wksMouvs As Worksheet

Application.ScreenUpdating = False
If TextBox1.Value = "" Or TextBox11.Value = "" Or TextBox2.Value = "" Or TextBox3.Value = "" Or TextBox9.Value = "" Then
    MsgBox ("La sortie est incomplète")
    CommandButton1 = False
    Exit Sub
End If

Set wksMouvs = Sheets("SORTIE")
If MsgBox("Valider la sortie ?", vbYesNo, "Validation") = vbYes Then
    ActiveSheet.unprotect "stock"
    With wksMouvs.ListObjects("TABSortie")
        If .ListRows.Count = 0 Then
            .ListRows.Add: Lig = 1
            '.DataBodyRange(Lig, 11).FormulaR1C1 = "=IFERROR(VLOOKUP([@CODE],TABstock[[CODE]:[DIFFERENCE]],3),"""")"
            .DataBodyRange(Lig, 11).FormulaR1C1 = "=IF(RC[-4]<>"""", RECHERCHEX(RC[-4],TABstock[CODE],TABstock[STOCK]),"""")"
        Else: .ListRows.Add: Lig = .ListRows.Count
        End If

        With .DataBodyRange
            .Item(Lig, 1) = WorksheetFunction.Max(Range("B:B")) + 1
            .Item(Lig, 2) = CDate(TextBox1.Value) 'DATE
            .Item(Lig, 3) = TextBox9.Value       'N° DE BON
            .Item(Lig, 4) = TextBox10.Value      'BATIMENT
            .Item(Lig, 5) = TextBox11.Value      'INITIALE
            .Item(Lig, 6) = TextBox8.Value      'NOM PRENOM
            .Item(Lig, 7) = TextBox2.Value        'CODE
            .Item(Lig, 8) = CDbl(TextBox3.Value) 'QTE
            .Item(Lig, 9) = TextBox4.Value       'UNITE
            .Item(Lig, 10) = TextBox5.Value      'DESCRIPTION
            If TextBox12.Text <> "" Then .Item(Lig, 12) = "X"
            .Item(Lig, 13) = TextBox12.Value
        End With
    End With

Comme vous le verrez j'ai laissé une instruction avec RechercheV (en vert dans le code) mais par défaut ce sera votre instruction RechercheX qui sera utilisée.
La formule ne sera mise qu'une seule fois et ce, lorsque vous compléterez la première ligne (17 dans votre cas) de votre tableau. Dès que vous ajouterez une nouvelle ligne, la formule sera implémentée automatiquement (fonctionnalité automatique due à la mise en forme en tableaux structurés)

Si vous voulez démarrer vos tests depuis la ligne 17:
- sélectionnez B17 à N27 (si la dernière ligne du tableau est bien là 27 sur base de votre vue dans votre post précédent)
- Click droite puis choisissez uniquement l"option Supprimer --> Lignes de tableau
De base ne supprimez les données de votre tableau qu'en procédant comme je vous ai expliqué avant. Cela permettra de ne jamais supprimer votre tableau structuré et de toujours bien redémarrer à la ligne 17

J'ai fait comme cela pour que la remarque s'affiche uniquement si n°bon + in + date sont identiques. C'est correct ?

Cela a l'air de fonctionner oui

Top !

Par contre à la création de la formule pour le stock, il ajoute un "@" après le égal, ce qui fait qu'il ne trouve pas la donnée.

Et en-dessous de '//Rafraichissement listbox pour n° de bon

J'avais mis Call Remplir ListBox, je remets le code précédent alors ?

De base ne supprimez les données de votre tableau qu'en procédant comme je vous ai expliqué avant. Cela permettra de ne jamais supprimer votre tableau structuré et de toujours bien redémarrer à la ligne 17

Dans le cas ou je souhaite tout supprimer uniquement ? Pour supprimer une ligne précise si jamais il y a une erreur, je peux utiliser ma p'tite poubelle ?

Par contre à la création de la formule pour le stock, il ajoute un "@" après le égal, ce qui fait qu'il ne trouve pas la donnée.

C'est parce qu'excel voit le tableau structuré. Dans mon code, avez-vous essayé en prenant la formule RechercheV plutot que rechercheX ?

J'avais mis Call Remplir ListBox, je remets le code précédent alors ?

Non vous pouvez laisser le Call Remplir Listbox bien entendu. C'est encore plus simple.

Dans le cas ou je souhaite tout supprimer uniquement ? Pour supprimer une ligne précise si jamais il y a une erreur, je peux utiliser ma p'tite poubelle ?

Non vous pouvez utiliser votre icone "poubelle" bien entendu. Mon commentaire concernait juste le cas où vous voulez supprimer manuellement toutes les lignes du tableau en une seule fois.

En effet, je n'avais même pas pris la peine d'essayer

Tout m'a l'air au poil !

Petite question supplémentaire qui n'a rien à voir que je n'ai pas réussi à résoudre sur un second post.

Public Const MDP = "test"
Sub a()
ActiveSheet.Unprotect
End Sub

Sub b()
ActiveSheet.Protect Password:=MDP
End Sub

Je protège la feuille en lançant la macro b, je veux la retirer en lançant la a. Quand je veux écrire le mdp, les caractères se mettent en double. Donc ça donne "tteesstt".

Alors que si je passe par le bouton "ôter protection" dans le ruban, la pas de problème.

Une idée d'où vient mon problème ?

Un grand merci en tout cas Dan pour ta précieuse aide !

Rechercher des sujets similaires à "conditions remplir listbbox"