VBA:只向excel组合框添加唯一值,该组合框是通过在打开的工作簿中循环源工作表区域来填充的



下面的代码主要查看打开的工作簿上的源工作表,从一个范围中获取值,并通过将每个值添加到组合框进行循环。

我想做的是包含一些代码,以确保只添加唯一的值,即不添加重复。

你知道我该怎么做吗?

谢谢!

Private Sub Workbook_Open()
Dim wb As Workbook
Set wb = ThisWorkbook
Dim Home As Worksheet
Dim Datasource As Worksheet

'Define Variables and dropdown object
Dim LastRow As Long
Dim MIDCell As Range

Dim ComboMID As ComboBox

Set Home = ActiveSheet
Set Home = Worksheets("UPDATER")
Set Datasource = wb.Sheets("LaunchCodes")

'asign dropdown object to combobox
Set ComboMID = Home.OLEObjects("ComboBox1").Object

'Empty the combobox currnetly to avoid duplicating content
ComboMID.Clear

'With and For loop to put all values in games launch code column, ignoring any blanks,  into combobox
With Datasource
LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
For Each MIDCell In .Range("D2:D1000" & LastRow)
If MIDCell.Value <> "" Then
ComboMID.AddItem MIDCell.Value

End If

Next
End With

End Sub

下面的代码避免在工作表中的单元格中循环,因为它很慢。事实上,通过将列表读取到变量中可以加快这个过程(事实上,我的代码也这样做(,但使用Excel自己的RemoveDuplicates方法似乎更有效。

Private Sub Workbook_Open()
' 155
Dim Wb          As Workbook
Dim ComboMid    As ComboBox
Dim TmpClm      As Long                 ' number of temporary column
Dim Arr         As Variant              ' unique values from column D

Set Wb = ThisWorkbook
With Wb.Worksheets("UPDATER")
Set ComboMid = .OLEObjects("ComboBox1").Object
With .UsedRange
TmpClm = .Column + .Columns.Count
End With
End With

With Wb.Sheets("LaunchCodes")
' create a copy of your data (without header) in an unused column
.Cells(2, "D").CurrentRegion.Copy .Cells(1, TmpClm)
.Cells(1, TmpClm).CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlNo
Arr = .Cells(1, TmpClm).CurrentRegion.Value
.Columns(TmpClm).ClearContents
End With

With ComboMid
.List = Arr
.ListIndex = 0                      ' assign first list item to Value
End With
End Sub

您不需要清除上面代码中的组合框,因为用新数组替换List属性会自动删除以前的内容。

组合框唯一

  • 要了解组合框,请研究以下内容

您可以用以下代码段替换Set ComboMID = Home.OLEObjects("ComboBox1").Object行之后的代码:

Dim rng As Range
With DataSource
LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
Set rng = .Range("D2:D" & lastrow)
End With
Dim Unique As Variant
Unique = getUniqueFromRange(rng)
If Not IsEmpty(Unique) Then
ComboMID.List = Unique
End If

它使用以下功能:

Function getUniqueFromRange( _
rng As Range) _
As Variant

If rng Is Nothing Then
Exit Function
End If

Dim Data As Variant
If rng.Cells.CountLarge > 1 Then
Data = rng.Value
Else
ReDim Data(1 To 1, 1 To 1)
Data(1, 1) = rng.Value
End If
cCount = UBound(Data, 2)

Dim cValue As Variant
Dim i As Long
Dim j As Long

With CreateObject("Scripting.Dictionary")
.CompareMode = vbTextCompare
For i = 1 To UBound(Data, 1)
For j = 1 To cCount
cValue = Data(i, j)
If Not IsError(cValue) And Not IsEmpty(cValue) Then
.Item(cValue) = Empty
End If
Next j
Next i
If .Count > 0 Then
getUniqueFromRange = .Keys
End If
End With

End Function

相关内容

  • 没有找到相关文章

最新更新