错误:此键已经与Excel VBA中此集合的元素相关联

时间:2019-07-12 14:28:04

标签: excel vba

我正在尝试编写代码,比较两个不同工作表中的三个列值,并根据匹配结果获取第四列的值。使用以下代码时,出现以下错误:

  

此键已经与此集合的元素关联。

docker-compose.yml

我想要输出,我将匹配两个不同工作表的3列,并根据匹配结果获取第四列的值,但这不起作用并抛出错误。

2 个答案:

答案 0 :(得分:0)

您必须像在Dic中一样检查Dic1中是否存在密钥:

For Each oCell2 In w2.Range("B2:E" & i1)
    If Not Dic1.exists(oCell2.Value) Then
        Dic1.Add oCell2.Value, oCell2.Offset(, 2).Value & oCell2.Offset(, 3).Value
...

还需要正确格式化代码;您在第二个Next循环中缺少For

答案 1 :(得分:0)

  • 在添加字典之前,检查字典中是否存在键被认为是一种好习惯。这是通过Dictionary.Exist(key)方法完成的。

  • 将键和值添加为变量可以很好地解决-myVal = oCell2.Offset(, 2).Value & oCell2.Offset(, 3).Value,可提高代码的可读性。

  • 像这样Dim Dic, Dic1 As Object, key As Variant, oCell, oCell2 As Range声明的DicoCell最初被声明为Variant。稍后将它们分配给正确的类型。

  • 如果比较Excel中的单元格,则尝试避开可能的错误是一个好主意。因为两个错误永远不会相等:If (Not IsError(oCell.Value)) And (Not IsError(oCell2)) Then,并且会引发错误:


Sub UpdateW2()
    Dim Dic As Object, Dic1 As Object, key As Variant, oCell As Range, oCell2 As Range, i&, i1&
    Dim w1 As Worksheet, w2 As Worksheet

    Set Dic = CreateObject("Scripting.Dictionary")
    Set Dic1 = CreateObject("Scripting.Dictionary")

    Set w1 = ThisWorkbook.Worksheets(1)
    Set w2 = ThisWorkbook.Worksheets(2)

    i = w1.Cells.SpecialCells(xlCellTypeLastCell).Row

    For Each oCell In w1.Range("B2:D" & i)
        If Not Dic.Exists(oCell.Value) Then
            Dic.Add oCell.Value, oCell.Offset(, 1).Value & oCell.Offset(, 2).Value
            i1 = w2.Cells.SpecialCells(xlCellTypeLastCell).Row

            For Each oCell2 In w2.Range("B2:E" & i1)
                Dim myKey As String
                Dim myVal As String

                myKey = oCell2.Value
                myVal = oCell2.Offset(, 2).Value & oCell2.Offset(, 3).Value

                If Dic1.Exists(myKey) Then
                    Debug.Print "Key exists " & myKey
                Else
                    Debug.Print "Key added " & myKey
                    Dic1.Add myKey, myVal
                End If

                If (Not IsError(oCell.Value)) And (Not IsError(oCell2)) Then
                    If oCell = oCell2 Then
                        oCell.Offset(, 3).Value = oCell2.Offset(, 1).Value
                    End If
                Else
                    Debug.Print oCell.Address; " or "; oCell2.Address
                End If
            Next
        End If
    Next

End Sub