Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Обновление переменных в макросе
 
Не подходит, так как переменные B_SP и B_Vo используются еще паре сотен других небольших процедур типа alarm, а определять их в каждой процедуре по новой как вы предлагаете, неудобно, так как для этого и нужны переменные уровня проекта
Обновление переменных в макросе
 
Однако, вот прочел, что событие Change не возникает, когда расчеты приводят к появлению другого значения формулы, а те ячейки, на которые ссылаются переменные - это как раз ячейки с формулами.  
Как я понимаю, именно из-за этого VBA и не обновляет их значения
Обновление переменных в макросе
 
Переменные уровня проекта нужны, так как они используются в большом количестве небольших процедур, причем разбросанных по разным модулям. Это я в данном примере упростил их набор до двух, на самом деле их намного больше.  
 
Идея с событием изменения на листе интересная, наверное действительно это выход, попробую.  
 
А правильно ли я понимаю, что это необновление переменных фундаментально, то есть в моем примере макрос Auto_Open() запустившись, сразу выполнился, использовав те значения, которые были на тот момент, и "запомнил", запуск процедуры в 12:02, которую произведет в назначенное время?
Обновление переменных в макросе
 
Здравствуйте. Нужна подсказка, так как самому разобраться не получается.  
Есть следующая конструкция  
   
Public B_SP As Double  
Public B_Vo As Double  
_________________  
Sub Auto_Open()  
 
B_SP = [Results!X12]
B_Vo = [Results!X13]
Application.OnTime Now, "alarm"  
Application.OnTime TimeValue("12:02:00"), "alarm"  
________  
Sub Alarm  
if B_SP>B_Vo then....  
 
End Sub  
 
Проблема в том, что значения этих переменных макросом не обновляются (используются те, которые были получены при первом запуске), несмотря на то, что в ячейках Excel'я, куда ссылаются объявленные переменные к моменту нового запуска процедуры, изменения могут происходить.  
Как добиться того, чтобы в процедуру alarm, запускаемую в 12:02 передавались значения переменных B_SP и B_Vo, соответствующие значения ячеек X12 и X13 на листе Results на 12:02, а не тем, которые были, когда файл открывался?  
 
Спасибо
Автозапуск макроса
 
Sub Auto_Open
Автозапуск макроса
 
Здравствуйте!  
Есть следующая проблема. Существует простенький макрос, запускающийся при открытии и с 10-минутной периодичностью запускающий макрос alarm.  
Sub Auto_Oðen()  
For i = 0 To 100  
Application.OnTime Now + 10 * i / 1440, "alarm"  
Next i  
End Sub  
 
Макрос alarm тоже очень простой и при выполнении нехитрых условий (типа больше-меньше) проигрывает звуковой файл.  
 
Казалось бы все просто, но при открытии книги ни фига не происходит (хотя должен проигрываться звуковой файл). При этом если я вхожу в VB и вручную запускаю макрос Auto_open, то звук проигрывается. В связи с этим вопрос: как можно проверить, запустился (запускался) ли макрос при открытии книги, и если да - то почему ни результата, ни сообщения об ошибке?  
Спасибо
Остановка работы звукового макроса, вызванная из другого макроса
 
Здравствуйте. Возникла очередная проблема. Есть флажок, если он в состоянии вкл, то запускается макрос1, если выкл, то ничего не происходит. Проблема однако в том, что макрос1 проигрывает звуковые файлы с привязкой ко времени, а значит длится пока не проиграет их всех. Мне неообходимо как-то остановить работу данного макроса, если я в какой-то момент времени ставлю флажок в состояние выкл. После неоднократных попыток я пришел к выводу, что задача заключается в очистке очереди звуковых файлов, которая образовалась после запуска макроса1 первый раз.  
 
sub Макрос1  
a = checkbox1.value  
For i = 1 To n  
If a = false Then PlaySound "", &H40: Exit Sub  
Application.OnTime Now + i / 1440, "alarm" & i  
Next i  
end sub  
 
