Здравствуйте, в ячейке А1 постоянно открытого файла .xlsm каждые n секунд изменяются значения. Как в ячейке В1 отобразить среднее значение чисел из А1 за промежуток N либо среднее значение последних 20-ти чисел из А1?
Здравствуйте, в ячейке А1 постоянно открытого файла .xlsm каждые n секунд изменяются значения. Как в ячейке В1 отобразить среднее значение чисел из А1 за промежуток N либо среднее значение последних 20-ти чисел из А1?vlavaden
ИМХО, нужно создать макрос, который будет записывать каждое новое значение в виде стандартного числа на отдельный лист, потом выводить среднее значение по этим двум листам, а потом их удалять
ИМХО, нужно создать макрос, который будет записывать каждое новое значение в виде стандартного числа на отдельный лист, потом выводить среднее значение по этим двум листам, а потом их удалятьvolony
Gimme 6 hours to chop down a tree and I'll spend first four sharpening the axe Abraham Lincoln
можно попробовать воспользоваться функцией, реагирующей на изменения на листе (функция должна быть не отдельным модулем, а на самом листе) со следующими переменными (поэкспериментируйте)
PrivateSub Worksheet_Change(ByVal Target As Range) Set tsh2 = Worksheets("имя листа")
Target.Font.ColorIndex = ...
Target.Columns.Column
Target.Value
Target.Rows.Row
EndSub
Таргет, это Ячейка где произошло изменение
можно попробовать воспользоваться функцией, реагирующей на изменения на листе (функция должна быть не отдельным модулем, а на самом листе) со следующими переменными (поэкспериментируйте)
PrivateSub Worksheet_Change(ByVal Target As Range) Set tsh2 = Worksheets("имя листа")
Target.Font.ColorIndex = ...
Target.Columns.Column
Target.Value
Target.Rows.Row
это вообще-то не программа а операторы и переменные, которые можно использовать, не мучаясь с синтаксисом
поэтому ЭТО ничего не делает, но дает возможность делать в момент любого изменения на листе запускается этот модуль переменная Таргет дает нам возможность работать с этой меняющейся ячейкой а уж дальше что хотим, то и делаем
и пардоньте, как ни исправлял тегами, получается только хуже как вариант все в одну строку, т.е. куда менее читабельно
это вообще-то не программа а операторы и переменные, которые можно использовать, не мучаясь с синтаксисом
поэтому ЭТО ничего не делает, но дает возможность делать в момент любого изменения на листе запускается этот модуль переменная Таргет дает нам возможность работать с этой меняющейся ячейкой а уж дальше что хотим, то и делаем
и пардоньте, как ни исправлял тегами, получается только хуже как вариант все в одну строку, т.е. куда менее читабельноSandor
Сообщение отредактировал Sandor - Суббота, 27.05.2017, 19:21
можно попробовать воспользоваться функцией, реагирующей на изменения на листе (функция должна быть не отдельным модулем, а на самом листе) со следующими переменными (поэкспериментируйте)
Спасибо, но ничего не выходит, даже не представляю как это может работать...
можно попробовать воспользоваться функцией, реагирующей на изменения на листе (функция должна быть не отдельным модулем, а на самом листе) со следующими переменными (поэкспериментируйте)
Спасибо, но ничего не выходит, даже не представляю как это может работать...vlavaden
PrivateSub Worksheet_Change(ByVal Target As Range) Set tsh = Worksheets(1)
n = n + 1 If n > 20Then n = n - 20
ss = ss - s(n)
s(n) = Target.Value
ss = ss + s(n)
sr = ss / 20
Application.EnableEvents = False
tsh.Cells(1, 2).Value = sr
Application.EnableEvents = True EndSub
и нужно добавить в головной модуль проекта
Public s(1To20) AsDouble, ss AsDouble, n AsInteger
но этот пример не защищен от Ваших попыток менять еще какие то ячейки хоть руками будут сбои можно прописать, чтобы если таргет не 1-я ячейка идти сразу на выход тогда не будет сбоить
вот так к примеру
PrivateSub Worksheet_Change(ByVal Target As Range) Set tsh = Worksheets(1)
n = n + 1 If n > 20Then n = n - 20
ss = ss - s(n)
s(n) = Target.Value
ss = ss + s(n)
sr = ss / 20
Application.EnableEvents = False
tsh.Cells(1, 2).Value = sr
Application.EnableEvents = True EndSub
и нужно добавить в головной модуль проекта
Public s(1To20) AsDouble, ss AsDouble, n AsInteger
но этот пример не защищен от Ваших попыток менять еще какие то ячейки хоть руками будут сбои можно прописать, чтобы если таргет не 1-я ячейка идти сразу на выход тогда не будет сбоитьSandor
PrivateSub Worksheet_Change(ByVal Target As Range) Set tsh = Worksheets(1)
a = Target.Columns.Column If a <> 1ThenGoTo line1:
a = Target.Rows.Row If a <> 1ThenGoTo line1:
n = n + 1 If n > 20Then n = n - 20
ss = ss - s(n)
s(n) = Target.Value
ss = ss + s(n)
sr = ss / 20
Application.EnableEvents = False
tsh.Cells(1, 2).Value = sr
Application.EnableEvents = True
line1: EndSub
от так только на ячейку а1 будет реагировать
PrivateSub Worksheet_Change(ByVal Target As Range) Set tsh = Worksheets(1)
a = Target.Columns.Column If a <> 1ThenGoTo line1:
a = Target.Rows.Row If a <> 1ThenGoTo line1:
n = n + 1 If n > 20Then n = n - 20
ss = ss - s(n)
s(n) = Target.Value
ss = ss + s(n)
sr = ss / 20
Application.EnableEvents = False
tsh.Cells(1, 2).Value = sr
Application.EnableEvents = True
line1: EndSub
от так только на ячейку а1 будет реагироватьSandor
если данные подгружаются автоматом (через DDE), то событие Worksheet_Change не работает
вполне может быть но помню когда-то давно мы автоматом анализироваали котировки а шли они через DDE как-то таки решили эту проблему точно уж не помню надо в реале побаловаться
если данные подгружаются автоматом (через DDE), то событие Worksheet_Change не работает
вполне может быть но помню когда-то давно мы автоматом анализироваали котировки а шли они через DDE как-то таки решили эту проблему точно уж не помню надо в реале побаловатьсяSandor