Доброго времени суток уважаемые форумчане, пожалуйста, подскажите можно ли такое реализовать. Нужно, чтобы макрос выполнял следующее: Имеем таблицу состоящую из 19 столбцов на Листе 1, имеем ячейки разного цвета со значением на Листе "Данные" справа от которой указано количество. Суть в том чтобы к таблице (Лист 1) необходимо вставить ячейки в столбец Т из листа "Данные" в соответствии с указанным количеством. Прикрепил файл Пример, а также на 3 Листе для наглядности создал уже готовую таблицу после выполнения макроса. Прошу обратить внимание, что не во всех ячейках на 2 листе указано число 15, то есть при распределении необходимо исключать данные строки.
Доброго времени суток уважаемые форумчане, пожалуйста, подскажите можно ли такое реализовать. Нужно, чтобы макрос выполнял следующее: Имеем таблицу состоящую из 19 столбцов на Листе 1, имеем ячейки разного цвета со значением на Листе "Данные" справа от которой указано количество. Суть в том чтобы к таблице (Лист 1) необходимо вставить ячейки в столбец Т из листа "Данные" в соответствии с указанным количеством. Прикрепил файл Пример, а также на 3 Листе для наглядности создал уже готовую таблицу после выполнения макроса. Прошу обратить внимание, что не во всех ячейках на 2 листе указано число 15, то есть при распределении необходимо исключать данные строки.Netsky
Sub ertert() Dim x, y(), i&, k&, sm& With Sheets("Данные") x = .Range("A6:B" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With With Application sm = .Sum(.Index(x, 0, 2)) End With ReDim y(1 To sm, 1 To 1)
Do While sm > 0 For i = 1 To UBound(x) If x(i, 2) > 0 Then k = k + 1 y(k, 1) = x(i, 1) x(i, 2) = x(i, 2) - 1 sm = sm - 1 End If Next i Loop
Sheets("Лист 1").Range("T1").Resize(UBound(y)).Value = y() End Sub
[/vba]
Netsky, привет Например, вот так попробуйте:
[vba]
Код
Sub ertert() Dim x, y(), i&, k&, sm& With Sheets("Данные") x = .Range("A6:B" & .Cells(Rows.Count, 1).End(xlUp).Row).Value End With With Application sm = .Sum(.Index(x, 0, 2)) End With ReDim y(1 To sm, 1 To 1)
Do While sm > 0 For i = 1 To UBound(x) If x(i, 2) > 0 Then k = k + 1 y(k, 1) = x(i, 1) x(i, 2) = x(i, 2) - 1 sm = sm - 1 End If Next i Loop
Sheets("Лист 1").Range("T1").Resize(UBound(y)).Value = y() End Sub
Все работает, я удивлен как вы легко это написали) Я же пробовал макрорекордером с изменением под себя, по итоге такой страшный костыль вышел и то так до конца правильно и не смог его сделать. Спасибо большое за вашу помощь!
Все работает, я удивлен как вы легко это написали) Я же пробовал макрорекордером с изменением под себя, по итоге такой страшный костыль вышел и то так до конца правильно и не смог его сделать. Спасибо большое за вашу помощь!Netsky
А есть возможность сохранения формата ячейки (цвета)? И еще обнаружил момент, если в таблице на Листе 1 меньше строк, чем того требует , то ячейки из листа "Данные" все равно вставляются до конца (в соответствии с "Суммой (B4) на листе "Данные", как можно избежать этого? К примеру если я укажу количество строк требуемое для определения 100, то можно ли как-то это прикрутить к макросу способствуя ограничению его выполнения?
А есть возможность сохранения формата ячейки (цвета)? И еще обнаружил момент, если в таблице на Листе 1 меньше строк, чем того требует , то ячейки из листа "Данные" все равно вставляются до конца (в соответствии с "Суммой (B4) на листе "Данные", как можно избежать этого? К примеру если я укажу количество строк требуемое для определения 100, то можно ли как-то это прикрутить к макросу способствуя ограничению его выполнения?Netsky
Сообщение отредактировал Netsky - Пятница, 13.01.2017, 10:23
With Sheets("Данные") With .Range("A6:C" & .Cells(Rows.Count, 1).End(xlUp).Row) x = .Value For i = 1 To UBound(x) x(i, 3) = .Cells(i, 1).Interior.Color Next i End With End With
With Application sm = .Sum(.Index(x, 0, 2)) End With ReDim y(1 To sm, 1 To 1)
With Sheets("Лист 1") lr = .Cells(Rows.Count, 1).End(xlUp).Row Do While sm > 0 For i = 1 To UBound(x) If x(i, 2) > 0 Then k = k + 1 If k > lr Then sm = 0: Exit For y(k, 1) = x(i, 1) x(i, 2) = x(i, 2) - 1 sm = sm - 1 .Cells(k, 20).Interior.Color = x(i, 3) End If Next i Loop .Range("T1").Resize(k).Value = y() End With End Sub
[/vba]
[p.s.]"способствуя ограничению его выполнения" - прям песня :)[/p.s.]
ну тогда пробуйте так:
[vba]
Код
Sub ertert() Dim x, y(), i&, k&, sm&, lr&
With Sheets("Данные") With .Range("A6:C" & .Cells(Rows.Count, 1).End(xlUp).Row) x = .Value For i = 1 To UBound(x) x(i, 3) = .Cells(i, 1).Interior.Color Next i End With End With
With Application sm = .Sum(.Index(x, 0, 2)) End With ReDim y(1 To sm, 1 To 1)
With Sheets("Лист 1") lr = .Cells(Rows.Count, 1).End(xlUp).Row Do While sm > 0 For i = 1 To UBound(x) If x(i, 2) > 0 Then k = k + 1 If k > lr Then sm = 0: Exit For y(k, 1) = x(i, 1) x(i, 2) = x(i, 2) - 1 sm = sm - 1 .Cells(k, 20).Interior.Color = x(i, 3) End If Next i Loop .Range("T1").Resize(k).Value = y() End With End Sub
[/vba]
[p.s.]"способствуя ограничению его выполнения" - прям песня :)[/p.s.]nilem