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

Вход

Регистрация

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

 

= Мир MS Excel/Overflow при поиске минимального значения - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Overflow при поиске минимального значения (Макросы/Sub)
Overflow при поиске минимального значения
amur84 Дата: Понедельник, 26.10.2015, 21:42 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 8 ±
Замечаний: 0% ±

Приветик всем, давно тут не появлялся, уже все забыл, в том числе и VBA. Пытаюсь написать простейший макрос, но где-то видать у меня синтаксис хромает. Прошу помочь, задачка вроде на один зубок.
В файле, для того, чтобы вычислить минимальное значение (зеленым пометил), при котором второй столбец сойдет на 0 за 50 строк, я подбираю вручную. Так вот хотелось бы сделать на это кнопку с макросом.
Макрос пишу для ячейки с красным числом. Вот что я наваял
[vba]
Код
Sub Min()
Dim a1, a2, b1, b2, c1, c2, e1, e2, f1, f2
Dim d As Integer
Dim i As Long
a1 = Range("B6")
a2 = Range("D6")
b1 = Range("B7")
b2 = Range("D7")
c1 = 0
c2 = Range("D10")
    Do While c2 > 0
    c1 = c1 + 1
    f1 = c1
    f2 = c2
        For i = 1 To 50
            If i < 10 Then d = 1 Else
                If i < 20 Then d = 2 Else
                    If i < 30 Then d = 4 Else
                        If i < 40 Then d = 8 Else
                            If i < 50 Then d = 16 Else d = 32
        If ((f2 * a2) - (f1 * b1) * d) < 0 Then e2 = 0 Else e2 = Int((((f2 * a2) - (f1 * b1) * d) / a1) + 0.99)
        If ((f1 * a1) - (f2 * b2) * d) < 0 Then e1 = 0 Else e1 = Int((((f1 * a1) - (f2 * b2) * d) / a2) + 0.99)
        f1 = e1
        f2 = e2
        Next i
    c2 = e2
    Loop
Range("B10").Value = e1
End Sub
[/vba]

Но мне выдает ошибку 6 Overflow
К сообщению приложен файл: 777.xlsx (15.2 Kb)


Новый день. А что успел сделать ты?
 
Ответить
СообщениеПриветик всем, давно тут не появлялся, уже все забыл, в том числе и VBA. Пытаюсь написать простейший макрос, но где-то видать у меня синтаксис хромает. Прошу помочь, задачка вроде на один зубок.
В файле, для того, чтобы вычислить минимальное значение (зеленым пометил), при котором второй столбец сойдет на 0 за 50 строк, я подбираю вручную. Так вот хотелось бы сделать на это кнопку с макросом.
Макрос пишу для ячейки с красным числом. Вот что я наваял
[vba]
Код
Sub Min()
Dim a1, a2, b1, b2, c1, c2, e1, e2, f1, f2
Dim d As Integer
Dim i As Long
a1 = Range("B6")
a2 = Range("D6")
b1 = Range("B7")
b2 = Range("D7")
c1 = 0
c2 = Range("D10")
    Do While c2 > 0
    c1 = c1 + 1
    f1 = c1
    f2 = c2
        For i = 1 To 50
            If i < 10 Then d = 1 Else
                If i < 20 Then d = 2 Else
                    If i < 30 Then d = 4 Else
                        If i < 40 Then d = 8 Else
                            If i < 50 Then d = 16 Else d = 32
        If ((f2 * a2) - (f1 * b1) * d) < 0 Then e2 = 0 Else e2 = Int((((f2 * a2) - (f1 * b1) * d) / a1) + 0.99)
        If ((f1 * a1) - (f2 * b2) * d) < 0 Then e1 = 0 Else e1 = Int((((f1 * a1) - (f2 * b2) * d) / a2) + 0.99)
        f1 = e1
        f2 = e2
        Next i
    c2 = e2
    Loop
Range("B10").Value = e1
End Sub
[/vba]

Но мне выдает ошибку 6 Overflow

Автор - amur84
Дата добавления - 26.10.2015 в 21:42
_Boroda_ Дата: Вторник, 27.10.2015, 00:16 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Ну да, все правильно, переполнение. У Вас е2 (а следовательно, и с2, и f2) увеличивается очень быстро и на некотором этапе f2 становится равно 1,21379034224578E+306. Следующей итерацией следует число, вызывающее переполнение.
Вы опишите словами логику расчета, по коду не очень понятно.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеНу да, все правильно, переполнение. У Вас е2 (а следовательно, и с2, и f2) увеличивается очень быстро и на некотором этапе f2 становится равно 1,21379034224578E+306. Следующей итерацией следует число, вызывающее переполнение.
Вы опишите словами логику расчета, по коду не очень понятно.

