2014-02-05 2 views
7

Я работаю над макросами 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 
+2

Похоже, что 'ActiveCell.value' не является уникальным, т. Е. В столбце' A' имеется, по меньшей мере, дублируемое значение. –

+0

Все они уникальны в моем excel – Gauranga

+1

Возможно ColLen> диапазон в столбце A, и в этом случае он пытается добавить несколько пустых ячеек = "" ключи? –

ответ

16

Add ИНГ клавиши со словарями возможно только тогда, когда ключ уже не существует. Случайно вы могли ввести ключ раньше, или вы watching ключ с наблюдателем отладки, создавая ключ мгновенно. (= Если вы просматриваете определенный ключ в словаре, он создается, если он еще не существует).

Вы должны

  • убедитесь, что вы не смотрите ключ с помощью отладчика
  • создать уникальные записи по тестированию на d.Exists(keyname), а затем использовать d.Add keyname, value метод
  • в качестве альтернативы вы можете по умолчанию, чтобы перезаписать существующий с помощью d.Item(keyname) = value
+2

+1 для 'd.Item (keyname) = value' :) –

+0

+ 1 красиво сделано –

-1

Вы также можете добавить некоторые очень простые обработки ошибок, если все, что вы хотите сделать d o пропускает запись, бросая эту ошибку. Я просто вставил нижнюю строку непосредственно над той, которая генерировала эту ошибку для меня, и теперь она с радостью движется вперед, игнорируя повторяющиеся ключи, которые использовались для выброса этой ошибки.

On Error Resume Next 
+1

Как эта строка поможет с обработкой ошибки *? Возможно, поможет 'On Error Goto 0' или даже' if Err.number <> 0 then'. – dakab

+0

Я новичок в VBA, поэтому, пожалуйста, исправьте меня, если я ошибаюсь здесь; мои комментарии основаны на моем собственном тестировании с запуском моего полного макроса через ограниченный набор данных. Все, что мне было нужно, это игнорировать дублирующее значение, потому что я использую [свернутый макрос] (http: // stackoverflow.com/questions/25889766/ms-project-2013-display-resources-on-summary-tasks/25901025), который обеспечивает объединение значений. (Итак, как только у меня есть значение, как только мне не нужно ничего с ним делать, если он снова появится) Я добавил строку, на которую я ссылался выше, и мои проверенные результаты были хорошими - кажется, что игнорировать ошибку просто отлично. Я что-то упускаю? – bpboldin

+0

[bpboldin] (http://stackoverflow.com/users/1778734), причина для комментария [dakab] (http://stackoverflow.com/users/2083613) заключается в том, что это не ошибка _handling_, это ошибка _skipping_. Используя 'if err.number <> 0', а затем, если не известная ошибка, с чем-то, что может сделать код, чтобы обойти его, печатать' err.number', 'err.source' и' err.description' для экрана или файл будет обрабатывать эту ошибку, а не вызвать неожиданное прекращение сценария, который не позволяет закрывать файлы, журнал подробностей причины остановки или любые удобные для пользователя сообщения об ошибках. – user66001

0

У меня получалось такое же сообщение об ошибке: «Ошибка Этот ключ уже связан с элементом этой коллекции». В моем случае, проблема в том, что у меня было так:

'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» код, чтобы увидеть, если вы используют соответствующие имена для тех переменных, которые являются частными в вашем классе.

Смежные вопросы