Добрый день
Выдаёт ошибку 457: Для элемента коллекции определен ключ, уже определяющий другой элемент коллекции.
Жалуется на
idx.Add iCell.Value, i, но я его вообще нигде не использовал до первого появления.
Помогите, пожалуйста, всю голову сломал!
Спойлер
Sub Кнопка1_Щелчок()
Application.ScreenUpdating = False
Dim path As String
path = "C:\Users"
Dim path1 As String
Dim temp_name As String
temp_name = "spec_template_2"
Dim file_ext As String
file_ext = ".xlsx"
Dim spec_names As New Collection 'список всех спецификаций
Dim dwg_names As New Collection 'список комплектов
Dim i As Integer
i = 1
Dim idx As Dictionary
Set idx = New Dictionary
Dim idx_1 As Dictionary ' индекс начальной позиции данных
Set idx_1 = New Dictionary
Dim idx_2 As Dictionary ' индекс конечной позиции данных
Set idx_2 = New Dictionary
Dim s_sc As Dictionary 'класс безопасности
Set s_sc = New Dictionary
Dim s_mcs As New Dictionary 'код MCS
Set s_mcs = New Dictionary
Dim s_qa As Dictionary 'категория обеспечения качества
Set s_qa = New Dictionary
s_qa.Add "4Н", "QNC"
s_qa.Add "3Н", "QA3"
s_qa.Add "2О", "QA2"
Dim s_id As New Collection 'артикул
Dim s_item_name As New Collection 'наименование
Dim s_qty As New Collection 'количество
Dim s_unit As New Collection 'размерность
Dim s_unit_value As New Collection 'единичная стоимость
Dim s_total_value As New Collection 'общая стоимость
Dim iCell As Range
For Each iCell In Range(Sheets(1).Cells(5, "A"), Sheets(1).Cells(Rows.Count, "A").End(xlUp))
s_id.Add Sheets(1).Cells(iCell.Row, 2).Value
Dim a() As String
a = Split(Sheets(1).Cells(iCell.Row, 1).Value, "/")
If (UBound(a) > 0) Then s_item_name.Add a(0)
s_qty.Add Sheets(1).Cells(iCell.Row, 8).Value
s_unit.Add Sheets(1).Cells(iCell.Row, 5).Value
s_unit_value.Add Sheets(1).Cells(iCell.Row, 7).Value
's_total_value.Add Sheets(1).Cells(iCell.Row, 7).Value
's_unit_value.Add s_total_value(s_total_value.Count) / s_qty(s_qty.Count)
If (iCell.Value <> "") Then
i = 1
spec_names.Add iCell.Value
dwg_names.Add Sheets(1).Cells(iCell.Row, 1).Value
idx.Add iCell.Value, i
s_sc.Add iCell.Value, Sheets(1).Cells(iCell.Row, 6).Value
s_mcs.Add iCell.Value, Sheets(8).Cells(iCell.Row, 3).Value
tmp = iCell.Value
Else
i = i + 1
idx.Item(spec_names.Item(spec_names.Count)) = i
End If
Next
idx.Remove (spec_names.Item(spec_names.Count))
s_sc.Remove (spec_names.Item(spec_names.Count))
spec_names.Remove (spec_names.Count)
dwg_names.Remove (dwg_names.Count)
s_id.Remove (s_id.Count)
s_qty.Remove (s_qty.Count)
s_unit.Remove (s_unit.Count)
's_total_value.Remove (s_total_value.Count)
's_unit_value.Remove (s_unit_value.Count)
idx_1.Add spec_names(1), 1
idx_2.Add spec_names(1), idx.Item(spec_names(1))
For i = 2 To idx.Count
idx_1.Add spec_names(i), (idx_2.Item(spec_names(i - 1)) + 1)
idx_2.Add spec_names(i), (idx.Item(spec_names(i)) + idx_2.Item(spec_names(i - 1)))
Next i
'Запись спецификаций
For i = 1 To spec_names.Count
Workbooks.Open (path + temp_name + file_ext)
path1 = path + CStr(spec_names.Item(i)) + file_ext
ActiveWorkbook.Sheets(1).Cells(7, 1).Value = spec_names.Item(i) + " от 18.10.2021" 'Дата документа
ActiveWorkbook.Sheets(1).Cells(7, 2).Value = dwg_names(i) + " (Класс безопасности " + s_sc.Item(spec_names(i)) + ", категория обеспечения качества " + s_qa.Item(s_sc.Item(spec_names(i))) + ")"
k = 1
For j = idx_1.Item(spec_names(i)) To idx_2.Item(spec_names(i))
ActiveWorkbook.Sheets(1).Cells(11 + k, 1) = k
ActiveWorkbook.Sheets(1).Cells(11 + k, 2) = s_mcs(j)
ActiveWorkbook.Sheets(1).Cells(11 + k, 3) = s_id(j)
ActiveWorkbook.Sheets(1).Cells(11 + k, 4) = s_item_name(j)
ActiveWorkbook.Sheets(1).Cells(11 + k, 5) = s_qty(j)
ActiveWorkbook.Sheets(1).Cells(11 + k, 6) = s_unit(j)
ActiveWorkbook.Sheets(1).Cells(11 + k, 7) = s_unit_value(j) 'Раскоментить для цен
ActiveWorkbook.Sheets(1).Cells(11 + k, 8) = 0 's_total_value(j)'Раскоментить для цен
k = k + 1
Next j
ActiveWorkbook.SaveAs Filename:=path1
ActiveWorkbook.Close SaveChanges:=False
Next i
Application.ScreenUpdating = True
End Sub
Написал вам два письма на почту с заголовком "Письмо с Форума по VBA, Excel и Word". Написал именно на почту, а не на форум.
Ошибка означает, что на первом листе, в диапазоне A5:ALr несколько одинаковых значений.
Макрос двигается по всем ячейкам диапазона A5:ALr, берёт значение из ячейки и записывает в словарь.
Сначала записал значение из строки 5, затем из строки 6 и т.д. Если есть несколько одинаковых значений, то первое значение запишется, а на втором будет ошибка.
Добрый день.
Спасибо за совет.
Ради эксперимента я заменил значения в столбце А на порядковые номера, чтобы значения не повторялись, но ошибка осталась на месте.
Запись в коллекцию "idx" делается ещё в этой строке, возможно из-за этой строки появляется дубль:
idx.Item(spec_names.Item(spec_names.Count)) = i
Код у вас большой, не смогу изучить ваш код.
Всё оказалось проще :)
Вопрос решил сам, но за попытки спасибо