无法理解如何编写循环以创建数组以填充列表框,从而能够修改原始表

问题描述 投票:0回答:1

Excel VBA-没有ActiveX控件的Excel 2016。我是一位处理政府防火墙的初学者,尽管我拥有2016 excel,但看来权限不超过2010 vba工具。真令人沮丧,因为我了解到哪些工具被禁止使用。

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

我创建了一个表单,该表单是一个组合的数据条目和列表框。列表框显示了迄今为止所有位置和所有产品的所有交易。我什至想出了如何确保最新条目显示在列表框的顶部。该表格可以允许用户在主表中输入新数据或编辑当前数据。我也有一个非常基本的形式,只允许添加新交易(没有列表框)。

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

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

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

我想然后我可以做一个简单的循环,用所需的列填充列表框,并且原始行列“可以”得以保留(以某种方式???)。那又是我被困住的地方。我需要列表框包含6列。并且这不包括具有true和false的列。我知道我需要使用循环和变量(可能是数组)。我努力地寻找是否存在类似的问题,并且有一些问题,但是它们没有使用必须使用的相同vba语言,而且我对代码是否有效感到困惑。它是真正返回列还是仅一行(由制表符分隔的数据)。是否可以选择它,并在必要时修改条目。

我希望它足够详细,可以为您提供一些指导或指向帖子的链接,这些内容可能会对我的工作有所帮助。我没有共享任何代码,因为每次遇到下一步时,我都会碰壁。我将不会下载任何文件,我真的很想亲自学习如何做。

感谢您的耐心和帮助。

excel vba listbox userform excel-2016
1个回答
0
投票

对不起,如果我弄错了要得到你想要的东西,对不起。

无论如何,也许下面的代码可以为您提供所需的帮助。

Sub PopulateListBox()
With Sheets("Sheet2")
Set Rng = .Range(.Range("A2"), .Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
End With

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

For Each Cell In Rng
    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

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

上面的代码根据在textbox1(产品名称)和textbox2(地区/位置)中的用户类型显示列表框。它不使用“帮助表”。

enter image description here

但是,如果有更新列表框中所选项目的过程,它将需要其他代码。例如:1号发票中的Q1(东部的直升机)需要从“ East Bla”更改/更新为“ East Blo”。

© www.soinside.com 2019 - 2024. All rights reserved.