Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Суммируем до тех пор, пока не выполнится условие - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Суммируем до тех пор, пока не выполнится условие (Макросы/Sub)
Суммируем до тех пор, пока не выполнится условие
astronom Дата: Воскресенье, 22.11.2015, 14:07 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Продолжение темы: http://www.excelworld.ru/forum/2-20190-1

Получилось сделать все формулами, однако работает все очень долго.
На подсчет значения в одной ячейке уходит 20-30 секунд, что в пересчете на одну рабочую таблицу займет 4-5 суток))
А у меня этих таблиц несколько десятков.

Дублирую из той темы задачу:
Из данных, что есть: столбец "G" с числами. Столбец "F" показывает какое было число в "G" : отрицательное или положительное.
В колонке J я указал, какие числа должны получиться в итоге.
А теперь, что надо сделать:
Для положительных чисел: суммируем ячейки столбца "G" до тех пор, пока сумма не примет отрицательное значение. В колонку "J" заносится максимальное значение, которое получалось при сложении.
Для отрицательных чисел: суммируем ячейки столбца "G" до тех пор, пока сумма не примет положительное значение. В колонку "J" заносится минимальное значение, которое получалось при сложении.
В колонку "А" я продублировал правила вычислений, чтоб нагляднее было.
Если что не понятно, уточните, я со своей колокольни размышляю. Некоторые вещи, которые мне понятны безусловно, могут вызвать вопросы у других. И наоборот :)
К сообщению приложен файл: 6895097.xlsx (31.2 Kb)
 
Ответить
СообщениеПродолжение темы: http://www.excelworld.ru/forum/2-20190-1

Получилось сделать все формулами, однако работает все очень долго.
На подсчет значения в одной ячейке уходит 20-30 секунд, что в пересчете на одну рабочую таблицу займет 4-5 суток))
А у меня этих таблиц несколько десятков.

Дублирую из той темы задачу:
Из данных, что есть: столбец "G" с числами. Столбец "F" показывает какое было число в "G" : отрицательное или положительное.
В колонке J я указал, какие числа должны получиться в итоге.
А теперь, что надо сделать:
Для положительных чисел: суммируем ячейки столбца "G" до тех пор, пока сумма не примет отрицательное значение. В колонку "J" заносится максимальное значение, которое получалось при сложении.
Для отрицательных чисел: суммируем ячейки столбца "G" до тех пор, пока сумма не примет положительное значение. В колонку "J" заносится минимальное значение, которое получалось при сложении.
В колонку "А" я продублировал правила вычислений, чтоб нагляднее было.
Если что не понятно, уточните, я со своей колокольни размышляю. Некоторые вещи, которые мне понятны безусловно, могут вызвать вопросы у других. И наоборот :)

Автор - astronom
Дата добавления - 22.11.2015 в 14:07
nilem Дата: Воскресенье, 22.11.2015, 15:16 | Сообщение № 2
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
м.б. как-то так:
[vba]
Код
Sub ertert()
Dim x, i&, j&, sm#, mx#
x = Range("G1", Cells(Rows.Count, "G").End(xlUp)).Value
ReDim y(1 To UBound(x), 1 To 1)

For i = 2 To UBound(x)
    sm = x(i, 1)
    mx = 0
    For j = i + 1 To UBound(x)
        If Sgn(sm) <> Sgn(x(i, 1)) Then
            y(i, 1) = mx
            Exit For
        Else
            sm = sm + x(j, 1)
            If Abs(sm) > Abs(mx) Then mx = sm
        End If
    Next j
Next i

y(1, 1) = "Что должно получиться"
Range("J1").Resize(i - 1).Value = y()
End Sub
[/vba]


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Воскресенье, 22.11.2015, 15:17
 
Ответить
Сообщением.б. как-то так:
[vba]
Код
Sub ertert()
Dim x, i&, j&, sm#, mx#
x = Range("G1", Cells(Rows.Count, "G").End(xlUp)).Value
ReDim y(1 To UBound(x), 1 To 1)

For i = 2 To UBound(x)
    sm = x(i, 1)
    mx = 0
    For j = i + 1 To UBound(x)
        If Sgn(sm) <> Sgn(x(i, 1)) Then
            y(i, 1) = mx
            Exit For
        Else
            sm = sm + x(j, 1)
            If Abs(sm) > Abs(mx) Then mx = sm
        End If
    Next j
Next i

