Здравствуйте, подскажите пожалуйста, возможно ли реализовать следующее. Допустим, имеется ячейка на листе, на которую выводятся значения из сторонней программы (в примере для простоты генерируются случайрные числа). Я хочу построить график этих значений от времени, за определенный промежуток. Это очень напоминает осцилограф, показывающий данные vs время. Для обновления и перестроения использую функцию Application.OnTime, но обновление экрана происходит дискретно, а хотелось бы сделать это более плавно. При занижении значения задержки - виснет Excel. Заранее спасибо за помощь, для удобства прилагаю файл-пример, и текущий вариант под спойлером.
Скрытый текст
Код
Option Explicit
Public n As Integer
Public lLenght As Integer
Sub Calc()
Dim Source As Double
'Длина диапазона для отображения на графике-осцилограмме
lLenght = 60
'Выполнение по времени
Application.OnTime Now + 0.000006, "Calc"
'Заполняем ячейку случайным числом, имитируя работу сторонней программы
Randomize
Worksheets("Sheet1").Cells(1, 3).Value = Rnd(1)
'и считываем значение ячейки в переменную
Source = Worksheets("Sheet1").Cells(1, 3).Value
'Первый запуск, заполняем ячейки с первой до lLenght
If n < lLenght Then
n = n + 1
Worksheets("Sheet1").Cells(n, 1).Value = Source
'Достигнув lLenght, первая строка при каждой итерации удаляется и запись
'производится в последнюю ячейку, соответсвующую выбранной длине отображения
Else
n = lLenght
Worksheets("Sheet1").Cells(1, 1).Delete Shift:=xlUp
Worksheets("Sheet1").Cells(n, 1).Value = Source
End If
'После удаления первой ячейки, переназначаем графику диапазон для отображения
Worksheets("Sheet1").ChartObjects("Chart 8").Chart.SetSourceData Source:=Worksheets("Sheet1").Range("A1:A" & lLenght)
Application.ScreenUpdating = True
End Sub
Так же, буду благодарен любым советам по оптимизации. Спасибо.
Sub Calc()
Dim a, Rng As Range, refresh
Static flag As Boolean
If Sheets("Sheet1").Cells(1, 5) Then Application.OnTime Now + TimeSerial(0, 0, 1), "Calc"
If flag Then
flag = False
Exit Sub
End If
With Sheets("Sheet1")
Set Rng = .Range("A2:A" & .Cells(1, 7) + 1)
.ChartObjects("Chart 8").Chart.SetSourceData Source:=Rng
Do
DoEvents
If Timer > refresh Then
flag = True
Application.EnableEvents = False
.Cells(1, 3) = Rnd(1) 'при внешнем источнике нужно удалить
a = Rng.Offset(-1, 0).Value
Rng = a
Application.EnableEvents = True
If .Cells(1, 5) Then refresh = Timer + .Cells(1, 5).Value Else Exit Sub 'sec
End If
Loop
End With
End Sub
Полагаю, что для плавного отображения изменения графика, обновление должно происходить несколько раз в секунду. Скажем 10, для примера. Если будет найдено решение как это сделать, думаю, что смогу снизить или увеличить это значение при необходимости. По поводу использования, в ячейку предполагается выгрузка значений из сторонней программы. С помощью Excel планиную накапливать эти значения, с попутным отображением графика изменения.
А если обновление происходит очень часто ? Я хочу попробовать сделать вывод данных с нужной детализацией и возможностью изменения параметров детализации. Т.е. брать данные каждые одну десятую, пол, секунды, секунду или более. Проблема с обновлением чаще чем раз в секунду.
И лучше передачу переменной вести не в ячейку, а в переменную, тогда все проще можно реализовать. Я просто не знаю какими методами Вы собираетесь пользоваться для этого...
В детализации нет проблем и она устанавливается в G1. Обновление данных в Е1. Вопрос куда их складировать, чтоб брать оттуда, когда надо...? И куда и как в Excel их складывать Вам удобно...?
А если забыть о моих методах, возможно ли сделать так, что ячейка А1 будет обновляться 50 раз в секунду, пусть даже заполняясь случайными значениями, а для графика значения из нее будут браться 10 раз в секунду ? И при этом избежать зависания Excel.
Я планирую складывать в базу результаты экспериментов, попутно добавляя возможность из просмотра в режиме OnLine. Поэтому хочу иметь возможность выбора частоты обновления.
Возможно да, не понял. Возможно, это важная деталь, но сейчас мне кажется не существенной. Мой текущий вопрос:
Цитата
VSerg написал: возможно ли сделать так, что ячейка А1 будет обновляться 50 раз в секунду, пусть даже заполняясь случайными значениями, а для графика значения из нее будут браться 10 раз в секунду ? И при этом избежать зависания Excel.