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