Страницы: 1
RSS
Как отменить показ Msgbox из другой процедуры при ее запуске
 
Добрый день.
Подскажите, что нужно сделать в такой ситуации.
Есть два одинаковые макроса с одинаково названными переменными в который происходит их расчет. Сообщение выводит результат на экран.
Упрощенный пример:
Код
Sub Расчет1()
    x = 1
    y = x + 1
    MsgBox y
End Sub
и
Код
Sub Расчет2()
    x = 2
    y = x + 2
    MsgBox y
End Sub
Есть еще один, итоговый макрос, который суммирует значения переменной "y" из двух расчетов и также выводит сообщение:
Код
Public y As Double
 
Sub Итого()
    Call Расчет1: y1 = y
    Call Расчет2: y2 = y
    
    MsgBox "Итого:" & y1 + y2
End Sub
Что нужно сделать, чтобы при активизации макроса Итого не выводились MsgBox из Расчет 1 и Расчет 2?
Как при вызове процедуры перехватить и отменить показ MsgBox "ума не приложу".
Если не можешь победить беспорядок, то надо возглавить его.
 
Можно для Расчет1/2 добавить параметр, который проверять в коде.
 
Не совсем понял. Можно чуть подробнее.
В оригинальном файле таких расчетов до 10 штук и переменных и рассчитываемых значений тоже около десятка и в каждом расчете выводится одинаковое сообщение.
Изменено: Александр Медведев - 17.09.2015 09:56:05
Если не можешь победить беспорядок, то надо возглавить его.
 
Код
Public y As Double
Public cns As Boolean

Sub Расчет1()
    x = 1
    y = x + 1
    If cns = 0 Then MsgBox y
End Sub

Sub Расчет2()
    x = 2
    y = x + 2
    If cns = 0 Then MsgBox y
End Sub

Sub Итого()
    cns = 1
    Call Расчет1: y1 = y
    Call Расчет2: y2 = y
     
    MsgBox "Итого:" & y1 + y2
End Sub
 
Здорово получилось!
Спасибо за помощь.
Беру себе на заметку.
Если не можешь победить беспорядок, то надо возглавить его.
 
Это примерно как я планировал, но без параметра.
Но в этом варианте после всего нужно скинуть переменную в 0, иначе нужные сообщения пропадут.
 
Экономим память:
Код
Public y As Double
 
Sub Итого()
Dim x As Double
    Call AAA(False): x = y
    Call BBB(False): x = x + y
    MsgBox "Итого: " & x
End Sub

Sub Расчет1(): Call AAA(True): End Sub
Sub Расчет2(): Call BBB(True): End Sub

Sub AAA(bFlag As Boolean)
Dim x As Double
    x = 1: y = x + 1
    If bFlag Then MsgBox y
End Sub

Sub BBB(bFlag As Boolean)
Dim x As Double
    x = 2: y = x + 2
    If bFlag Then MsgBox y
End Sub

Вычисления Sub AAA и Sub BBB лучше производить в функциях (если есть такая возможность).
 
Попробовал в своем проекте  ваш вариант vikttur. Тоже работает. Без явных отличий во времени.
Скажите, когда экономия памяти становится критична. Насколько примерно сложны должны быть вычисления, чтобы было необходимо задействовать возможности вашего варианта.  
Если не можешь победить беспорядок, то надо возглавить его.
 
Вариант vikttur более приемлем т.к. отпадает необходимость отслеживать глобальную переменную Public cns As Boolean и при необходимости сбрасывать в False. Аргумент  bFlag As Boolean сам перейдет в False после завершения процедуры, что позволяет лучше контролировать действия программы при повторном вызове. Вам остается только передать нужный аргумент при запуске процедуры Call AAA(True) или Call AAA(False).
Есть еще один вариант сделать аргумент опциональным и присвоить ему значение по умолчанию. Тогда можно обращаться к процедуре без передачи аргумента если нужно выполнение задачи по умолчанию и передавать аргумент только при необходимости изменить умолчание.
Код
Sub Расчет1(): Call AAA(): End Sub
Sub Расчет2(): Call BBB(True): End Sub
 
Sub AAA(Optional bFlag As Boolean = False)
Dim x As Double
    x = 1: y = x + 1
    If bFlag Then MsgBox y
End Sub
 
Sub BBB(Optional bFlag As Boolean = False)
Dim x As Double
    x = 2: y = x + 2
    If bFlag Then MsgBox y
End Sub
Изменено: TSN - 17.09.2015 12:10:06
 
В конце процедуры Итого я сделал cns = 0 для сброса значения, которое вначале было = 1. Иначе вызов повторно Расчетов после итого ни к чему не приводил.
Это то же,  что и сброс в False или другое имеется ввиду.
Если не можешь победить беспорядок, то надо возглавить его.
 
Цитата
Александр Медведев написал: В конце процедуры Итого я сделал cns = 0. Это то же, что и сброс в False или другое имеется ввиду.
Именно об этом я говорил. Лишнее действие. лишняя строка кода. Представьте, что у Вас пару десятков флагов (Boolean) объявленных как глобальные переменные и пару десятков процедур связанных в одной программе через эти флаги. За таким стадом флагов устанешь следить, забыл сбросить получил неожиданный результат. и т.д. Хотя без глобальных переменных тоже нельзя. Как то так.  :)
 
Спасибо за пояснение. В моем случае пока один такой флаг. Проще дополнительной строкой.
Но кто его знает сколько их может появиться по завершении работы...
Если не можешь победить беспорядок, то надо возглавить его.
 
Цитата
Александр Медведев написал: когда экономия памяти становится критична
Обычно тогда, когда уже поздно думать об оптимизации :)
Чтобы минимизировать головную боль в будущем, лучше оптимизировать в процессе написания кода.

Цитата
Экономим память
В данном случае разговор о глобальных переменных. Они занимают место постоянно. Чего не скажешь о переменных уровня процедур.
В других случаях бывает выгоднее иметь лишнюю глобальную (например, если для ее получения необходимо выполнить ресурсоемкое вычисление, а вызывается она часто).
 
Ясно.  
Если не можешь победить беспорядок, то надо возглавить его.
Страницы: 1
Наверх