Alarm1, Alarm2,... - это коротенькие макросы, как раз и проигрывающие звуковые файлы с помощью API Playsound.  
Строка _PlaySound "", &H40: Exit Sub_ - это моя попытка чистить список звуковых файлов (SND_PURGE). Но она не работает, так как эксель один раз проходит цикл (когда флажок еще включен) и больше не обращается к этому значению.  
 
Как быть?
Проверка времени последнего издавания экселем звука )
 
Кстати, вот смотрите как интересно эксель обрабатывает две одновременные звуковые функции. Вначале проверяется (если истина, то проигрывается файл) функция в ячейке D2, а потом - в ячейке B2. Вы не объясните, почему так?  
Приложил файл с функциями, правда без звуковых файлов
Проверка времени последнего издавания экселем звука )
 
И еще у меня вопрос, структурного плана. Приведенная функция - одна из большого количества подобных функций, отличающихся только условиями проверки ячеек a, b, MTM и звуковым файлом им соответствующим. Как лучше сделать: обрабатывать каждое условие отдельной функцией (alarm1, alarm2, ..., alarm300) или сделать один большой макрос, где все условия будут просматриваться по порядку и по порядку будут звучать звуковые файлы? Я больше склоняюсь к первому варианту (с добавлением в него параметра, чтобы не накладывались файлы друг на друга), но может я не прав?
Проверка времени последнего издавания экселем звука )
 
Спасибо, ребята, идею понял и сделал. Скажите, значение этой public переменной будет обнуляться после каждого открытия файла по новой или она будет сохраняться и при закрытиях файла?
Проверка времени последнего издавания экселем звука )
 
Здравствуйте. Есть простая функция, которая проигрывает звуковой файл при выполнении определенных условий.  
 
Private Declare Function PlaySound Lib "winmm" Alias "sndPlaySoundA" (ByVal sndName As String, ByVal Tip As Long) As Long  
 
Function Alarm1(ByVal a As Double, ByVal b As Double, ByVal MTM As Double)  
Dim sound1 As String  
If Abs(a) > Abs(b) And MTM < 0 Then  
sound1 = ThisWorkbook.Path & "\zvuki\sound1"  
PlaySound sound1, 1  
Alarm1 = True  
Else  
Alarm1 = False  
End If  
End Function  
 
Параметры a, b, MTM - это ссылки на ячейки и как минимум одна из них регулярно изменяется. Мне нужно, чтобы звук появлялся не каждый раз, когда происходит изменение, а только, если между последним его появлением прошло не меньше какого-то времени, например, 10 минут.  
Поможете?
Теоретический вопрос по VBA
 

Отдельное спасибо за ссылку. Учитывая, что я уже сталкивался с проблемой массивов диапазонов, мне это было весьма полезно. На форуме есть еще одна ветка на эту тему: http://www.planetaexcel.ru/forum.php?thread_id=9197

Теоретический вопрос по VBA
 
Спасибо большое! Я естественно читал справку, но она у меня какая-то неполная, видимо, там только написано, что "argument is passed by value". Я подумал, что ByVal означает, что в функцию передается переменная заданная не ссылкой, а просто числом.  
Спасибо за разъяснения
Теоретический вопрос по VBA
 
Здравствуйте. Подскажите, если есть желание. Есть пользовательская функция. Она вызывается в основном коде. Ей передаются три параметра, один из которых числовой. Функция считает и выдает значение, которое далее используется. Но попутно она изменяет значение переданного ей параметра, который требуется сохранить в том виде, в котором он передан в функцию. Как правильно написать?  
Спасибо.  
 
Пример  
 
Function xxx (Type as String, Way as String, t as Double)  
...  
t=t*6  
xxx=54  
End function  
 
Sub main  
...  
var3=5  
r=xxx (var1, var2, var3)  
' после использования функции var3 становится равным 30. А надо, чтобы оно оставалось 5.  
...  
End sub
Как прописать итерации в макросе?
 