y(1, 1) = "Что должно получиться"
Range("J1").Resize(i - 1).Value = y()
End Sub
[/vba]

Автор - nilem
Дата добавления - 22.11.2015 в 15:16
astronom Дата: Воскресенье, 22.11.2015, 15:35 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 11
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Ок. Как все это засунуть в нужный столбец? Простите за глупый вопрос, но я считаю себя дубом в этих делах...

дополняю пост:

проверил, все работает, спасибо огромное.
подскажите дубу как этот макрос сохранить, чтоб он везде работал?
извините за глупые вопросы, приболел, соображалка не варит :(


Сообщение отредактировал astronom - Воскресенье, 22.11.2015, 16:22
 
Ответить
СообщениеОк. Как все это засунуть в нужный столбец? Простите за глупый вопрос, но я считаю себя дубом в этих делах...

дополняю пост:

проверил, все работает, спасибо огромное.
подскажите дубу как этот макрос сохранить, чтоб он везде работал?
извините за глупые вопросы, приболел, соображалка не варит :(

Автор - astronom
Дата добавления - 22.11.2015 в 15:35
nilem Дата: Воскресенье, 22.11.2015, 16:55 | Сообщение № 4
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
[vba]
Код
x = Range("G1", Cells(Rows.Count, "G").End(xlUp)).Value
[/vba]
- это исходный массив значений (столбец G)

[vba]
Код
Range("J1").Resize(i - 1).Value = y()
[/vba]
- а сюда выводим итоговый результат (столбец J)

Сохраните макрос в стандартном модуле в вашей книге и запускайте при активном листе, на котором есть ваши исходные данные (столбец G)

Выздоравливайте :)


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Воскресенье, 22.11.2015, 16:56
 
Ответить
Сообщение[vba]
Код
x = Range("G1", Cells(Rows.Count, "G").End(xlUp)).Value
[/vba]
- это исходный массив значений (столбец G)

[vba]
Код
Range("J1").Resize(i - 1).Value = y()
[/vba]
- а сюда выводим итоговый результат (столбец J)

Сохраните макрос в стандартном модуле в вашей книге и запускайте при активном листе, на котором есть ваши исходные данные (столбец G)

Выздоравливайте :)

Автор - nilem
Дата добавления - 22.11.2015 в 16:55
AlexM Дата: Воскресенье, 22.11.2015, 19:02 | Сообщение № 5
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4511
Репутация: 1128 ±
Замечаний: 0% ±

Excel 2003
Не успел я со своим макросом, но выложу, чтобы не пропал.
В столбце J значения полученные формулой в начале темы. Формулы заменены на значения.
Макрос заполняет столбец К
Ошибка при расчете формулой получалась когда в массиве сумм с накоплением не находилось ограничение положительное или отрицательное число. Макрос в этом случае запишет ноль.
В макрос вставлен счетчик времени работы.[vba]
Код
Sub Macros()
Dim tm!: tm = Timer
Application.ScreenUpdating = False
Dim iCell As Range
Dim AArray As Variant
Dim i As Long, j As Long
Dim Summ As Long, MinMax As Long
Set iCell = Range("G2") ' ячейка с которой начинаются значения "Что есть"
AArray = Range(iCell, Cells(Rows.Count, iCell.Column).End(xlUp)).Value
For j = 2 To UBound(AArray)
    Summ = AArray(j - 1, 1): MinMax = Summ + AArray(j, 1)
    For i = j To UBound(AArray)
        Summ = Summ + AArray(i, 1)
        If Sgn(AArray(j - 1, 1)) * MinMax < Sgn(AArray(j - 1, 1)) * Summ Then MinMax = Summ
        If Sgn(AArray(j - 1, 1)) * Summ < 0 Then Exit For
    Next i
    AArray(j - 1, 1) = IIf(i > UBound(AArray), 0, MinMax)
Next j
iCell.Offset(0, 4).Resize(UBound(AArray), 1) = AArray '4 - смещение относительно G2 начала вывода результата
Application.ScreenUpdating = True
MsgBox Timer - tm
End Sub
[/vba]
К сообщению приложен файл: 123_4.rar (27.5 Kb)



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.


Сообщение отредактировал AlexM - Воскресенье, 22.11.2015, 19:09
 
