我正在尝试编写代码,比较两个不同工作表中的三个列值,并根据匹配结果获取第四列的值。使用以下代码时,出现以下错误:
此键已经与此集合的元素关联。
docker-compose.yml
我想要输出,我将匹配两个不同工作表的3列,并根据匹配结果获取第四列的值,但这不起作用并抛出错误。
答案 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
声明的Dic
和oCell
最初被声明为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