Здравствуйте. Возникла необходимость написать пользовательскую функцию. Функция вычисляет переменную из имеющейся формулы. В прямом виде эту переменную из формулы не выразить, поэтому необходимы итерации. Формула сходимости ряда есть, а как коротко прописать саму итеративную процедуру в VB не знаю. Можно, конечно, попытаться изобрести велосипед, но может быть есть готовые решения?  
Функция такая (для справки вариант параметров: (P, 100, 110, 0.09, 0, 10):  
 
Function SVol(ty As String, F As Double, K As Double, t As Double, r As Double, premium As Double) As Variant()  
Dim v As Double  
Dim o As Double  
v = 0.2  
Do  
d1 = (Log(F / K) + 0.5 * t * v ^ 2) / (v * Sqr(t))  
d2 = (Log(F / K) - 0.5 * t * v ^ 2) / (v * Sqr(t))  
nd1 = Application.WorksheetFunction.NormSDist(d1)  
nd2 = Application.WorksheetFunction.NormSDist(d2)  
nd3 = Application.WorksheetFunction.NormSDist(-d1)  
nd4 = Application.WorksheetFunction.NormSDist(-d2)  
If ty = "C" Then o = (F * nd1 - K * nd2) * Exp(-r * t) Else o = -(F * nd3 - K * nd4) * Exp(-r * t)  
ve = (1 / Sqr(2 * 3.14159265358979)) * Exp(-0.5 * d1 ^ 2) * F * Sqr(t) * Exp(-r * t)  
x = v * (opt - premium) / ve  
Loop Until x > 0.001  
svol = v  
End Function  
 
Собственно, х в данном случае сходится к нулю при условии изменения v. Вопрос в том, как прописать итеративную процедуру изменения v. В самом экселе, через подбор параметра это работает без проблем, но в данном случае нужна именно пользовательская функция.  
Спасибо.
Опять проблемы с формулой массива
 
Я все-таки сделал!!! Не знаю насколько интересно, но получился вот такой монстр:  
 
{=ЕСЛИ((СУММ(ЕСЛИ(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1)>=0,3*ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(ИНДЕКС(B:B;СТРОКА()-($E$1-1));;;СТРОКА(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1))-(СТРОКА()-$E$1);))+0,7*ИНДЕКС(B:B;СТРОКА()-($E$1-1));0;1))=0)*(СУММ(ЕСЛИ(ПОИСКПОЗ(ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(ИНДЕКС(B:B;СТРОКА()-($E$1-1));;;СТРОКА(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1))-(СТРОКА()-$E$1);));ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1);0)>=0,5*(СТРОКА(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1))+$E$1-СТРОКА());0;1))=0);"Хорошо";"")}  
 
Он проверяет два условия:  
1. Не было ли на диапазоне хотя бы одной цены, которая была ниже 70% от максимума на тот момент  
2. Если максимум не обновлялся дольше, чем срок, прошедший с момента последнего максимума.  
Если оба условия выполняются, то компьютер радуется и говорит "Хорошо". А иначе молчит.  
Главное, что я теперь могу эту формулу растягивать, расширяя диапазон, а затем уже с ним работать. Я думал на тему доп столбцов, но в данном случае это просто невозможно, так как допстолбцами являются массивы (максимумов и номеров их строк каждого из диапазонов), то есть у каждой ячейки будет свой массив, что невозможно вывести при большом количестве ячеек.
Опять проблемы с формулой массива
 
Понимаете, в чем проблема. Если бы мне нужно было это решить для массива из 5 элементов, то это не было бы проблемой. Однако данных значений в массиве несколько тысяч. Происходит проверка на максимумы снизу вверх (то есть последние 5 элементов проверяются, потом тоже самое с последними 6 элементами и т.д.). Я буду растягивать формулу массива снизу вверх. Отсюда в моем пример функция индекс. Поэтому ту логику, которую вы предлагаете (В8, В9... и т.д. записанные руками) нереально применить.  
Основная проблема в том, что есть ни один диапазон, а массив диапазонов (В8:В8, В8:В9...). Используется функция СМЕЩ, вместо более любимого мной ИНДЕКСа. ИНДЕКС просто не работает с массивом диапазонов (он берет первое значение и все), а также не работают НАИБОЛЬШИЙ или ПОИСКПОЗ или СТРОКА просто не работают. Призодится извращаться с суммесли, счетесли и промежуточн.итоги.  
 
