更改数据时自动更新VBA代码

时间:2015-10-19 19:55:35

标签: excel vba excel-vba

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

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

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

3 个答案:

答案 0 :(得分:1)

在相关工作表的代码模块中:

Private Sub Worksheet_Calculate()
    ScaleAxes
End Sub

答案 1 :(得分:0)

您必须更明确地识别 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事件宏属于工作表代码页,而不是模块代码页。您可以通过右键单击工作表的名称标签并选择查看代码来进入工作表的代码页。

答案 2 :(得分:0)

添加到@Excel Heros的答案。我有一个类似的问题,但你可能会发现有时Excel的自动缩放选项对于某些图表(取决于数据范围)不能很好地工作,并且它在原点(零)中添加并且你留下了一个微小的压扁数据块绘制在顶部。

有关Excel如何计算轴范围的详细说明,请参阅Peltier

excel axes gone wrong

宏按钮

您始终可以在工作表上使用宏按钮,用户可以使用它来重置轴。

我使用设置轴最小按钮将轴切换到表格中的最小值/或由用户设置

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

<强> CODE

以下代码特定于我的任务,但您可以从中挽救一些想法。

将轴重置为自动

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

希望如果您遇到轴问题,这会有所帮助!咬掉主题,但试图提供帮助。