当数据改变时,自动更新我的VBA代码

我正在尝试使用VBA根据数据设置图表轴参数。 这是为了工作,我将locking电子表格作为模板,以便其他人可以填写数据,但图表将为他们制作。 根据他们正在运行的testing,轴可能需要不同。 我有一个完美的代码,但它不会自动更新数据更改时,我必须手动刷新它。 这里是代码:

Sub ScaleAxes() With Application.ActiveChart.Axes(xlCategory, xlPrimary) .MinimumScale = ActiveSheet.Range("T4").Value .MaximumScale = ActiveSheet.Range("T3").Value .MajorUnit = ActiveSheet.Range("T5").Value End With With Application.ActiveChart.Axes(xlValue, xlPrimary) .MinimumScale = ActiveSheet.Range("U4").Value .MaximumScale = ActiveSheet.Range("U3").Value .MajorUnit = ActiveSheet.Range("U5").Value End With End Sub 

代码中引用的单元格包含依赖于数据条目的函数。 我希望这个代码自己刷新,只要它依赖于变化的单元格。

在问题的工作表的代码模块中:

 Private Sub Worksheet_Calculate() ScaleAxes End Sub 

你将不得不对ActiveChart的识别更加确定。 如果只有一个,那么它的索引号可以被引用,但是图表的名字会更好。 以下假定工作表上的单个图表。

 Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("T3:U5")) Is Nothing Then On Error GoTo bm_Safe_Exit Application.EnableEvents = False With Me.ChartObjects(1) With .Axes(xlCategory, xlPrimary) .MinimumScale = Range("T4").Value .MaximumScale = Range("T3").Value .MajorUnit = Range("T5").Value End With With .Axes(xlValue, xlPrimary) .MinimumScale = Range("U4").Value .MaximumScale = Range("U3").Value .MajorUnit = Range("U5").Value End With End With End If bm_Safe_Exit: Application.EnableEvents = True End Sub 

Worksheet_Change事件macros属于工作表代码页,而不是模块代码页。 您可以通过右键单击工作表的名称选项卡并select查看代码来进入工作表的代码页。

添加到@Excel Heros的答案。 我有一个类似的问题,但你可能会发现有时Excel的自动缩放选项不适合某些图表(取决于数据范围),并添加在原点(零),你留下一个微型压扁的数据块绘制在上面。

请参阅Peltier ,了解Excel如何处理坐标轴范围。

excel轴出错了

macrosbutton

您始终可以在工作表上使用macrosbutton ,用户可以使用该button来重置轴。

我使用了Set Axes Minimum(设置轴最小值)button来将轴切换到最小值,或者由用户设置

并为我的图表重置轴范围切换回自动。

下面的这个代码是我的任务特有的,但是你也许可以从中解救出一些想法。

将轴重置为自动

 Sub btnChartAxisResetRange() ' SET chart object name Call ChartResetAxis("chtRange") End Sub Sub ChartResetAxis(strChartname As String) ' Reset the lower y axis of chart back to Auto ' ' INPUTS ' Relies on chart object name ' ActiveSheet.ChartObjects(strChartname).Activate ActiveChart.Axes(xlValue).Select ActiveChart.Axes(xlValue).MinimumScaleIsAuto = True End Sub 

调整轴的最小值到另一个值

在这种情况下,我有一个最低限度的价格表,我知道在每周一次的包中,我不得不覆盖最小轴问题,当我做了批处理运行。 这阻止了像我上面显示的图表。

 Sub GetChartMinimumAxisTweaks() ' Change minimum axis scale if set to zero and looks too small ' Set the lower y axis of chart so the lower value does not default to zero ' Uses a table manually set up ' ' INPUTS/PREREQUISITES ' Relies on manual data set up in rng1PagerAxesOverrideTable with Minimum scales for either chart ' ' CALLS ' ChartTweakAxis(strChartname As String, minvalue As Double) Dim minaxisvalue As Double ThisWorkbook.Activate ' Get axis value. Using offsets of range ' But if no value then need to reset ' Chart of Price minaxisvalue = Val(ThisWorkbook.Sheets("ReviewCalcPage").Range("rng1PagerAxesOverrideCheck").Offset(0, 1).Value) Call ChartTweakAxis("chtSTPerformance", minaxisvalue) End Sub Sub ChartTweakAxis(strChartname As String, minvalue As Double) ' Change minimum axis scale if set to zero and looks too small ' Set the lower y axis of chart so the lower value does not default to zero ' INPUTS ' Relies on chart object name and manual value to set Minimum scale too ' If minvalue is zero then Reset rather to Auto ' If minvalue = 0 Then Call ChartResetAxis(strChartname) Else ' Set axis ActiveSheet.ChartObjects(strChartname).Activate ActiveChart.PlotArea.Select ActiveChart.ChartArea.Select ActiveChart.Axes(xlValue).Select ActiveChart.Axes(xlValue).MinimumScale = minvalue End If End Sub 

希望这有助于如果你遇到轴问题! 有点主题,但试图帮助。