Excel 键已与元素关联

Excel 键已与元素关联,excel,vba,Excel,Vba,我已经使用这个宏两年多了。在我收到Microsoft的更新之前,一切都没有改变。现在我接收到错误457-此密钥已与此集合的元素一起分配。我发布了类模块和宏。该错误是由代码“colCombData.Add cCombData,CStr(cCombData.ColA)”引起的。任何人都可以解释如何纠正此问题 Option Explicit Private pColA As String Private pColB As String Private pColCConcat As String Pri

我已经使用这个宏两年多了。在我收到Microsoft的更新之前,一切都没有改变。现在我接收到错误457-此密钥已与此集合的元素一起分配。我发布了类模块和宏。该错误是由代码“colCombData.Add cCombData,CStr(cCombData.ColA)”引起的。任何人都可以解释如何纠正此问题

Option Explicit
Private pColA As String
Private pColB As String
Private pColCConcat As String
Private pColHConcat As String
Private pColIConcat As String
Private pColJConcat As String
Private pColKConcat As String
Private pColLConcat As String
'step 1 A
Public Property Get ColA() As String
    ColA = pColA
End Property
'step 2 A
Public Property Let ColA(Value As String)
    pColA = Value
End Property

'step 1 B
Public Property Get ColB() As String
    ColB = pColB
End Property
'step 2 B
Public Property Let ColB(Value As String)
    pColB = Value
End Property

'step 1 concat C
Public Property Get ColCConcat() As String
    ColCConcat = pColCConcat
End Property

'step 2 concat C
Public Property Let ColCConcat(Value As String)
    pColCConcat = Value
End Property

'step 1 concat H
Public Property Get ColHConcat() As String
    ColHConcat = pColHConcat
End Property

'step 2 concat H
Public Property Let ColHConcat(Value As String)
    pColHConcat = Value
End Property

'step 1 concat J
Public Property Get ColJConcat() As String
    ColJConcat = pColJConcat
End Property

'step 2 concat J
Public Property Let ColJConcat(Value As String)
    pColJConcat = Value
End Property

'step 1 concat I
Public Property Get ColIConcat() As String
    ColIConcat = pColIConcat
End Property

'step 2 concat I
Public Property Let ColIConcat(Value As String)
    pColIConcat = Value
End Property

'step 1 concat K
Public Property Get ColKConcat() As String
    ColKConcat = pColKConcat
End Property

'step 2 concat K
Public Property Let ColKConcat(Value As String)
    pColKConcat = Value
End Property

'step 1 concat L
Public Property Get ColLConcat() As String
    ColLConcat = pColLConcat
End Property

'step 2 concat L
Public Property Let ColLConcat(Value As String)
    pColLConcat = Value
End Property


    Option Explicit
Sub CombineData()
    Dim cCombData As Combdata
    Dim colCombData As Collection
    Dim V As Variant
    Dim vRes() As Variant 'Results Array
    Dim rRes As Range   'Location of results
    Dim I As Long

'read source data into array
V = Range("A1", Cells(Rows.Count, "A").End(xlUp)).Resize(columnsize:=13)

'Set results range.  Here it is set below the Source Data
'Could be anyplace, even on a different worksheet; or could overlay the
'  original.  Area below and to right is cleared
    Sheets.Add After:=Sheets(Sheets.Count)
    Set rRes = Sheets(Sheets.Count).Range("A1")

Range(rRes, rRes.SpecialCells(xlCellTypeLastCell)).Clear

'code to grab all data that will be used
Set colCombData = New Collection
On Error Resume Next
For I = 1 To UBound(V)
    Set cCombData = New Combdata
    cCombData.ColA = V(I, 1)
    cCombData.ColB = V(I, 2)
    cCombData.ColCConcat = V(I, 3)
    cCombData.ColHConcat = V(I, 7)
    cCombData.ColIConcat = V(I, 8)
    cCombData.ColJConcat = V(I, 9)
    cCombData.ColKConcat = V(I, 10)
    cCombData.ColLConcat = V(I, 11)
    colCombData.Add cCombData, CStr(cCombData.ColA) < ---Error line

    'if statement to concatenate specified columns
    If Err.Number <> 0 Then
        Err.Clear
        With colCombData(cCombData.ColA)
            .ColCConcat = .ColCConcat & ", " & Chr(10) & V(I, 3)
            .ColHConcat = .ColHConcat & ", " & Chr(10) & V(I, 7)
            .ColIConcat = .ColIConcat & ", " & Chr(10) & V(I, 8)
            .ColJConcat = .ColJConcat & ", " & Chr(10) & V(I, 9)
            .ColKConcat = .ColKConcat & ", " & Chr(10) & V(I, 10)
            .ColLConcat = .ColLConcat & ", " & Chr(10) & V(I, 11)
        End With
    End If
