UDP вопрос решён)
Очень интересно было бы услышать мнение-совет-вашу версию кода...
Осмотрел уже все, что смог найти в инете... написал свой вариант, но выдает ошибку где-то
СПАСИБО!!!
Вот пытаюсь в который день создать код макроса для Visual Basic в Эксель 2013 года для заполнения знаков вопроса согласно примеру необходимого результата.
Основная проблема - строк 10000, неудобно делать это через связку сцепить+индекс+поискпоз с разделителем ;
Да ещё и важно избежать повторения уже вставленных строк.
Дано: 2 таблицы. Одна заполненная, на листе 1 , вторую на листе 2 нужно заполнить с помощью программируемого кода через макрос. Даю пример, по которому нужно проверить, что все работает. Все объединил на третьем листе, чтобы было удобно понять, что к чему.
Алгоритм действий:
1 Найти в таблице 1 первое совпадение сырья в столбце E
2 Вставить название подразделения из первого столбца таблицы 1. Вставить текстовый разделитель "; "
4 Найти в таблице 1 следующее совпадение сырья в столбце E
5 Если совпадение найдено, вставить название подразделения из первого столбца таблицы 1 и текстовый разделитель ";", только если оно ещё НЕ БЫЛО вставлено (избежать повторения).
6 Если совпадений больше не найдено, а последний символ ";", то удалить ";"
7 Если совпадений не было в принципе, то вставить текст "-"
Код макроса вот такой:| Код |
|---|
Sub ЗаполнитьПодразделения()
'Создаем объекты
Dim wb As Workbook
Dim wsSource As Worksheet
Dim wsResult As Worksheet
Dim rngSource As Range
Dim rngResult As Range
Dim lastRow As Long
Dim lastCol As Long
Dim strRaw As String
Dim arrData() As String
Dim strSeparator As String
'Инициализируем объекты
Set wb = ThisWorkbook
Set wsSource = wb.Sheets("Лист1")
Set wsResult = wb.Sheets("Лист2")
'Определяем последний ряд и последний заполненный столбец в таблице 1
lastRow = wsSource.Cells(wsSource.Rows.Count, "C").End(xlUp).Row
lastCol = wsSource.Cells(1, wsSource.Columns.Count).End(xlToLeft).Column
'Берем данные из таблицы 1
Set rngSource = wsSource.Range(wsSource.Cells(2, 1), wsSource.Cells(lastRow, lastCol))
arrData = rngSource.Value
'Ищем совпадения в таблице 2
Set rngResult = wsResult.Range(wsResult.Cells(2, 3), wsResult.Cells(lastRow, 3))
For i = 1 To lastRow
strRaw = rngResult.Cells(i, 1).Value 'текущее сырье
For j = 1 To UBound(arrData, 1)
If arrData(j, 2) = strRaw Then 'совпадение найдено, добавляем подразделение
rngResult.Cells(i, 3).Value = rngResult.Cells(i, 3).Value & arrData(j, 1) & "; "
End If
Next j
If rngResult.Cells(i, 3).Value Like "*; " Then
rngResult.Cells(i, 3).Value = Left(rngResult.Cells(i, 3).Value, Len(rngResult.Cells(i, 3).Value) - 2)
ElseIf rngResult.Cells(i, 3).Value = "" Then
rngResult.Cells(i, 3).Value = "-"
End If
Next i
'Сообщаем о завершении
MsgBox "Заполнение подразделений завершено!", vbInformation, "Успех:)"
End Sub
|