Здравствуйте, в ячейке А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
можно попробовать воспользоваться функцией, реагирующей на изменения на листе (функция должна быть не отдельным модулем, а на самом листе) со следующими переменными (поэкспериментируйте)
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Set tsh2 = Worksheets("имя листа") Target.Font.ColorIndex = ... Target.Columns.Column Target.Value Target.Rows.Row
End Sub
[/vba]
Таргет, это Ячейка где произошло изменение
можно попробовать воспользоваться функцией, реагирующей на изменения на листе (функция должна быть не отдельным модулем, а на самом листе) со следующими переменными (поэкспериментируйте)
[vba]
Код
Private Sub 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
Private Sub Worksheet_Change(ByVal Target As Range) Set tsh = Worksheets(1) n = n + 1 If n > 20 Then 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 End Sub
[/vba]
и нужно добавить в головной модуль проекта [vba]
Код
Public s(1 To 20) As Double, ss As Double, n As Integer
[/vba]
но этот пример не защищен от Ваших попыток менять еще какие то ячейки хоть руками будут сбои можно прописать, чтобы если таргет не 1-я ячейка идти сразу на выход тогда не будет сбоить
вот так к примеру
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Set tsh = Worksheets(1) n = n + 1 If n > 20 Then 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 End Sub
[/vba]
и нужно добавить в головной модуль проекта [vba]
Код
Public s(1 To 20) As Double, ss As Double, n As Integer
[/vba]
но этот пример не защищен от Ваших попыток менять еще какие то ячейки хоть руками будут сбои можно прописать, чтобы если таргет не 1-я ячейка идти сразу на выход тогда не будет сбоитьSandor
Private Sub Worksheet_Change(ByVal Target As Range) Set tsh = Worksheets(1) a = Target.Columns.Column If a <> 1 Then GoTo line1: a = Target.Rows.Row If a <> 1 Then GoTo line1: n = n + 1 If n > 20 Then 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: End Sub
[/vba]
от так только на ячейку а1 будет реагировать
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Set tsh = Worksheets(1) a = Target.Columns.Column If a <> 1 Then GoTo line1: a = Target.Rows.Row If a <> 1 Then GoTo line1: n = n + 1 If n > 20 Then 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: End Sub
[/vba]
от так только на ячейку а1 будет реагироватьSandor
если данные подгружаются автоматом (через DDE), то событие Worksheet_Change не работает
вполне может быть но помню когда-то давно мы автоматом анализироваали котировки а шли они через DDE как-то таки решили эту проблему точно уж не помню надо в реале побаловаться
если данные подгружаются автоматом (через DDE), то событие Worksheet_Change не работает
вполне может быть но помню когда-то давно мы автоматом анализироваали котировки а шли они через DDE как-то таки решили эту проблему точно уж не помню надо в реале побаловатьсяSandor
Подсказали такой вот код, работает хорошо, но округляет до сотых, можно ли подправить, чтобы точность была 4-5 знаков после запятой? 'в ОБЩИЙ модуль [vba]
Код
Public iCount As Integer Public iVal As Double
[/vba] 'в модуль ЛИСТА [vba]
Код
Private Sub Worksheet_Calculate() iCount = iCount + 1 iVal = iVal + Range("A1").Value If iCount = 20 Then Range("B1").Value = Round(iVal / iCount, 2) iCount = Empty iVal = Empty End If End Sub
Подсказали такой вот код, работает хорошо, но округляет до сотых, можно ли подправить, чтобы точность была 4-5 знаков после запятой? 'в ОБЩИЙ модуль [vba]
Код
Public iCount As Integer Public iVal As Double
[/vba] 'в модуль ЛИСТА [vba]
Код
Private Sub Worksheet_Calculate() iCount = iCount + 1 iVal = iVal + Range("A1").Value If iCount = 20 Then Range("B1").Value = Round(iVal / iCount, 2) iCount = Empty iVal = Empty End If End Sub