Но ничего не получается ((
Опять проблемы с формулой массива
 
Пример следует читать так:  
 
В8 45 (максимум В8:В8=45), следовательно, в массив заносится 8  
В9 55 (максимум В8:В9=55), следовательно, в массив заносится 9  
В10 50 (максимум В8:В10=55), следовательно, в массив заносится 9  
В11 43 (максимум В8:В11=55), следовательно, в массив заносится 9  
В12 56 (максимум В8:В12=56), следовательно, в массив заносится 12
Опять проблемы с формулой массива
 
Нет, так не будет работать. "Плохо" выдается только, если какое-то число в диапазоне ниже начального, а если оно хотя бы на его уровне, то выдается "Хорошо", а это неправильно.  
 
Для задачи мой полный вариант выглядит так:  
 
=СУММ(ЕСЛИ(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1)>=0,3*ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(ИНДЕКС(B:B;СТРОКА()-($E$1-1));;;СТРОКА(ИНДЕКС(B:B;СТРОКА()-($E$1-1)):ИНДЕКС(B:B;$C$1+1))-(СТРОКА()-$E$1);))+0,7*ИНДЕКС(B:B;СТРОКА()-($E$1-1));"Хорошо";"Плохо"))  
 
Однако, сейчас встала проблема еще хуже. Нужно составить массив из номеров строк локальных максимумов. То есть:  
 
В8  45 (максимум A1:A1=45), следовательно, в массив заносится 8  
В9  55 (максимум A1:A2=55), следовательно, в массив заносится 9  
В10 50 (максимум A1:A3=55), следовательно, в массив заносится 9  
В11 43 (максимум A1:A4=55), следовательно, в массив заносится 9  
В12 56 (максимум A1:A5=56), следовательно, в массив заносится 12  
 
Вот эта задача для меня жесть, уже столько времени потратил.  
Смог получить массив из номеров строк локальных максимумов формулой  
=ЕСЛИ(B8:B12=ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(B8;;;СТРОКА(B8:B12)-7;));СТРОКА(B8:B12);"")  
что даст массив 8,9,,,12. А вот как пустые значения приравнять предыдущему максимуму ума не приложу. Должно быть (8,9,9,9,12)
Опять проблемы с формулой массива
 
Я собственно сделал то, что хотел. Результат такой:  
 
{=СУММ(ЕСЛИ(B8:B12>=0,3*ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(B8;;;СТРОКА(B8:B12)-7;))+0,7*B8;0;1))}  
 
Заодно открыл для себя функцию промежуточные итоги, очень удобная штука. Если макс(СМЕЩ(B8;;;СТРОКА(B8:B12)-7;)) не работает с массивом, то ПРОМЕЖУТОЧНЫЕ.ИТОГИ(4;СМЕЩ(B8;;;СТРОКА(B8:B12)-7;)) отлично справляется.
Опять проблемы с формулой массива
 