Автор - _Boroda_
Дата добавления - 27.10.2015 в 00:16
amur84 Дата: Вторник, 27.10.2015, 00:57 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 8 ±
Замечаний: 0% ±

_Boroda_,
е2 (а следовательно, и с2) увеличивается

Хм, веселенько. Как раз таки с2 по моей логике должно уменьшаться от значения ячейки D10 и до 0. А вот как оно станет 0 - вот то значение с1 мне и надо в ячейке B10 в конце макроса.

В цикле For я просчитываю все 50 строк, в этом расчете в каждой строке (в каждом шаге i) c2 и c1 должны уменьшаться. Если один из них станет 0, то до конца цикла For значения с1 и с2 уже не должны меняться.
Циклом Do я постепенно увеличиваю с1 на единицу, до тех пор пока с2 не станет после цикла For равняться 0.


Новый день. А что успел сделать ты?
 
Ответить
Сообщение _Boroda_,
е2 (а следовательно, и с2) увеличивается

Хм, веселенько. Как раз таки с2 по моей логике должно уменьшаться от значения ячейки D10 и до 0. А вот как оно станет 0 - вот то значение с1 мне и надо в ячейке B10 в конце макроса.

В цикле For я просчитываю все 50 строк, в этом расчете в каждой строке (в каждом шаге i) c2 и c1 должны уменьшаться. Если один из них станет 0, то до конца цикла For значения с1 и с2 уже не должны меняться.
Циклом Do я постепенно увеличиваю с1 на единицу, до тех пор пока с2 не станет после цикла For равняться 0.

Автор - amur84
Дата добавления - 27.10.2015 в 00:57
amur84 Дата: Вторник, 27.10.2015, 01:06 | Сообщение № 4
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 8 ±
Замечаний: 0% ±

Таааак, нашел опечаточку, вроде, в двух последних опереторах If a2 и a1 в конце перепутаны, вроде ошибки уже не выскакивает, но значение возвращает 0. А надо 5022.


Новый день. А что успел сделать ты?
 
Ответить
СообщениеТаааак, нашел опечаточку, вроде, в двух последних опереторах If a2 и a1 в конце перепутаны, вроде ошибки уже не выскакивает, но значение возвращает 0. А надо 5022.

Автор - amur84
Дата добавления - 27.10.2015 в 01:06
_Boroda_ Дата: Вторник, 27.10.2015, 01:06 | Сообщение № 5
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Про это-то как раз я догадался. Я спрашивал про общую логику - что-почему-откуда-куда. И в файле есть столбцы с формулами - что они должны считать и по какому алгоритму?
[p.s.]Кстати, довольно часто бывает достаточно просто словами описать это "что-почему-откуда-куда" - и сразу самостоятельно ошибку в логике макроса или формулы найдете.
Таааак, нашел опечаточку

Вооот, как раз этот случай.[/p.s.]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПро это-то как раз я догадался. Я спрашивал про общую логику - что-почему-откуда-куда. И в файле есть столбцы с формулами - что они должны считать и по какому алгоритму?
[p.s.]Кстати, довольно часто бывает достаточно просто словами описать это "что-почему-откуда-куда" - и сразу самостоятельно ошибку в логике макроса или формулы найдете.
Таааак, нашел опечаточку

Вооот, как раз этот случай.[/p.s.]

Автор - _Boroda_
Дата добавления - 27.10.2015 в 01:06
amur84 Дата: Вторник, 27.10.2015, 01:29 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 8 ±
Замечаний: 0% ±

_Boroda_,
Ну хорошо, давайте совсем подробно.
В файле для макроса важен только диапазон B6:D10, оттуда он берет 5 значений исходных данных и по ним должен найти 6-е значение и вставить в ячейку B10.
Все остальное в файле - это по сути демонстрация, как должен считать макрос. Я ручками меняю значение ячейки F10 (для макроса это B10) до тех пор пока в столбце H не появятся нули. Можете сами попробовать изменить значение с 5022 на 5021. То есть в столбцах F и H пляшут значения c1 и c2, столбцы L и N у меня вспомогательные, там происходит вычисление типа
[vba]
Код
If ((f2 * a2) - (f1 * b1) * d) < 0 Then e2 = 0 Else e2 = ((f2 * a2) - (f1 * b1) * d)
[/vba]
а уже в F и H деление и округление до целых вверх.


Новый день. А что успел сделать ты?

Сообщение отредактировал amur84 - Вторник, 27.10.2015, 01:32
 
