Страницы: 1
RSS
Вставить значения из вертикальных диапазонов горизонтально, но так, чтобы вставка в одну строку повторялась только в в пределах одного товара
 
Добрый день всем excel профи! Не могу сам решить задачу, не хватает уровня знаний эксель...

Нужно вставить из вертикальных колонок с данными о товарах значения горизонтально, но так, чтобы вставка в одну строку повторялась только в в пределах одного товара (одинакового идентификатора). А когда идентификатор меняется, вставка начиналась с новой строки. В обще сделал пример с 2 вкладками: "Как есть" и "Как должно быть". Возможно ли решения такой задачи в эксель в принципе? Позиций несколько тысяч, вручную- нереально... Помогите....
 
При активном листе Что есть запустить макрос (добавьте сами недостающие строки вместо и т.д.)
Код
Sub Tablica()
Dim i As Long
Dim iLastRow As Long
Dim iLR As Long
Dim KDB As Worksheet
  Set KDB = ThisWorkbook.Worksheets("Как должно быть")
 iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
 With KDB
   For i = 2 To iLastRow Step 9
     iLR = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
     .Cells(iLR, 1) = Cells(i, 1)               'идентификатор
     .Cells(iLR, 2) = Cells(i, 2)               'рабочее напряжение
     .Cells(iLR, 4) = Cells(i, 4)               '250 V
     .Cells(iLR, 5) = Cells(i + 1, 2)           'Макс.рабочее напряжение
     .Cells(iLR, 7) = Cells(i + 1, 4)           '250 V
     'и т.д.
   Next
 End With
End Sub
 
Максим Николаевич, еще вариант
Код
Sub mrshkei()
Dim arr, arr2, i As Long, n As Long, lr As Long, k As Long, k2 As Long, rng As Range
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A1:E" & lr)
ReDim arr2(1 To lr, 1 To 3 * 9 + 1): k = 2
arr2(1, 1) = arr(1, 1)
For i = 2 To (3 * 9 + 1) Step 3
    arr2(1, i) = arr(1, 2)
    arr2(1, i + 1) = arr(1, 3)
    arr2(1, i + 2) = arr(1, 4)
Next i
For i = LBound(arr) + 1 To UBound(arr) Step 9
k2 = 2
arr2(k, 1) = arr(i, 1)
    For n = 0 To 8
        arr2(k, k2) = arr(i + n, 2)
        arr2(k, k2 + 1) = arr(i + n, 3)
        arr2(k, k2 + 2) = arr(i + n, 4)
        k2 = k2 + 3
    Next n
    k = k + 1
Next i
Set rng = Application.InputBox("Выберите одну ячейку с которой начнется вывод результата", Type:=8)
rng.Resize(UBound(arr2), UBound(arr2, 2) - LBound(arr2) + 1) = arr2
End Sub

Изменено: Mershik - 24.05.2021 14:41:26
Не бойтесь совершенства. Вам его не достичь.
 
К сожалению не могу понять, что нужно добавить дальше, не понимаю принципа, почему порядок 1,2,4    1,2     1,4
 
Вариант формулой.
Код
A2      =СМЕЩ('Что есть'!$A$1;9*СТРОКА(1:1)-8+(СТОЛБЕЦ(A:A)>1)*(СТОЛБЕЦ(A:A)-2)/3;(СТОЛБЕЦ(A:A)>1)*(ОСТАТ(СТОЛБЕЦ(A:A)-2;3)+1))
 
Спасибо всем огромное! Сейчас попытаюсь разобраться, ведь у меня совсем начальный уровень...
 
Вариант:
Код
=СМЕЩ('Что есть'!$B$2;СТРОКА(A1)*9-10+СТОЛБЕЦ(B3)/3+(СТОЛБЕЦ()<2);ОСТАТ(СТОЛБЕЦ(B2);3)-(СТОЛБЕЦ()<2)*3)
 