Ответить
СообщениеНе успел я со своим макросом, но выложу, чтобы не пропал.
В столбце J значения полученные формулой в начале темы. Формулы заменены на значения.
Макрос заполняет столбец К
Ошибка при расчете формулой получалась когда в массиве сумм с накоплением не находилось ограничение положительное или отрицательное число. Макрос в этом случае запишет ноль.
В макрос вставлен счетчик времени работы.[vba]
Код
Sub Macros()
Dim tm!: tm = Timer
Application.ScreenUpdating = False
Dim iCell As Range
Dim AArray As Variant
Dim i As Long, j As Long
Dim Summ As Long, MinMax As Long
Set iCell = Range("G2") ' ячейка с которой начинаются значения "Что есть"
AArray = Range(iCell, Cells(Rows.Count, iCell.Column).End(xlUp)).Value
For j = 2 To UBound(AArray)
    Summ = AArray(j - 1, 1): MinMax = Summ + AArray(j, 1)
    For i = j To UBound(AArray)
        Summ = Summ + AArray(i, 1)
        If Sgn(AArray(j - 1, 1)) * MinMax < Sgn(AArray(j - 1, 1)) * Summ Then MinMax = Summ
        If Sgn(AArray(j - 1, 1)) * Summ < 0 Then Exit For
    Next i
    AArray(j - 1, 1) = IIf(i > UBound(AArray), 0, MinMax)
Next j
iCell.Offset(0, 4).Resize(UBound(AArray), 1) = AArray '4 - смещение относительно G2 начала вывода результата
Application.ScreenUpdating = True
MsgBox Timer - tm
End Sub
[/vba]

Автор - AlexM
Дата добавления - 22.11.2015 в 19:02
Udik Дата: Воскресенье, 22.11.2015, 19:15 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
если не наврал то так :)

[vba]
Код


Public Sub check1()
Dim arrG, arr2() As Double
Dim i As Integer, j As Integer
Dim sum As Double, sumOut As Double
Dim flg1 As Byte, flg2 As Byte
Const numCln As Byte = 7
Const outCln As Byte = 9
Const startRow As Byte = 2

With Worksheets("basa")
    j = Cells(Rows.Count, numCln).End(xlUp).Row
    
    arrG = Range(.Cells(startRow, numCln), .Cells(j, numCln))
    
    ReDim arr2(1 To UBound(arrG), 1 To 1)

For i = 1 To UBound(arrG) - 1
    sum = arrG(i, 1)
    sumOut = sum + arrG(i + 1, 1)
    j = i
   
    Do
        j = j + 1
        sum = sum + arrG(j, 1)
       
        If arrG(i, 1) < 0 Then
            If sumOut > sum Then sumOut = sum
        Else
            If sumOut < sum Then sumOut = sum
        End If
        flg1 = Abs(Sgn(sum) <> Sgn(arrG(i, 1)))
        flg2 = Abs(j > UBound(arrG) - 1)
       
    Loop Until (flg1) Or (flg2)
    If flg1 <> 0 Then
        arr2(i, 1) = sumOut
    Else: arr2(i, 1) = 0 'перехода нет
    End If
  
Next i
.Range("J2").Resize(UBound(arr2)).Value = arr2()

End With
End Sub

[/vba]
К сообщению приложен файл: t1.xlsb (52.5 Kb)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщениеесли не наврал то так :)

[vba]
Код


Public Sub check1()
Dim arrG, arr2() As Double
Dim i As Integer, j As Integer
Dim sum As Double, sumOut As Double
Dim flg1 As Byte, flg2 As Byte
Const numCln As Byte = 7
Const outCln As Byte = 9
Const startRow As Byte = 2

With Worksheets("basa")
    j = Cells(Rows.Count, numCln).End(xlUp).Row
    
    arrG = Range(.Cells(startRow, numCln), .Cells(j, numCln))
    
    ReDim arr2(1 To UBound(arrG), 1 To 1)

For i = 1 To UBound(arrG) - 1
    sum = arrG(i, 1)
    sumOut = sum + arrG(i + 1, 1)
    j = i
   
    Do
        j = j + 1
        sum = sum + arrG(j, 1)
       
        If arrG(i, 1) < 0 Then
            If sumOut > sum Then sumOut = sum
        Else
            If sumOut < sum Then sumOut = sum
        End If
        flg1 = Abs(Sgn(sum) <> Sgn(arrG(i, 1)))
        flg2 = Abs(j > UBound(arrG) - 1)
       
    Loop Until (flg1) Or (flg2)
    If flg1 <> 0 Then
        arr2(i, 1) = sumOut
    Else: arr2(i, 1) = 0 'перехода нет
    End If
  
