重复数据删除VBA脚本字典

时间:2018-10-11 10:01:16

标签: excel vba excel-vba

我在工作簿中有三个组合框,我想通过菊花链将它们组合在一起。单击组合框上的下拉按钮后,按下键盘上的向下箭头时,每个组合框的项目列表都会刷新。第二个组合框列表取决于在第一个组合框中所做的选择。我已经使用脚本字典构建了这些。

strCustComboBox是当前组合框应依赖的上一个组合框中的值。

rngProject正在查看包含大量引号ID的范围。我从此列偏移到保留上一个组合框的值的列,如果该值等于strCustComboBox,则将rngCompany值添加到脚本字典中

我在循环中遇到一个问题,在该循环中,我试图删除写入脚本字典的rngCompany值的重复数据,该脚本字典用于构建要在组合框中显示的列表。我的代码在下面。

Sub UpdateComboBox1FromDashData()
Dim strCustComboBox As MSForms.ComboBox
Dim strComboBox As MSForms.ComboBox
Dim rngCompany As Range
Dim rngProject As Range
Dim d As Object, c As Variant, i As Long

Worksheets("QuoteEditor").Unprotect "xxxx"

Application.ScreenUpdating = False

Set strCustComboBox = ThisWorkbook.Worksheets("QuoteEditor").ComboBox4
Set strComboBox = ThisWorkbook.Worksheets("QuoteEditor").ComboBox1

If strCustComboBox = "" Then

      MsgBox "Please select a project first", vbOKCancel

Else
End If

ThisWorkbook.Worksheets("DashboardData").Select

Call FindLastRow("A", "10")

Set d = CreateObject("Scripting.Dictionary")
c = Range("A10:A" & strLastRow)


Set rngProject = ThisWorkbook.Worksheets("DashboardData").Range("A10:A" & strLastRow)

i = 1

For Each rngCompany In rngProject

    If UCase(rngCompany.Offset(, 7).Value) = UCase(strCustComboBox) Then

         If d.exists(rngCompany) = True Then

         Else
             d.Add rngCompany, i
             i = i + 1

         End If

     Else

     End If

Next rngCompany

For Each Item In d

     strComboBox.AddItem (Item)

Next Item

我认为我在d.exists(rngCompany)上使用的位置是错误的,但是我不确定。子例程完成后,我仍然得到重复的数据,返回到组合框列表。

我还根据建议的重复线程尝试了以下代码:

With d

    For Each rngCompany In rngProject

        If UCase(rngCompany.Offset(, 7).Value) = UCase(strCustComboBox) Then

            If Not .exists(rngCompany) Then

                d.Add rngCompany, Nothing

            Else
            End If
        End If
    Next rngCompany
End With

任何人都可以看到这两个地方出了什么问题吗?

1 个答案:

答案 0 :(得分:4)

您将答案隐藏在自己的问题中(强调我的意思):

  

我要在其中重复删除rngCompany

d.Exists(rngCompany)无法以您编写的方式返回true,因为您正在 range Dictionary >,而不是其内容。由于您要测试的项目是迭代For Each rngCompany In rngProject的一部分,因此可以保证只有不同的范围。

解决方案很简单-您需要显式调用rngCompany的默认成员:

If Not d.Exists(rngCompany.Value) Then
   d.Add rngCompany.Value, i
   i = i + 1   
End If