【问题标题】:Error This key is already associated with an element of this collection错误 此键已与此集合的元素关联
【发布时间】:2017-06-28 06:33:53
【问题描述】:

我正在研究 vba 宏。我试图使用字典。但它给了error 457,调试器指向toprow.Add ActiveCell.value, val。谁能告诉这个问题?我什至使用了Cstr(activecell.value), Cstr(val),正如在类似问题的答案之一中提到的那样。

Dim toprow As New Dictionary, Dictkey As Variant
Dim val As String

Range("A1").Activate 
i = 0
Do Until i = ColLen
    val = Chr(65 + i)
    toprow.Add ActiveCell.value, val
    i = i + 1
    ActiveCell.Offset(0, 1).Activate
Loop

【问题讨论】:

  • 看来ActiveCell.value 不是唯一的,即A 列中至少有一个重复值。
  • 它们在我的excel中都是独一无二的
  • Maybe ColLen > A列中的范围,在这种情况下它会尝试添加多个空单元格=“”键?
  • 实际上它工作正常,当我在它下面放一些代码来操作这些值时,它开始出现这个问题!
  • 当 VBA 给你一个错误时,我会检查“ActiveCell.Value”的当前值 - 然后尝试在 A 列中找到该值。另一个选择是你的 Range("A1") 是在另一个工作簿上而不是您期望的工作簿上?

标签: vba excel


【解决方案1】:

Adding 带有字典的键只有在键不存在时才有可能。不小心你之前输入了密钥,你是watching 调试观察器的密钥,立即创建密钥。 (= 如果您查看字典中的某个键,如果它不存在,则会创建它)。

你必须

  • 确保您没有使用调试器查看密钥
  • 通过在d.Exists(keyname) 上测试创建唯一条目,然后使用d.Add keyname, value 方法
  • 您也可以默认使用d.Item(keyname) = value 覆盖现有密钥

【讨论】:

    【解决方案2】:

    我收到了相同的错误消息:“错误此键已与此集合的元素相关联”。就我而言,问题在于我有这个:

    'assign values to properties
    Property Let EmployeeName(Valor As String)
        m_employeename = Valor
    End Property
    Property Let EmployeeID(Valor As String)
        m_employeename = Valor
    End Property
    

    我应该有这个:

    'assign values to properties
    Property Let EmployeeName(Valor As String)
        m_employeename = Valor
    End Property
    Property Let EmployeeID(Valor As String)
        m_employeeid = Valor
    End Property
    

    也许您只需要仔细检查您的“Property Let”代码,看看您是否为类中的私有变量使用了适当的名称。

    【讨论】:

      【解决方案3】:

      如果您只想跳过引发此错误的记录,您还可以添加一些非常基本的错误处理。我只是在为我生成此错误的行的正上方插入了下面的行,现在它愉快地移动,忽略了曾经引发此错误的重复键。

      On Error Resume Next
      

      【讨论】:

      • 这一行将如何帮助解决错误处理?也许On Error Goto 0 甚至if Err.number <> 0 then 会有所帮助。
      • 我是 VBA 新手,所以如果我在这里弄错了,请纠正我;我的 cmets 基于我自己的测试,在有限的数据集上运行我的完整宏。我所需要的只是忽略重复值,因为我使用的是roll-up macro,它提供了值的联合。 (所以,一旦我有了一个值,如果它再次出现,我就不需要对它做任何事情)我添加了上面引用的行,我的测试结果很好 - 似乎忽略了错误就好了。我错过了什么吗?
      • bpboldindakab评论的原因是这不是错误handling,是错误skipping。使用if err.number <> 0,然后如果不是已知错误,代码可以做一些事情来解决它,将err.numbererr.sourceerr.description打印到屏幕或文件将处理错误,而不是导致意外停止不允许关闭文件的脚本,记录停止原因的详细信息,或显示任何用户友好的错误消息。
      猜你喜欢
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2021-08-26
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多