2017-05-26 86 views
1

我使用Excel VBA从仪器读取数据行。 我想在Excel Active Chart上动态地绘制数据,在读取数据后立即绘制数据。 我需要等待并每隔5秒读取一次数据,同时,通过VBA Application.Wait命令或通过Kernel32 Sleep命令“睡眠”。 在任何情况下,活动图表都不会更新。完整的情节只有在最后一次“睡眠”之后才会出现。 任何建议将不胜感激。带有延迟的Excel图表的动态更新

下面是简化的代码

Sub New_Data(indx) 
Dim x As Integer 

While True 

    x = Read_Instrument(1) 
    y = Read_Instrument(2) 
    Cells(indx, 1) = x 
    Cells(indx, 2) = y 

    ActiveSheet.ChartObjects.Item(1).Activate 
    ActiveChart.FullSeriesCollection(1).XValues = "=Sheet1!$A$1:$A$" & indx 
    ActiveChart.FullSeriesCollection(1).Values = "=Sheet1!$B$1:$B$" & indx 

    indx = indx + 1 
    Sleep 5000 'Use the KERNEL32 Sleep function for 5000 milliseconds 
Wend 
End Sub 
+0

我们需要看到一些代码来“猜测”你当前的方法有什么问题。有了这几个信息,似乎'Worksheet_Change'是要走的路。 –

+0

在尝试解决任何问题之前,我建议命名Chart对象并获取句柄,而不是活动图表等。ActiveChart可以工作,但是您的代码将更容易处理并避免任何焦点问题。 'Cells(indx,1)= x'每次都在结尾处设置值?再次使用工作表对象(例如'SheetCodeName.Cells(indx,1)= x'等限定对单元格的调用。 – MacroMarc

+0

我对VBA非常陌生,并且不熟悉它的所有高级功能。 (1)如何命名和获取图表对象的句柄以及如何稍后使用它的句柄以及(2)如何使用Worksheet对象限定对单元格的调用。您可以使用上面发布的代码作为示例。谢谢! – DynamicChart

回答

0

WaitSleep将继续VBA运行,因此屏幕不会更新。 尝试使用Application.OnTime,沿着这些行(在标准的代码模块中,即模块1)。

Sub refreshMyChart() 
    Dim indx as long: indx = sheet1.Cells(Rows.Count, 1).End(xlUp).offset(1) 

    Cells(indx, 1) = Read_Instrument(1) 
    Cells(indx, 2) = Read_Instrument(2) 

    With Sheet1.ChartObjects(1).FullSeriesCollection(1) 
    .XValues = "=Sheet1!$A$1:$A$" & indx 
    .Values = "=Sheet1!$B$1:$B$" & indx 
    End With 

    ''''' Now Schedule the same routine for 5 seconds later'''''''''' 
    Application.OnTime Now + TimeSerial(0,0,5), "refreshMyChart" 
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
End Sub 

P.S .:知道这个数据不能无限期地成长。你应该定义一些方法来阻止或删除旧行,以保持显示的数据行数合理。

0

非常好!非常感谢你。 我不知道.OnTime结构 Application.OnTime Now + TimeSerial(0,0,5),“refreshMyChart” 和VBA允许递归例程的事实。 至于结束循环,那里有代码,我没有发布,因为它与问题无关。在这里它是 如果INT(CURRENT_INDEX/nmeasure)* nmeasure> finalval然后 MSGBOX( “测量结束”) 退出小组 结束如果再次

感谢。