Next I
On Error GoTo 0

'code to write new data in specified location
ReDim vRes(1 To colCombData.Count, 1 To 13)
For I = 1 To UBound(vRes)
    With colCombData(I)
        vRes(I, 1) = .ColA
        vRes(I, 2) = .ColB
        vRes(I, 3) = .ColCConcat
        vRes(I, 7) = .ColHConcat
        vRes(I, 8) = .ColIConcat
        vRes(I, 9) = .ColJConcat
        vRes(I, 10) = .ColKConcat
        vRes(I, 11) = .ColLConcat
    End With
Next I

rRes.Resize(UBound(vRes, 1), UBound(vRes, 2)) = vRes


'formatting
 With rRes


  .Range("A1:K1").Interior.ColorIndex = 48
  .Range("A1:K1").Font.Bold = True

  .Range("A1", Cells(Rows.Count, "A").End(xlUp)).Resize(columnsize:=13).VerticalAlignment = xlTop
  .Range("A1", Cells(Rows.Count, "A").End(xlUp)).Resize(columnsize:=11).Borders.LineStyle = xlContinuous
  .Range("A1:K1").VerticalAlignment = xlCenter
  .Range("A1:K1").HorizontalAlignment = xlCenter

    Columns("a:a").ColumnWidth = 16.57
    Columns("B:B").ColumnWidth = 13.71
    Columns("C:C").ColumnWidth = 8.43
    Columns("G:G").ColumnWidth = 7.29
    Columns("H:H").ColumnWidth = 15.43
    Columns("I:I").ColumnWidth = 45
    Columns("J:J").ColumnWidth = 13.57
    Columns("K:K").ColumnWidth = 15.43
    Rows(2).RowHeight = 100
    .Range("D:F").EntireColumn.Delete
 End With
