无法理解如何编写循环来创建一个数组来填充能够修改原始列表框的列表框 Table

Cannot understand how to write a loop to create an array to fill a listbox that would be able to revise the original Table

Excel VBA - Excel 2016,没有 ActiveX 控件。我是 baby/newbie 处理政府防火墙的,虽然我有 2016 excel,但似乎权限不超过 2010 vba 工具。这非常令人沮丧,因为我了解到哪些工具已被禁止使用。

我有点高级。与 Leila Gharani 一起上了一些课程。并以您不敢相信的方式跟踪 YouTube。我知道如何创建列表框。现在,我正在开发一个非常简单的库存管理系统。这必须包括库存报告、数据透视 table 和图表等

我创建了一个将数据输入和列表框合二为一的表单。列表框显示迄今为止所有地点和所有产品的所有交易。我什至想出了如何确保最新的条目显示在列表框的顶部。此表单可以允许用户输入新数据或编辑 Master Table 中的当前数据。我还有一个非常基本的表单,只允许添加新交易(没有列表框)。

我的设计非常顺利。一抓。用户希望我更改组合条目,以便当用户选择要进行交易的位置和产品时,列表框将更新。他们希望列表框根据位置 selected 提供产品交易的完整列表。他们认为这将有助于防止冗余条目,并允许在必要时进行修改。

我设法创建了一个满足一半请求的列表框表单(它将交易过滤为仅与产品和位置相关的交易 selected)。我使用新的工作表制作了它,我在其中嵌入了具有多个条件的 Excel 高级过滤器。我从一个非常古老的 (2015) 视频教程中学到了这一点,该教程涉及在一个视频中创建多标准高级过滤器,然后在下一个视频中他们展示了如何 运行 来自用户表单的相同过滤器。关键细节是必须从在新工作表上创建的结果 table 填充列表框。因此,我无法执行任务的第二部分,即允许用户 select 其中一项交易(如有必要)并在输入任何新数据之前对主数据进行所需的任何更改。

所以我改变了策略,我在原始主数据中创建了一个新列,当用户 select 从输入表单的组合框中输入位置和产品时,该列将更新。对于符合要求的任何行,它将指示 TRUE,对于不匹配,指示 FALSE。

我想我可以做一个简单的循环来用所需的列填充列表框,并且原始行的列 "may" 能够保留(不知何故???)。那又是我被困的地方。我需要列表框包含 6 列。这不包括具有真假的列。我知道我需要使用循环和变量(可能是数组)。我努力搜索以查看是否有类似的问题,确实有一些,但它们使用的语言与我必须使用的 vba 不同,我对代码是否有效感到困惑。它是真正返回列还是仅返回由制表符分隔的一行数据。是否可以 selected 并在必要时修改条目。

我希望这篇文章足够详细,可以让您提供一些指导或指向可能对我的努力有所帮助的帖子的链接。我没有共享任何代码,因为每次我都会在下一步应该做什么方面遇到困难。我不会下载任何文件,我真的很想自己学习如何下载。

感谢您的耐心等待和帮助。

对不起,如果我弄错了你想要的。

无论如何,也许下面的代码可以给你一点帮助,达到你想要的效果。

Dim rw() As Variant
Dim idx As Integer

Sub PopulateListBox()
Set Rng = Range("A2", Range("A" & Rows.Count).End(xlUp))

If Application.CountA(Rng) = 1 Then
Set Rng2 = Rng
Else
Set Rng2 = Rng.SpecialCells(xlCellTypeVisible)
End If

With ListBox1
    .Clear
    .ColumnCount = 6
    .ColumnWidths = "20,60,40,40,40,40"
End With

For Each Cell In Rng2
    With ListBox1
        .AddItem Cell.Value
        .List(.ListCount - 1, 1) = Cell.Offset(0, 1).Value
        .List(.ListCount - 1, 2) = Cell.Offset(0, 2).Value
        .List(.ListCount - 1, 3) = Cell.Offset(0, 3).Value
        .List(.ListCount - 1, 4) = Cell.Offset(0, 4).Value
        .List(.ListCount - 1, 5) = Cell.Offset(0, 5).Value
    End With
Next Cell
End Sub

Private Sub CommandButton1_Click()
If ActiveSheet.AutoFilterMode Then
    If ActiveSheet.FilterMode = True Then
    ActiveSheet.ShowAllData
    End If
Else
ActiveSheet.Cells.AutoFilter
End If

Set Rng = Range("A1", Range("A" & Rows.Count).End(xlUp))

If TextBox1.Value <> "" Then
Rng.AutoFilter Field:=2, Criteria1:=TextBox1.Value, Operator:=xlAnd
End If

If TextBox2.Value <> "" Then
Rng.AutoFilter Field:=3, Criteria1:=TextBox2.Value, Operator:=xlAnd
End If

Call PopulateListBox

End Sub

Sub RowNum()
Set Rng = Range("A2", Range("A" & Rows.Count).End(xlUp))
If Application.CountA(Rng) = 1 Then
Set Rng2 = Rng
Else
Set Rng2 = Rng.SpecialCells(xlCellTypeVisible)
End If

For Each Cell In Rng2
ReDim Preserve rw(p)
rw(p) = Cell.Row
p = p + 1
Next

With ListBox1
 For i = 0 To .ListCount - 1
 If .Selected(i) Then
 idx = i
 Exit For
 End If
 Next i
End With
End Sub

Private Sub ListBox1_Click()
Call RowNum
Range(Cells(rw(idx), 1), Cells(rw(idx), 6)).Select
TextBox4.Value = Cells(rw(idx), 1).Value
TextBox5.Value = Cells(rw(idx), 2).Value
TextBox6.Value = Cells(rw(idx), 3).Value
End Sub

Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If (KeyCode = vbKeyReturn) Then
Call RowNum
Cells(rw(idx), 1).Value = "'" & TextBox4.Value
ListBox1.List(idx, 0) = Cells(rw(idx), 1).Value
End If
End Sub

Private Sub TextBox5_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If (KeyCode = vbKeyReturn) Then
Call RowNum
Cells(rw(idx), 2).Value = StrConv(TextBox5.Text, vbProperCase)
ListBox1.List(idx, 1) = Cells(rw(idx), 2).Value
End If
End Sub

Private Sub TextBox6_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If (KeyCode = vbKeyReturn) Then
Call RowNum
Cells(rw(idx), 3).Value = StrConv(TextBox6.Text, vbProperCase)
ListBox1.List(idx, 2) = Cells(rw(idx), 3).Value
End If
End Sub

Private Sub UserForm_Initialize()
If ActiveSheet.AutoFilterMode Then
    If ActiveSheet.FilterMode = True Then
    ActiveSheet.ShowAllData
    End If
Else
ActiveSheet.Cells.AutoFilter
End If
Call PopulateListBox
End Sub