Цитата
Mershik написал:
сложная вставка.xlsm
У вас самый идеальный вариант для новичка- большая кнопка посреди документа. Но когда я вставил много значений, почему то не все они отображаются в списке. (Я увеличил количество характеристик с 9 до 39 т.к. это максимальное количество, но теперь некоторые идентефикаторы не попали в список. почему-то в списке только 37 позиций. Помогите, понять, пожалуйста, что не так я сделал?
 
Максим Николаевич, написал
Цитата
что не так я сделал?
У вас в первоначальном варианте на каждый идентификатор приходилось четко по 9 характеристик,
а в последнем уже наблюдается чехарда
 
Да, простите, не подумал об этом. Подскажите, пожалуйста, какие правки внести, чтобы можно было до 40 характеристик добавлять? Я пробовал везде число 9 в макросе изменять на 39, но он так не заработал.
Помогите, пожалуйста, подправить макрос для 40 характеристик
Код
Sub mrshkei()
Dim arr, arr2, i As Long, n As Long, lr As Long, k As Long, k2 As Long, rng As Range
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A1:E" & lr)
ReDim arr2(1 To lr, 1 To 3 * 40 + 1): k = 2
arr2(1, 1) = arr(1, 1)
For i = 2 To (3 * 40 + 1) Step 3
    arr2(1, i) = arr(1, 2)
    arr2(1, i + 1) = arr(1, 3)
    arr2(1, i + 2) = arr(1, 4)
Next i
For i = LBound(arr) + 1 To UBound(arr) Step 40
k2 = 2
arr2(k, 1) = arr(i, 1)
    For n = 0 To 8
        arr2(k, k2) = arr(i + n, 2)
        arr2(k, k2 + 1) = arr(i + n, 3)
        arr2(k, k2 + 2) = arr(i + n, 4)
        k2 = k2 + 3
    Next n
    k = k + 1
Next i
Set rng = Application.InputBox("Âûáåðèòå îäíó ÿ÷åéêó ñ êîòîðîé íà÷íåòñÿ âûâîä ðåçóëüòàòà", Type:=8)
rng.Resize(UBound(arr2), UBound(arr2, 2) - LBound(arr2) + 1) = arr2
End Sub
 
В общем я упустил важную деталь, простите.... Количество характеристик может быть разным- от 0 до 40. Предполагаю, что до данного этапа все правильно
Код
Sub mrshkei()
Dim arr, arr2, i As Long, n As Long, lr As Long, k As Long, k2 As Long, rng As Range
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A1:E" & lr)
ReDim arr2(1 To lr, 1 To 3 * 40 + 1): k = 2
arr2(1, 1) = arr(1, 1)
For i = 2 To (3 * 40 + 1) Step 3
    arr2(1, i) = arr(1, 2)
    arr2(1, i + 1) = arr(1, 3)
    arr2(1, i + 2) = arr(1, 4)
Next i
For i = LBound(arr) + 1 To UBound(arr) Step 40
k2 = 2
arr2(k, 1) = arr(i, 1)

а вот дальше нужно вставить не стабильное число 0-8
Код
For n = 0 To 8
а проверку, изменился ли идентификатор (колонка А). Если не изменился, то по повторить обработку массива, если же изменился, то перейти к новой строке (только это я теоретически понимаю, как это реализуется я не знаю...)
Изменено: Максим Николаевич - 25.05.2021 11:50:56
 
Максим Николаевич, проверить нужно
Код
Sub mrshkei()
Dim arr, arr2, i As Long, n As Long, lr As Long, k As Long, k2 As Long, rng As Range
Dim col As New Collection
kol = 0
lr = Cells(Rows.Count, 1).End(xlUp).Row
arr = Range("A1:E" & lr)
For i = LBound(arr) + 1 To UBound(arr)
    On Error Resume Next
    col.Add arr(i, 1), CStr(arr(i, 1))
    xx = Application.WorksheetFunction.CountIf(Columns(1), arr(i, 1))
    If x < xx Then x = xx
Next i
ReDim arr2(1 To col.Count + 1, 1 To 3 * x + 1): k = 2
arr2(1, 1) = arr(1, 1)
For i = 2 To (3 * x + 1) Step 3
    arr2(1, i) = arr(1, 2)
    arr2(1, i + 1) = arr(1, 3)
    arr2(1, i + 2) = arr(1, 4)
Next i
For j = 1 To col.Count
xx = Application.WorksheetFunction.CountIf(Columns(1), col(j))
k2 = 2
For i = LBound(arr) + 1 To UBound(arr)
If col(j) = arr(i, 1) Then
arr2(k, 1) = arr(i, 1)
    For n = 0 To xx - 1
        arr2(k, k2) = arr(i + n, 2)
        arr2(k, k2 + 1) = arr(i + n, 3)
        arr2(k, k2 + 2) = arr(i + n, 4)
        k2 = k2 + 3
    Next n
Exit For
End If
Next i
k = k + 1
Next j
Set rng = Application.InputBox("Выберите одну ячейку с которой начнется вывод результата", Type:=8)
rng.Resize(UBound(arr2), UBound(arr2, 2) - LBound(arr2) + 1) = arr2
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Mershik,
Надо бы предварительно очистить область, куда будет вывод результата
И не все переменные в макросе определены
 
Работает! Спасибо!!!
 
Цитата
Mershik написал:
проверить нужно
Добрый день! Проверил, в файле есть ошибка, он пропускает некоторые позиции (там где Н/Д в столбце F). Красным в столбце А выделены позиции, которые не попали в итоговый результат.

Не могли бы Вы глянуть пожалуйста, в чем ошибка https://fex.net/ru/s/ktryvaa Не могу добавить файл, т.к. он больше 100 кб.

Шикарный файл, очень удобный. Но сам я эту проблему никак не решу. Помогите, пожалуйста  
Изменено: Максим Николаевич - 04.08.2021 13:13:07
Страницы: 1
Наверх