Добрый день. Есть xls-файлик (счет-фактура), в котором список товаров. Напротив каждой позиции написано количество. Нужно: если число в столбце количество больше 200, макрос разбивает на несколько разных слагаемых, иначе оставляет число. Файлик с примером прикрепляю. Количество позиций всегда разное.
Заранее спасибо.
Добрый день. Есть xls-файлик (счет-фактура), в котором список товаров. Напротив каждой позиции написано количество. Нужно: если число в столбце количество больше 200, макрос разбивает на несколько разных слагаемых, иначе оставляет число. Файлик с примером прикрепляю. Количество позиций всегда разное.
Sub Button1_Click() Application.ScreenUpdating = False arr = Range("A3:C" & Cells(Rows.Count, "A").End(xlUp).Row) lr = Cells(Rows.Count, "E").End(xlUp).Row If lr > 2 Then Range("E3:G" & lr).Clear cr = 2 Min = 10 Max = 200 For i = 1 To UBound(arr) If arr(i, 3) <= 200 Then Cells(cr, "E") = arr(i, 1) Cells(cr, "F") = arr(i, 2) Cells(cr, "G") = arr(i, 3) cr = cr + 1 Else cnt = arr(i, 3) Do While cnt > 0 n = Application.WorksheetFunction.Round((Max - Min + 1) * Rnd + Min, -1) If cnt < n Then n = cnt Cells(cr, "E") = arr(i, 1) Cells(cr, "F") = arr(i, 2) Cells(cr, "G") = n cnt = cnt - n cr = cr + 1 Loop End If Next Application.ScreenUpdating = True End Sub
[/vba]
Решение. [vba]
Код
Sub Button1_Click() Application.ScreenUpdating = False arr = Range("A3:C" & Cells(Rows.Count, "A").End(xlUp).Row) lr = Cells(Rows.Count, "E").End(xlUp).Row If lr > 2 Then Range("E3:G" & lr).Clear cr = 2 Min = 10 Max = 200 For i = 1 To UBound(arr) If arr(i, 3) <= 200 Then Cells(cr, "E") = arr(i, 1) Cells(cr, "F") = arr(i, 2) Cells(cr, "G") = arr(i, 3) cr = cr + 1 Else cnt = arr(i, 3) Do While cnt > 0 n = Application.WorksheetFunction.Round((Max - Min + 1) * Rnd + Min, -1) If cnt < n Then n = cnt Cells(cr, "E") = arr(i, 1) Cells(cr, "F") = arr(i, 2) Cells(cr, "G") = n cnt = cnt - n cr = cr + 1 Loop End If Next Application.ScreenUpdating = True End Sub
let Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Артикул", Int64.Type}, {"Название", type text}, {"Количество", Int64.Type}}), #"Добавлен пользовательский объект2" = Table.AddColumn(#"Измененный тип", "Новое_количество", each if [Количество]>200 then List.Generate(()=> [ x = 200 , y = [Количество]] , each [y] > 0, each [x=Number.Round(Number.RandomBetween(10,200),-1), y = [y]-[x]] , each [x]) else [Количество]), #"Развернутый элемент Новое_количество" = Table.ExpandListColumn(#"Добавлен пользовательский объект2", "Новое_количество"), #"Удаленные столбцы" = Table.RemoveColumns(#"Развернутый элемент Новое_количество",{"Количество"}) in #"Удаленные столбцы"
[/vba]
upd. файлик удалил, завтра доделаю (не сделал проверку последнего числа, пока работает не правильно)
Рандомайз в PowerQuery
[vba]
Код
let Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Артикул", Int64.Type}, {"Название", type text}, {"Количество", Int64.Type}}), #"Добавлен пользовательский объект2" = Table.AddColumn(#"Измененный тип", "Новое_количество", each if [Количество]>200 then List.Generate(()=> [ x = 200 , y = [Количество]] , each [y] > 0, each [x=Number.Round(Number.RandomBetween(10,200),-1), y = [y]-[x]] , each [x]) else [Количество]), #"Развернутый элемент Новое_количество" = Table.ExpandListColumn(#"Добавлен пользовательский объект2", "Новое_количество"), #"Удаленные столбцы" = Table.RemoveColumns(#"Развернутый элемент Новое_количество",{"Количество"}) in #"Удаленные столбцы"
[/vba]
upd. файлик удалил, завтра доделаю (не сделал проверку последнего числа, пока работает не правильно)sboy
Яндекс: 410016850021169
Сообщение отредактировал sboy - Четверг, 14.03.2019, 17:57