根据 2 列中的值删除列表框项目 - vba
Removing listbox items based on the values in 2 columns - vba
我对 VBA 比较陌生,正在努力创建一些表格来帮助进行库存管理。
初始化表单时,有一个列表框将从库存中提取产品信息 sheet。每行有 11 列,包含产品 ID、供应商、价格、库存商品等信息。还有三个复选框 - Items Below Par、Items At Par 和 Items Above Par。 3 个复选框的值设置为 True 开始,因为在初始化表单时所有 Inventory 都显示在列表框中。
我正在尝试编写代码,以便在取消选中其中一个复选框时从列表框中删除产品。例如,如果我取消选中 "Items Below Par",我希望删除所有库存商品数量小于该商品面值(这是另一列)的产品。这将使列表框只显示那些达到或高于标准杆的项目。
我该怎么做?我不确定如何引用列表框列中的值。
提前致谢!!如果不清楚,请提问。
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
可能有更清洁的方法,我鼓励任何有更清洁方法的人加入,但这似乎有效。基本上,在每个复选框的更改事件下重建列表框列表。下面我有一个示例,假设复选框被命名为 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
调整范围和 sheet 名称以满足您的需要。对于此示例,Cells(r, 1).Value
= 商品名称,Cells(r, 2).Value
= 库存商品数量,Cells(r, 3).Value
= 票面价值。其中 1、2、3 是包含数据的列号。
我对 VBA 比较陌生,正在努力创建一些表格来帮助进行库存管理。
初始化表单时,有一个列表框将从库存中提取产品信息 sheet。每行有 11 列,包含产品 ID、供应商、价格、库存商品等信息。还有三个复选框 - Items Below Par、Items At Par 和 Items Above Par。 3 个复选框的值设置为 True 开始,因为在初始化表单时所有 Inventory 都显示在列表框中。
我正在尝试编写代码,以便在取消选中其中一个复选框时从列表框中删除产品。例如,如果我取消选中 "Items Below Par",我希望删除所有库存商品数量小于该商品面值(这是另一列)的产品。这将使列表框只显示那些达到或高于标准杆的项目。
我该怎么做?我不确定如何引用列表框列中的值。
提前致谢!!如果不清楚,请提问。
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
可能有更清洁的方法,我鼓励任何有更清洁方法的人加入,但这似乎有效。基本上,在每个复选框的更改事件下重建列表框列表。下面我有一个示例,假设复选框被命名为 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
调整范围和 sheet 名称以满足您的需要。对于此示例,Cells(r, 1).Value
= 商品名称,Cells(r, 2).Value
= 库存商品数量,Cells(r, 3).Value
= 票面价值。其中 1、2、3 是包含数据的列号。