我正在整理一个电子表格,动态绘制大型时间序列中的子集数据。这个想法是允许用户指定所绘制数据的开始时间。这是使用ActiveX文本框完成的。另外,我想允许用户滚动时间序列。这是通过包含ActiveX滚动条来实现的。为了使事物保持同步,文本框和滚动条都引用相同的单元格(称为“基准”的命名范围)。
这是事情变得有趣的地方。我写了三个潜艇:
-One通过参考原点来更新图表的时间轴。
Sub ReScaleChartAxis()
Dim chtMin, chtMax As Long
Dim grphSht, dtSht As Worksheet
Dim minDepthCell As Range
Set grphSht = Sheets("PlotSheet")
Set dtSht = Sheets("Data")
Set minDepthCell = dtSht.Range("datum")
'Optimize
Application.ScreenUpdating = False
Application.EnableEvents = False
'Determine Max/Min of time used in chart
chtMin = Val(minDepthCell.Value)
chtMax = chtMin + 500
'Update chart
With grphSht.ChartObjects("Plot").Chart.Axes(xlCategory)
.MaximumScale = chtMax
.MinimumScale = chtMin
End With
'Reset Optimization
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
- 当用户在文本框中输入新值时,它会修改数据。
Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim datMin, datMax As Double
If KeyCode = vbKeyReturn Then
datMin = Sheets("Data").Range("dat_min").Value
datMax = Sheets("Data").Range("dat_max").Value
If Not IsNumeric(TextBox1.Value) Then
TextBox1.Value = Sheets("Data").Range("datum")
ElseIf Val(TextBox1.Value) <= datMin Then
Sheets("Data").Range("datum") = datMin
TextBox1.Value = datMin
ElseIf Val(TextBox1.Value) >= (datMax - 450) Then
Sheets("Data").Range("datum") = datMax - 500
TextBox1.Value = datMax - 500
Else
Sheets("Data").Range("datum") = Val(TextBox1.Value)
End If
End If
End Sub
-One在滚动条更改时调用轴重新缩放。
Private Sub ScrollBar1_Change()
Call ReScaleChartAxis
TextBox1.Value = Sheets("Data").Range("datum")
TextBox1.Select
End Sub
奇怪的是,如果滚动条被用户更改,则触发事件并且图表更新,挂起约1-2秒。然而,如果用户在文本框中输入新值,则该条目将通过验证,更新基准单元格,然后触发scrollbar_change事件,并立即完成。
这对我来说有点难题,从朋友那里借一个类比,就好像excel运行速度快3英里.2。ActiveX滚动条在用户交互时会有多少开销吗?我附上了一个例子。
提前感谢您的任何指导。