【问题标题】:Excel - VBA Removing Duplicates from ComboboxesExcel - VBA 从组合框中删除重复项
【发布时间】:2015-04-13 10:27:39
【问题描述】:

我正在尝试创建一个子例程来删除组合框中的重复项。当我调用子程序时,我输入了一个数字来代替 X。当我进入子程序时,我不断收到一个错误,告诉我“需要对象”。我知道这意味着某些东西没有被正确初始化,但我不知道如何解决我的问题。任何帮助将不胜感激。谢谢。

Private Sub UserForm_Initialize()

'ComboBox Populate
Dim rngNext As Range
Dim myRange As Range
Dim C As Integer
With Sheets("KEY")
Set rngNext = .Range("B500").End(xlUp).Offset(1, 0)
End With
rngNext.Select
Set myRange = Range("B2", rngNext)

With ComboBox1
For Each rngNext In myRange

If rngNext <> "" Then .AddItem rngNext

Next rngNext
End With

Call RemoveDuplicates(1)
End sub

 Private Sub RemoveDuplicates(X)
'Remove Duplicates

Dim i As Long
Dim j As Long
With "ComboBox" & X
    For i = 0 To .ListCount + 1 'Getting object required error in this line
        For j = .ListCount To (i + 1) Step -1
            If .List(j) = .List(i) Then
                .RemoveItem j
            End If
        Next
    Next
End With
End Sub

最终代码

一切都非常适合删除重复项。

Public allCBoxes As Collection

Private Sub UserForm_Initialize()


Set allCBoxes = New Collection
allCBoxes.Add ComboBox1

'ComboBox Populate
Dim rngNext As Range
Dim myRange As Range
Dim C As Integer
With Sheets("KEY")
Set rngNext = .Range("B500").End(xlUp).Offset(1, 0)
End With
rngNext.Select
Set myRange = Range("B2", rngNext)

With ComboBox1
For Each rngNext In myRange
If rngNext <> "" Then .AddItem rngNext
Next rngNext
End With

Call RemoveDuplicates(1)
End sub

 Private Sub RemoveDuplicates(X)
'Remove Duplicates
Dim i As Long
Dim j As Long
With allCBoxes(X)
    For i = 0 To .ListCount + 1
        For j = .ListCount -1 To (i + 1) Step -1
            If .List(j) = .List(i) Then
                .RemoveItem j
            End If
        Next
    Next
End With
End Sub

【问题讨论】:

    标签: excel combobox duplicate-removal vba


    【解决方案1】:

    你得到一个错误是因为你传递的是一个字符串,而不是一个对象。 虽然直觉上你可以这样认为:

    "ComboBox" & X
    

    将变为,例如如果 x = 5,

    ComboBox5
    

    你错了,因为你实际上是在构建一个字符串:

    "ComboBox5"
    

    而且,很明显,如果您在 String 上调用 ComboBox 对象的方法,则会提示您“需要对象”。 在 VBA 中您想要做的事情是不可能的,您无法在运行时定义变量名(即 ComboBox &amp; X,即使不是“作为字符串”,也不会引用变量 ComboBox5)。为了达到你想要的,我建议创建一个公共集合:

    Dim allCBoxes As Collection
    

    然后在主过程中填充它:

    Set allCBoxes = New Collection
    allCBoxes.Add ComboBox1
    allCboxes.Add ComboBox2
    'etc.
    

    最后像这样恢复“Xth”组合框:

    With allCBoxes(X)
    
    End With
    

    【讨论】:

    • 您的方法也解决了对象问题,但现在我收到此错误:“无法获取 List 属性。无效的属性数组索引。”
    • @Tyler 在哪一行?
    • 据我所知,嵌套 if 语句中的 .RemoveItem j 行。
    • 当我从上面的那一行跳到那一行之后,它就出错了。
    • 你只需要调试,你得到的错误只是一个坏列表索引;在调试模式下单步执行代码,您将修复它,因为我们太难了,不知道那里发生了什么。
    【解决方案2】:

    如果要使用其string 名称引用控件,请使用Controls 函数。

    如:

    With Controls("Combobox" & X)
    

    这能解决问题吗?

    【讨论】:

    • 这解决了对象问题,但现在我收到此错误:“无法获取 List 属性。无效的属性数组索引。”
    • 我将添加一个新的答案,它可以用作解决根本问题的完全不同的方法:需要一个没有重复的组合框。见下文。
    【解决方案3】:

    正如我在上面的评论中提到的,这是解决根本问题的另一种方法:需要一个没有重复值的 combobox。此方法使用Dictionary 对象。

    让我知道您是否可以根据自己的需要调整它,以及它是否有效。

    Private Sub UserForm_Initialize()
        Dim oDictionary As Object
        Dim strCellContent As String
        Dim rngComboValues As Range
        Dim rngCell As Range
    
        Set rngComboValues = Range("A1:A26")
        Set oDictionary = CreateObject("Scripting.Dictionary")
    
        For Each rngCell In rngComboValues
            strCellContent = rngCell.Value
    
            If Not oDictionary.exists(strCellContent) Then
                oDictionary.Add strCellContent, 0
            End If
        Next rngCell
    
        For Each itm In oDictionary.keys
            Me.ComboBox1.AddItem itm
        Next itm
    
        Set oDictionary = Nothing
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多