2016-03-08 100 views
0

我對VBA相對較新,正在創建一些表單以幫助進行庫存管理。基於2列中的值刪除列表框項目 - vba

當表格初始化時,會有一個列表框從產品目錄表中提取產品信息。每行有11列,包含產品ID,供應商,價格,庫存物品等信息。還有三個複選框 - 低於項目的項目,等於項目的項目和高於標準的項目。 3個複選框值設置爲True以開始,因爲當表單被初始化時,所有的Inventory都顯示在列表框中。

我正試圖編寫代碼,當其中一個複選框未選中時,將從列表框中刪除產品。例如,如果我取消選中「項目低於標準」,我希望所有產品庫存中的項目數爲<,該項目(另一列)的標準值將被刪除。這將使列表框僅顯示那些處於或高於標準的項目。

我該怎麼做呢?我不知道如何引用列表框列中的值。

預先感謝您!如果不清楚,請提問。


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 

我得到一個編譯錯誤。這3個語句表達的預期:

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

對於每個if語句,在操作符後面添加一個下劃線以使其指向下一行。例如'如果Inv.Cells(r,7).Value> _'我最初在代碼中忘記了它,但更新了我的答案 - 請參見下文。 – SincereApathy

+0

...或者將下一行('Inv.Cells(r,9).Value Then')移動到操作員的同一行上。我只是把它放在了我的例子中。 – SincereApathy

+0

@SincereApathy哦,當然!我很感謝 – sqlnewbie33

回答

0

有可能是一個更清潔的方式,我鼓勵任何人誰擁有更清潔的方式來捧場,不過這似乎工作。基本上,重建每個複選框的更改事件下的列表框列表。下面我舉一個例子,假設複選框名爲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 

調整範圍和工作表名稱以滿足您的需求。對於此示例,Cells(r, 1).Value =項目名稱,Cells(r, 2).Value =存貨項目數量,Cells(r, 3).Value =參數值。其中1,2,3是包含數據的列號。

+0

感謝您的回覆!這種處理方式非常有意義!但是我得到錯誤的三個if語句的值是<, >,或= to。我上面發佈了我的代碼。有什麼想法嗎? – sqlnewbie33