Михаил, мне нужна проверка максимума не на том же диапазоне (это было бы просто), а на меняющемся. Посмотрите приложенный файл в первом сообщении.  
Я в принципе нашел ветку форума где это обсуждалось (http://www.planetaexcel.ru/forum.php?thread_id=9197), сижу разбираюсь...
Опять проблемы с формулой массива
 
Почему не работает формула, разобрался. Она берет проверяет только первое значение диапазона. Как сделать правильно?  
Диапазон            Проверка условия  
 
В8                  0,3*макс(В8:В8)+0,7*В8  
В9                  0,3*макс(В8:В9)+0,7*В8  
В10                 0,3*макс(В8:В10)+0,7*В8  
В11                 0,3*макс(В8:В11)+0,7*В8  
В12                 0,3*макс(В8:В12)+0,7*В8  
 
Если все условия выполняются, то выдается значение Истина, иначе Ложь. Как сделать это в одной ячейке формулой массива?
Опять проблемы с формулой массива
 
Не работает как надо формула массива. Пример и объяснение в файле. Спасибо
Самоубиваемые файлы
 
{quote}{login=VovaK}{date=22.01.2010 11:29}{thema=Re: }{post}{quote}{login=Kirk}{date=22.01.2010 09:53}{thema=}{post}Меня эта тема натолкнуло на философский вопрос: а возможно ли в принципе написание кода (не в Excel, а вообще), который уничтожит сам себя (ну или покоцает до той степени, которая несовместима с его правильным функционированием)? Или действия с самим собой невозможны в принципе?{/post}{/quote}  
 
Да, конечно. Активный модуль модифицирует ядро проекта и содержание затем пересохраняет файл, содержащий данные и проект, затем выгружается из памяти. Все в итоге кучка пепла...  
 
Но такие программы, имеющие в своем ядре деструктивные элементы, успешно вычисляются Антивирусными программами еще до его открытия, обычно не лечатся - просто удаляются. Поэтому, резюмирую - это возможно, но давно не актуально, есть масса средств, позволяющая прищучить злоумышленника...{/post}{/quote}  
 
Меня гораздо глобальнее вопрос интересует, чем вирусы )). Если предположить, что пересохранить невозможно или некуда. Например, может ли операционная система себя уничтожить? Меня этот вопрос заинтересовал, потому что если предположить сознание человека некоей средой, то вот может ли с точки зрения законов программирования эта среда себя удалить, а не просто модифицировать (как в примере с экселем - очистка содержимого всех листов)?  
Я понимаю, что это не по теме и старо, но не удержался от любопытства услышать мнение экспертов.
Самоубиваемые файлы
 
Меня эта тема натолкнуло на философский вопрос: а возможно ли в принципе написание кода (не в Excel, а вообще), который уничтожит сам себя (ну или покоцает до той степени, которая несовместима с его правильным функционированием)? Или действия с самим собой невозможны в принципе?
Не работает формула массива, не могу разобраться
 
Спасибо за объяснения, понял. Фактически И() при использовании в массивах работает как сложение, а не как умножение, хотя в обычных формулах он является аналогом именно умножения.  
Я думаю там опечатка в примере, должен получиться массив (3;8)  
 
Еще раз спасибо
Не работает формула массива, не могу разобраться
 
Учу... не сплю ночами... со скрипом идет )). Можно кратко пояснить почему И() здесь не работает, а * заработала (я не программист, с операторами * & и прочее раньше не сталкивался)  
 
Спасибо за подсказку
Не работает формула массива, не могу разобраться
 
Есть вертикальный ряд дат и соответствующих им значений. Мне нужны значения на первый день каждого месяца каждого года. Написал формулу. Если использовать в ней только год или только месяц, то работает. Если ставится условие и год и месяц, то не работает. Помогите разобраться.  
Пример во вложения
Непростой расчет среднего
 
Да, я поторопился. Михаил, последний ваш вариант работает как надо!!! Спасибо большое! Хотя я до конца не понял логику формулы, но разбирусь позже
Непростой расчет среднего
 
Михаил, касательно последнего варианта. Введите z=3 и вы увидите, что результат отличается от того проверочного значения, которое вы сделали.  
Тухачевский. Спасибо вам за вариант, просто мне нужно обойтись без пользовательских функций.  
 
Вообщем, после убитого на задачу дня я прихожу к выводу, что без дополнительного столбца не обойтись. Есть возможность подтянуть столбец с датами и уже по нему(так как даты не повторяются) найти номер позиции первого элемента диапазона.  
По любому спасибо за помощь
Страницы: 1 2 След.
Наверх