2016-03-08 2 views
0

Je suis relativement nouveau à VBA et je travaille sur la création de certains formulaires pour faciliter la gestion des stocks. Lorsque le formulaire est initialisé, il existe une zone de liste qui extrait les informations de produit d'une feuille d'inventaire.Suppression des éléments de la liste en fonction des valeurs dans 2 colonnes - vba

Chaque rangée comporte 11 colonnes avec des informations telles que l'ID du produit, le fournisseur, le prix, les articles en stock, etc. Il y a également trois cases à cocher: Articles en dessous de Par, Articles en par. Les trois valeurs de case à cocher sont définies sur True pour commencer car tout l'inventaire est affiché dans la zone de liste lorsque le formulaire est initialisé.

J'essaye d'écrire le code qui enlèvera des produits de la liste quand l'une des cases à cocher n'est pas cochée. Par exemple, si je désélectionne "Articles en dessous de Par", je veux que tous les produits dont le nombre d'articles en stock est < la valeur nominale pour cet article (qui est une autre colonne) à supprimer. Cela laisserait la zone de liste affichant uniquement les éléments qui sont au niveau ou au-dessus du pair.

Comment ferais-je cela? Je ne suis pas sûr de savoir comment référencer les valeurs dans les colonnes de la liste.

Merci d'avance !! S'il vous plaît poser des questions si cela n'est pas clair.


Private Sub UserForm_Initialize() 

Dim lr As Long 
Dim Inv As Worksheet 
Dim rng As Range 

Set Inv = Sheets("Inventory") 
lr = Inv.Cells(Rows.Count, "A").End(xlUp).Row 
Set rng = Inv.Range("A2:K" & lr) 

Me.lbInventory.ColumnCount = 11 
Me.lbInventory.RowSource = rng.Address 
Me.lbInventory.ColumnHeads = True 

Me.chkAbove.Value = True 
Me.chkBelow.Value = True 
Me.chkAt.Value = True 

End Sub 


Private Sub chkAbove_Change() 
    ListBuild 
End Sub 

Private Sub chkAt_Change() 
    ListBuild 
End Sub 

Private Sub chkBelow_Change() 
    ListBuild 
End Sub 


Sub ListBuild() 

Dim Inv As Worksheet 
Set Inv = Sheets("Inventory") 

Dim r As Integer 
Me.lbInventory.Clear 

If Me.chkBelow.Value = True Then 
    For r = 1 To 11 
     If Inv.Cells(r, 7).Value < 
      Inv.Cells(r, 9).Value Then 
       Me.lbInventory.AddItem Inv.Cells(r, 1).Value 
     End If 
    Next r 
End If 

If Me.chkAt.Value = True Then 
    For r = 1 To 11 
     If Inv.Cells(r, 7).Value = 
      Inv.Cells(r, 9).Value Then 
       Me.lbInventory.AddItem Inv.Cells(r, 1).Value 
     End If 
    Next r 
End If 

If Me.chkAbove.Value = True Then 
    For r = 1 To 11 
     If Inv.Cells(r, 7).Value > 
      Inv.Cells(r, 9).Value Then 
       Me.lbInventory.AddItem Inv.Cells(r, 1).Value 
     End If 
    Next r 
End If 

End Sub 

Je reçois une erreur de compilation. Une expression est attendue pour ces 3 déclarations:

If Inv.Cells(r, 7).Value >,<,= 
     Inv.Cells(r, 9).Value Then 
+0

Pour chaque instruction if, ajoutez un trait de soulignement après l'opérateur pour lui indiquer de passer à la ligne suivante. Par exemple 'Si Inv.Cells (r, 7) .Value> _' Je l'ai oublié dans mon code à l'origine, mais mis à jour ma réponse - voir ci-dessous. – SincereApathy

+0

... ou déplacez la ligne inférieure ('Inv.Cells (r, 9) .Value Then') sur la même ligne que l'opérateur. Je l'ai juste déplacé pour le garder en vue pour mon exemple. – SincereApathy

+0

@SincereApathy oh ouais bien sûr! J'apprécie l'aide – sqlnewbie33

Répondre

0

Il peut y avoir un moyen plus propre et j'encourage tous ceux qui ont un moyen plus propre à s'y joindre, mais cela semble fonctionner. Fondamentalement, reconstruisez la liste listbox sous l'événement de changement de chaque case à cocher. Ci-dessous j'ai un exemple en supposant que les cases à cocher sont nommés BelowPar, AtPar, & AbovePar.

Private Sub AbovePar_Change() 
    ListBuild 
End Sub 

Private Sub AtPar_Change() 
    ListBuild 
End Sub 

Private Sub BelowPar_Change() 
    ListBuild 
End Sub 

Sub ListBuild() 

    Dim r As Integer 
    InventoryList.Clear 

    If BelowPar.Value = True Then 
     For r = 1 To 11 
      If Sheets("InventorySheet").Cells(r, 2).Value < _ 
       Sheets("InventorySheet").Cells(r, 3).Value Then 
        InventoryList.AddItem Sheets("InventorySheet").Cells(r, 1).Value 
      End If 
     Next r 
    End If 

    If AtPar.Value = True Then 
     For r = 1 To 11 
      If Sheets("InventorySheet").Cells(r, 2).Value = _ 
       Sheets("InventorySheet").Cells(r, 3).Value Then 
        InventoryList.AddItem Sheets("InventorySheet").Cells(r, 1).Value 
      End If 
     Next r 
    End If 

    If AbovePar.Value = True Then 
     For r = 1 To 11 
      If Sheets("InventorySheet").Cells(r, 2).Value > _ 
       Sheets("InventorySheet").Cells(r, 3).Value Then 
        InventoryList.AddItem Sheets("InventorySheet").Cells(r, 1).Value 
      End If 
     Next r 
    End If 

End Sub 

Ajustez les plages et le nom de la feuille en fonction de vos besoins. Pour cet exemple Cells(r, 1).Value = nom de l'article, Cells(r, 2).Value = nombre d'articles en stock et Cells(r, 3).Value = valeur nominale. Où 1, 2, 3 sont le numéro de colonne contenant les données.

+0

merci pour votre réponse! cette façon de l'aborder a beaucoup de sens! Cependant, je reçois des erreurs pour les trois instructions si les valeurs sont <, >, ou = à. J'ai posté mon code ci-dessus. Des pensées? – sqlnewbie33