Next i
.Range("J2").Resize(UBound(arr2)).Value = arr2()

End With
End Sub

[/vba]

Автор - Udik
Дата добавления - 22.11.2015 в 19:15
RAN Дата: Воскресенье, 22.11.2015, 19:23 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
е успел я со своим макросом, но выложу, чтобы не пропал.

Я с утра долго пялился, но так и не понял, что считать.
В тексте одно, в итогах - хрень не понятая..


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
е успел я со своим макросом, но выложу, чтобы не пропал.

Я с утра долго пялился, но так и не понял, что считать.
В тексте одно, в итогах - хрень не понятая..

Автор - RAN
Дата добавления - 22.11.2015 в 19:23
Udik Дата: Воскресенье, 22.11.2015, 19:28 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
ну там суммируешь от проверяемой ячейки вниз, я это понял всего лишь на 2-й день :)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщениену там суммируешь от проверяемой ячейки вниз, я это понял всего лишь на 2-й день :)

Автор - Udik
Дата добавления - 22.11.2015 в 19:28
AlexM Дата: Воскресенье, 22.11.2015, 19:33 | Сообщение № 9
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4511
Репутация: 1128 ±
Замечаний: 0% ±

Excel 2003
суммируешь от проверяемой ячейки вниз
Формулой интереснее было сделать, но очень медленно считает.



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.
 
Ответить
Сообщение
суммируешь от проверяемой ячейки вниз
Формулой интереснее было сделать, но очень медленно считает.

Автор - AlexM
Дата добавления - 22.11.2015 в 19:33
RAN Дата: Воскресенье, 22.11.2015, 19:36 | Сообщение № 10
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Да ну?
Какие числа были присуммировании
"224,409,158,384,212,477,-16. На отрицательном числе суммирование окончено"
224
-147
388
-142
278
-366
148

И что общего?
Не нашел ни одного места, где после 224 встречается 409


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Воскресенье, 22.11.2015, 19:39
 
Ответить
СообщениеДа ну?
Какие числа были присуммировании
"224,409,158,384,212,477,-16. На отрицательном числе суммирование окончено"
224
-147
388
-142
278
-366
148

И что общего?
Не нашел ни одного места, где после 224 встречается 409

Автор - RAN
Дата добавления - 22.11.2015 в 19:36
AlexM Дата: Воскресенье, 22.11.2015, 19:43 | Сообщение № 11
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4511
Репутация: 1128 ±
Замечаний: 0% ±

Excel 2003
И что общего?
Если убрать ошибку автора вопроса, то массив для первой ячейки такой
529+(-305)=224
224+185=409
409+(-251)=158
158+226=384
384+(171)=213
213+265=478
478+(-492)=-14



Номер мобильного модема (без голосовой связи)
9269171249 МегаФон, Московский регион.


Сообщение отредактировал AlexM - Воскресенье, 22.11.2015, 19:50
 
Ответить
Сообщение
И что общего?
Если убрать ошибку автора вопроса, то массив для первой ячейки такой
529+(-305)=224
224+185=409
409+(-251)=158
158+226=384
384+(171)=213
213+265=478
478+(-492)=-14

Автор - AlexM
Дата добавления - 22.11.2015 в 19:43
RAN Дата: Воскресенье, 22.11.2015, 19:56 | Сообщение № 12
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Нет, ребята. Пулемета я вам не дам! :D


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеНет, ребята. Пулемета я вам не дам! :D

Автор - RAN
Дата добавления - 22.11.2015 в 19:56
nilem Дата: Воскресенье, 22.11.2015, 20:13 | Сообщение № 13
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
[offtop]
Нет, ребята. Пулемета я вам не дам!

Ну хотя бы рогатку что ли :)[/offtop]


Яндекс.Деньги 4100159601573
 
Ответить
Сообщение[offtop]
Нет, ребята. Пулемета я вам не дам!

Ну хотя бы рогатку что ли :)[/offtop]

Автор - nilem
Дата добавления - 22.11.2015 в 20:13
RAN Дата: Воскресенье, 22.11.2015, 20:22 | Сообщение № 14
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[offtop]Такая подойдет?
[/offtop]
К сообщению приложен файл: 9668987.jpg (72.8 Kb)


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[offtop]Такая подойдет?
[/offtop]

Автор - RAN
Дата добавления - 22.11.2015 в 20:22
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Суммируем до тех пор, пока не выполнится условие (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!