Здравствуйте. Помогите с написанием макроса или формулы. Просто не знаю возможно ли так сделать средствами excel. На одном листе две таблицы. таблица 1 с данными, таблица 2 пустая Нужно чтобы из табл 1 перемещались строки в табл 2 сумма которых равна определенному числу.
Здравствуйте. Помогите с написанием макроса или формулы. Просто не знаю возможно ли так сделать средствами excel. На одном листе две таблицы. таблица 1 с данными, таблица 2 пустая Нужно чтобы из табл 1 перемещались строки в табл 2 сумма которых равна определенному числу.kirkato
Пока разбирался как все таки переделать вариант от Pelena под свой. тут уже оказался готовый вариант спасибо Miver'у. Miver ваш способ при числе допустим "23000" выдает результат 22990, при числе "50" выдает 30, при "1000" - 990 и тд. Можно ли это как то подправить? и еще а как прописать в макросе чтоб не копировались строки а переносились? В принципе точность можно и руками подправить, а вот как именно перенести
Пока разбирался как все таки переделать вариант от Pelena под свой. тут уже оказался готовый вариант спасибо Miver'у. Miver ваш способ при числе допустим "23000" выдает результат 22990, при числе "50" выдает 30, при "1000" - 990 и тд. Можно ли это как то подправить? и еще а как прописать в макросе чтоб не копировались строки а переносились? В принципе точность можно и руками подправить, а вот как именно перенестиkirkato
Появилась проблемка с макросом. Загрузил данные, примерно 520000 строк и попробывал сформировать по нужной мне сумме. в первый раз работает отлично набирает столько сколько и нужно, а вот во второй и последующие разы макрос вообще не срабатывает. Как заставить его работать корректно?
Появилась проблемка с макросом. Загрузил данные, примерно 520000 строк и попробывал сформировать по нужной мне сумме. в первый раз работает отлично набирает столько сколько и нужно, а вот во второй и последующие разы макрос вообще не срабатывает. Как заставить его работать корректно?kirkato
Дело все в пробелах в данных. Было прописано до первого пропуска сверху. Поменял на первую строку с низу. Лучше отсортировать данные по убыванию Посмотри код с коментариями ниже. Если один раз разобратся, то дальше проще переделывать под себя [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim ArrRez() Dim TmpArrRez()
If (Union(Target.Cells(1), Range("H6")).Address = Range("H6").Address) Then '------------------------------------------------- '-- Блок сортировки Лист2.ListObjects("Реестр").Sort.SortFields.Clear Лист2.ListObjects("Реестр").Sort.SortFields.Add _ Key:=Range("Реестр[Сумма]"), _ SortOn:=xlSortOnValues, _ Order:=xlDescending, _ DataOption:=xlSortNormal
ReDim TmpArrRez(LBound(arr, 2) To UBound(arr, 2), 1 To 1)
'-- Перебор данных в памяти For i = LBound(arr) To UBound(arr) [color=red]A = Val(arr(i, 3))[/color] '-- Если очередное значение менше суммы и болше нуля переносим в таблицу [color=red]If A <= summ And A > 0 Then[/color] For j = LBound(arr, 2) To UBound(arr, 2) '-- Сам перенос знрачений TmpArrRez(j, UBound(TmpArrRez, 2)) = arr(i, j) arr(i, j) = "" Next j ReDim Preserve TmpArrRez(LBound(arr, 2) To UBound(arr, 2), 1 To UBound(TmpArrRez, 2) + 1) summ = summ - A End If If summ = 0 Then Exit For Next i
'-- Транспонируем полученую таблицу ReDim ArrRez(LBound(TmpArrRez, 2) To UBound(TmpArrRez, 2), LBound(TmpArrRez) To UBound(TmpArrRez)) For i = LBound(ArrRez) To UBound(ArrRez) For j = LBound(arr, 2) To UBound(arr, 2) ArrRez(i, j) = TmpArrRez(j, i) Next j Next i
'-- Вывод значений на лист Range("K7:M" & 6 + UBound(ArrRez)).Value = ArrRez Range("D7:F" & 6 + UBound(arr)).Value = arr End If End Sub
[/vba]
Дело все в пробелах в данных. Было прописано до первого пропуска сверху. Поменял на первую строку с низу. Лучше отсортировать данные по убыванию Посмотри код с коментариями ниже. Если один раз разобратся, то дальше проще переделывать под себя [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim ArrRez() Dim TmpArrRez()
If (Union(Target.Cells(1), Range("H6")).Address = Range("H6").Address) Then '------------------------------------------------- '-- Блок сортировки Лист2.ListObjects("Реестр").Sort.SortFields.Clear Лист2.ListObjects("Реестр").Sort.SortFields.Add _ Key:=Range("Реестр[Сумма]"), _ SortOn:=xlSortOnValues, _ Order:=xlDescending, _ DataOption:=xlSortNormal
ReDim TmpArrRez(LBound(arr, 2) To UBound(arr, 2), 1 To 1)
'-- Перебор данных в памяти For i = LBound(arr) To UBound(arr) [color=red]A = Val(arr(i, 3))[/color] '-- Если очередное значение менше суммы и болше нуля переносим в таблицу [color=red]If A <= summ And A > 0 Then[/color] For j = LBound(arr, 2) To UBound(arr, 2) '-- Сам перенос знрачений TmpArrRez(j, UBound(TmpArrRez, 2)) = arr(i, j) arr(i, j) = "" Next j ReDim Preserve TmpArrRez(LBound(arr, 2) To UBound(arr, 2), 1 To UBound(TmpArrRez, 2) + 1) summ = summ - A End If If summ = 0 Then Exit For Next i
'-- Транспонируем полученую таблицу ReDim ArrRez(LBound(TmpArrRez, 2) To UBound(TmpArrRez, 2), LBound(TmpArrRez) To UBound(TmpArrRez)) For i = LBound(ArrRez) To UBound(ArrRez) For j = LBound(arr, 2) To UBound(arr, 2) ArrRez(i, j) = TmpArrRez(j, i) Next j Next i
'-- Вывод значений на лист Range("K7:M" & 6 + UBound(ArrRez)).Value = ArrRez Range("D7:F" & 6 + UBound(arr)).Value = arr End If End Sub
Михаил (miver), не надо игнорировать замечание модератора!
Никого не хотел обидеть. Просто хотел выделить красным цветом строки на которые нужно обратить внимание kirkato, В теге нельзя этого сделать [/offtop]miver