Excel VBA使用循环从选定工作表中填充值来填充列表框

时间:2018-11-19 23:21:53

标签: excel vba excel-vba loops listbox

我在用户表单中有2个列表框。当用户单击其中一个框中的项目(工作表名称)时,另一个列表框应使用他们选择的特定工作表的D列中的值自动填充。我也不想显示任何重复的值。我该如何通过使用循环来实现这一点?

1 个答案:

答案 0 :(得分:1)

嗯,这里将发生一些事情。

由于您未能说明列表框的名称,因此我们使用的是通用形式:

  • ListBox1是带有工作表名称的列表框
  • ListBox2是要从D列自动填充的列表框。

首先,您需要确保使用工作表值初始化listBox1。如何执行此操作的示例是:

Private Sub UserForm_Initialize()

    'MUST BE PLACED IN USERFORM CODE MODULE!!
    Dim ws As Worksheet
    For Each ws In ThisWorkbook.Worksheets
        Me.ListBox1.AddItem ws.Name
    Next ws

End Sub

上面的内容不是您的任务所必需的,但您需要预先填充的用户表单

现在,您将要关注ListBox1_Change()事件。同样,如果您的列表框未命名为ListBox1,则需要在“子名称”中进行更改。

Private Sub ListBox1_Change()

    'MUST BE PLACED IN USERFORM CODE MODULE!!
    Dim wsSelected As Worksheet
    Set wsSelected = ThisWorkbook.Worksheets(Me.ListBox1.Value)

    With wsSelected

        Me.ListBox2.List = rngToUniqueArr(.Range(.Cells(1, "D"), .Cells( _
                lastRow(wsSelected, "D"), "D")))

    End With

End Sub

Function rngToUniqueArr(ByVal rng As Range) As Variant
    'Reference to [Microsoft Scripting Runtime] Required
    Dim dict As New Scripting.Dictionary, cel As Range
    For Each cel In rng.Cells
        dict(cel.Value) = 1
    Next cel
    rngToUniqueArr = dict.Keys
End Function

Function lastRow(ws As Worksheet, Optional col As Variant = 1) As Long
    With ws
        lastRow = .Cells(.Rows.Count, col).End(xlUp).Row
    End With
End Function

rngToUniqueArr是我存储在 PERSONAL.XLSB 工作簿中的东西,它是一个有用的功能。这将采用输入范围并创建唯一值的字典,然后输出到数组中。

  

以上要求在工具> 参考

中将参考设置为Microsoft Scripting Runtime

在您的ListBox1_Change()事件中,wsSelected是您从ListBox1中选择的工作表,并且您正在将数组从rngToUniqueArr添加到ListBox2中。