Ответить
Сообщение _Boroda_,
Ну хорошо, давайте совсем подробно.
В файле для макроса важен только диапазон B6:D10, оттуда он берет 5 значений исходных данных и по ним должен найти 6-е значение и вставить в ячейку B10.
Все остальное в файле - это по сути демонстрация, как должен считать макрос. Я ручками меняю значение ячейки F10 (для макроса это B10) до тех пор пока в столбце H не появятся нули. Можете сами попробовать изменить значение с 5022 на 5021. То есть в столбцах F и H пляшут значения c1 и c2, столбцы L и N у меня вспомогательные, там происходит вычисление типа
[vba]
Код
If ((f2 * a2) - (f1 * b1) * d) < 0 Then e2 = 0 Else e2 = ((f2 * a2) - (f1 * b1) * d)
[/vba]
а уже в F и H деление и округление до целых вверх.

Автор - amur84
Дата добавления - 27.10.2015 в 01:29
amur84 Дата: Вторник, 27.10.2015, 01:40 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 8 ±
Замечаний: 0% ±

Вот так уже почти близко, но значение немного завышено, где то играют десятичные, видимо.
[vba]
Код
Sub Min()
Dim a1, a2, b1, b2, c1, c2, e1, e2, f1, f2
Dim i As Long
a1 = Range("B7")
a2 = Range("D7")
b1 = Range("B6")
b2 = Range("D6")
c1 = 1
c2 = Range("D10")
    Do
    f1 = c1
    f2 = c2
        For i = 1 To 50
        If ((f2 * a2) - (f1 * b1) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int((((f2 * a2) - (f1 * b1) * 2 ^ (Int(i / 10))) / a2) + 0.99)
        If ((f1 * a1) - (f2 * b2) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int((((f1 * a1) - (f2 * b2) * 2 ^ (Int(i / 10))) / a1) + 0.99)
        f1 = e1
        f2 = e2
        Next i
    Range("B10").Value = c1
    c1 = c1 + 1
    Loop While e2 > 0
End Sub
[/vba]


Новый день. А что успел сделать ты?

Сообщение отредактировал amur84 - Вторник, 27.10.2015, 03:06
 
Ответить
СообщениеВот так уже почти близко, но значение немного завышено, где то играют десятичные, видимо.
[vba]
Код
Sub Min()
Dim a1, a2, b1, b2, c1, c2, e1, e2, f1, f2
Dim i As Long
a1 = Range("B7")
a2 = Range("D7")
b1 = Range("B6")
b2 = Range("D6")
c1 = 1
c2 = Range("D10")
    Do
    f1 = c1
    f2 = c2
        For i = 1 To 50
        If ((f2 * a2) - (f1 * b1) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int((((f2 * a2) - (f1 * b1) * 2 ^ (Int(i / 10))) / a2) + 0.99)
        If ((f1 * a1) - (f2 * b2) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int((((f1 * a1) - (f2 * b2) * 2 ^ (Int(i / 10))) / a1) + 0.99)
        f1 = e1
        f2 = e2
        Next i
    Range("B10").Value = c1
    c1 = c1 + 1
    Loop While e2 > 0
End Sub
[/vba]

Автор - amur84
Дата добавления - 27.10.2015 в 01:40
amur84 Дата: Вторник, 27.10.2015, 03:50 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 8 ±
Замечаний: 0% ±

Вроде разобрался в чем косяк: у меня в расчетах в столбцах L и N первые формулы неного отличаются от всех последующих, а в макросе я их под одну гребенку засунул.
Завтра попробую допилить...


Новый день. А что успел сделать ты?
 
Ответить
СообщениеВроде разобрался в чем косяк: у меня в расчетах в столбцах L и N первые формулы неного отличаются от всех последующих, а в макросе я их под одну гребенку засунул.
Завтра попробую допилить...

Автор - amur84
Дата добавления - 27.10.2015 в 03:50
amur84 Дата: Вторник, 27.10.2015, 21:07 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 8 ±
Замечаний: 0% ±

_Boroda_, все получилось, спасибо за подсказку с переполнением, а то я бы долго искал эту и следующие опечатки. Код получился такой
[vba]
Код
Sub Min()
Dim a1, a2, c1, c2, e1, e2, f1, f2 As Long
Dim i As Long
c1 = 1
c2 = Range("D10")
Range("B10") = "считаю"
    Do
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    c1 = c1 + 1
    Loop While e2 > 0
Range("B10").Value = c1 - 1
End Sub
[/vba] Но вот одно напрягает - продолжительность расчета, для поиска числа 5022 ему требуется около 30 секунд.
Есть ли какие-нибудь способы ускорить эту канитель?
Вот мне на ум пока что приходит только многоступенчатый оператор If...Then...Else, где будет выполняться цикл For для определенных значений с1, а в зависимости от получающейся е2 уже выполняться оператор Do в определенном диапазоне (ну или уже заменить его на For). Код, конечно же, станет в разы больше, но количество проходок всех циклов For можно будет снизить например до (примерно) 550.


Новый день. А что успел сделать ты?
 
Ответить
Сообщение _Boroda_, все получилось, спасибо за подсказку с переполнением, а то я бы долго искал эту и следующие опечатки. Код получился такой
[vba]
Код
Sub Min()
Dim a1, a2, c1, c2, e1, e2, f1, f2 As Long
Dim i As Long
c1 = 1
c2 = Range("D10")
Range("B10") = "считаю"
    Do
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    c1 = c1 + 1
    Loop While e2 > 0
Range("B10").Value = c1 - 1
End Sub
[/vba] Но вот одно напрягает - продолжительность расчета, для поиска числа 5022 ему требуется около 30 секунд.
Есть ли какие-нибудь способы ускорить эту канитель?
Вот мне на ум пока что приходит только многоступенчатый оператор If...Then...Else, где будет выполняться цикл For для определенных значений с1, а в зависимости от получающейся е2 уже выполняться оператор Do в определенном диапазоне (ну или уже заменить его на For). Код, конечно же, станет в разы больше, но количество проходок всех циклов For можно будет снизить например до (примерно) 550.

Автор - amur84
Дата добавления - 27.10.2015 в 21:07
_Boroda_ Дата: Вторник, 27.10.2015, 21:16 | Сообщение № 10
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
многоступенчатый оператор If...Then...Else

Попробуйте Select Case
http://www.excelworld.ru/publ/vba/branch/select_case/61-1-0-143


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995


Сообщение отредактировал Serge_007 - Вторник, 27.10.2015, 22:43
 
Ответить
Сообщение
многоступенчатый оператор If...Then...Else

Попробуйте Select Case
http://www.excelworld.ru/publ/vba/branch/select_case/61-1-0-143

Автор - _Boroda_
Дата добавления - 27.10.2015 в 21:16
amur84 Дата: Вторник, 27.10.2015, 23:38 | Сообщение № 11
Группа: Пользователи
Ранг: Участник
Сообщений: 77
Репутация: 8 ±
Замечаний: 0% ±

_Boroda_, спасибо, почитал статейку, этот оператор не использовал, но статья наткнула на другую мысль - достаточно быстро переделал код. Теперь считает в один момент!
[vba]
Код
Sub Min()
Dim a1, a2, c1, c2, e1, e2, f1, f2 As Long
Dim i As Long
c1 = 0
c2 = Range("D10")
    Do
    c1 = c1 + 100000
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 100000
    Do
    c1 = c1 + 10000
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 10000
    Do
    c1 = c1 + 1000
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 1000
    Do
    c1 = c1 + 100
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 100
    Do
    c1 = c1 + 10
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 10
    Do
    c1 = c1 + 1
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
Range("B10").Value = c1
End Sub
[/vba]
Еще раз спаибо за советы!


Новый день. А что успел сделать ты?
 
Ответить
Сообщение _Boroda_, спасибо, почитал статейку, этот оператор не использовал, но статья наткнула на другую мысль - достаточно быстро переделал код. Теперь считает в один момент!
[vba]
Код
Sub Min()
Dim a1, a2, c1, c2, e1, e2, f1, f2 As Long
Dim i As Long
c1 = 0
c2 = Range("D10")
    Do
    c1 = c1 + 100000
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 100000
    Do
    c1 = c1 + 10000
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 10000
    Do
    c1 = c1 + 1000
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 1000
    Do
    c1 = c1 + 100
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 100
    Do
    c1 = c1 + 10
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
c1 = c1 - 10
    Do
    c1 = c1 + 1
    f1 = c1
    f2 = c2
    a1 = f1 * Range("B7")
    a2 = f2 * Range("D7")
        For i = 1 To 50
            If (a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) < 0 Then e2 = 0 Else e2 = Int(((a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))) / Range("D7")) + 0.99)
            If (a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) < 0 Then e1 = 0 Else e1 = Int(((a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))) / Range("B7")) + 0.99)
        a2 = a2 - (f1 * Range("B6")) * 2 ^ (Int(i / 10))
        a1 = a1 - (f2 * Range("D6")) * 2 ^ (Int(i / 10))
        f1 = e1
        f2 = e2
        Next i
    Loop While e2 > 0
Range("B10").Value = c1
End Sub
[/vba]
Еще раз спаибо за советы!

Автор - amur84
Дата добавления - 27.10.2015 в 23:38
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Overflow при поиске минимального значения (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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