End Sub
选项显式
私有pColA作为字符串
私有pColB作为字符串
私有pColCConcat作为字符串
私有pColHConcat作为字符串
私有pColIConcat作为字符串
私有pColJConcat作为字符串
私有pColKConcat作为字符串
私有pColLConcat作为字符串
"第一步A
公共属性Get ColA()作为字符串
可乐
端属性
"第二步A
公共属性(值为字符串)
pColA=值
端属性
"第一步B
公共属性获取ColB()作为字符串
ColB=pColB
端属性
"第二步B
公共属性Let ColB(值为字符串)
pColB=值
端属性
“第一步C
公共属性获取colccontat()作为字符串
ColCConcat=pColCConcat
端属性
“第二步C
公共属性Let ColCConcat(值为字符串)
pColCConcat=值
端属性
“第一步海螺
公共属性获取ColHConcat()作为字符串
ColHConcat=pColHConcat
端属性
“第二步海螺
公共属性Let ColHConcat(值为字符串)
pColHConcat=值
端属性
'第1步concat J
公共属性获取ColJConcat()作为字符串
ColJConcat=pColJConcat
端属性
“第2步,康卡特J
公共属性Let ColJConcat(值为字符串)
pColJConcat=值
端属性
“第一步康卡特一号
公共属性获取colincat()作为字符串
colincat=pColIConcat
端属性
“第二步康卡特一号
公共属性Let colincat(值为字符串)
pColIConcat=值
端属性
“第一步康卡特K
公共属性获取ColKConcat()作为字符串
ColKConcat=pColKConcat
端属性
“第二步康卡特K
公共属性Let ColKConcat(值为字符串)
pColKConcat=值
端属性
“第一步,海螺L
公共属性Get collcontat()作为字符串
collcontat=pcollcont
端属性
“第二步,海螺L
公共属性Let collcont(值为字符串)
pcollcontat=值
端属性
选项显式
子组合数据()
Dim cCombData作为组合数据
Dim Colcomb数据作为收集
Dim V作为变体
Dim vRes()作为变量的结果数组
将RRE作为结果的范围位置
我想我会坚持多久
'将源数据读入数组
V=范围(“A1”,单元格(Rows.Count,“A”)。结束(xlUp))。调整大小(columnsize:=13)
'设置结果范围。在这里,它设置在源数据下面
“可能在任何地方,甚至在不同的工作表上;或者可以覆盖
“原版。下方和右侧区域已清除
Sheets.Add After:=工作表(Sheets.Count)
设置rRes=张数(张数)。范围(“A1”)
范围(rRes,rRes.SpecialCells(xlCellTypeLastCell))。清除
'获取将使用的所有数据的代码
Set colCombData=新集合
出错时继续下一步
对于I=1至UBound(V)
设置cCombData=新Combdata
cCombData.ColA=V(I,1)
cCombData.ColB=V(I,2)
cCombData.ColCConcat=V(I,3)
cCombData.ColHConcat=V(I,7)
cCombData.colincat=V(I,8)
cCombData.ColJConcat=V(I,9)
cCombData.ColKConcat=V(I,10)
cCombData.collcont=V(I,11)
添加cCombData,CStr(cCombData.ColA)<---错误行
'if语句来连接指定的列
如果错误号为0,则
呃,明白了
使用colCombData(cCombData.ColA)
.ColCConcat=.ColCConcat&“,”和Chr(10)和V(I,3)
.ColHConcat=.ColHConcat&“,”和Chr(10)和V(I,7)
.colincat=.colincat&“,”和Chr(10)和V(I,8)
.ColJConcat=.ColJConcat&“,”和Chr(10)和V(I,9)
.ColKConcat=.ColKConcat&“,”和Chr(10)和V(I,10)
.collcont=.collcont&“,”和Chr(10)和V(I,11)
以
如果结束
接下来我
错误转到0
'在指定位置写入新数据的代码
ReDim vRes(1到colCombData.Count,1到13)
对于I=1至UBound(vRes)
使用colCombData(I)
vRes(I,1)=.可乐
vRes(I,2)=.ColB
vRes(I,3)=.colccocat
vRes(I,7)=.ColHConcat
vRes(I,8)=大肠杆菌
vRes(I,9)=.ColJConcat
vRes(I,10)=.ColKConcat
vRes(I,11)=.collcontat
以
接下来我
重新调整大小(UBound(vRes,1),UBound(vRes,2))=vRes
“格式化
与rRes
.Range(“A1:K1”).Interior.ColorIndex=48
.Range(“A1:K1”).Font.Bold=True
.Range(“A1”,单元格(Rows.Count,“A”).End(xlUp)).Resize(columnsize:=13)。垂直对齐=xlTop
.Range(“A1”,单元格(Rows.Count,“A”).End(xlUp)).Resize(columnsize:=11)。Borders.LineStyle=xlContinuous
.范围(“A1:K1”).垂直对齐=X中心
.范围(“A1:K1”).水平对齐=xlCenter
列(“a:a”)。列宽=16.57
列(“B:B”)。列宽=13.71
列(“C:C”)。列宽=8.43
列(“G:G”)。列宽=7.29
列(“H:H”)。列宽=15.43
列(“I:I”)。列宽=45
列(“J:J”)。列宽=13.57
列(“K:K”)。列宽=15.43
行(2)。行高=100
.范围(“D:F”).全部删除
以
端接头

范围(“A1”,单元格(Rows.Count,“A”).End(xlUp)).Resize(columnsize:=13)的A列中是否存在重复值?
是的,存在重复值。我已经使用这个宏很长一段时间了,就在昨天,这个错误出现了。我使用这个的方式没有任何改变。然而,昨天我从微软得到了一个更新,这时发生了这个错误。如果A列中有重复项,它将抛出一个错误。您正在使用该值作为集合的键,并且集合键在该集合中必须是唯一的。否则这是一个糟糕的键,对吗?你的
错误恢复下一步
应该忽略重复键错误并跳到下一行,所以你可能已经将错误捕获选项更改为“在所有错误上中断”?在里面