将Excel图表轴比例链接到单元格中的值

时间:2017-08-23 10:52:45

标签: excel vba excel-vba charts gantt-chart

我有这个甘特图,我正在查看计划与实际日期。 问题是图表不会同步开始/结束日期。

我试图用VBA将最大/最小值链接到单元格,但它不会这样。

我尝试使用此网站: https://peltiertech.com/link-excel-chart-axis-scale-to-values-in-cells/

但他的代码对我的图表不起作用。

这是一张图片: enter image description here

日期必须相同,如果我更改右侧表格中的某些值,则一起更改 有任何想法吗? 感谢

Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet.ChartObjects("Chart 2").Chart 
Select Case Target.Address 

Case "$G$161" 
.Axes(xlCategory).MaximumScale = Target.Value 

Case "$F$163" 
.Axes(xlCategory).MinimumScale = Target.Value 

Case "$G$161" 
.Axes(xlValue).MaximumScale = Target.Value 

Case "$F$163" 
.Axes(xlValue).MinimumScale = Target.Value 

End Select 
End With 
End Sub

2 个答案:

答案 0 :(得分:1)

您重复使用的代码是一个简单的演示程序,它允许在工作表上的6个特定单元格中的一个更改时操作图表的轴。但是,这些更改旨在由用户通过键盘进行。以这种方式进行更改会触发Worksheet_Change事件,并允许识别已更改的单元格。事件例程中的代码根据特定工作表单元格的更改来修改图表的轴。

正如David Ziemens在评论中指出的那样,你的问题是,如果一个单元格因为通过公式重新计算而改变了值,则此更改不会触发Worksheet_Change事件。 (当然,工作表上其他地方手动输入的更改完全有可能触发Worksheet_Change事件和重新计算,导致感兴趣的单元格通过公式更改其值。但是,在这种情况下, Target参数将标识手动更改的单元格,而不是通过公式重新计算的单元格。)

丢弃Select ... Case结构,这实际上只在您尝试重用的演示程序的上下文中有用。相反,请更改代码,使其无条件地直接从单元格G161F163更新所有4个图表属性(因此请使用ws.Range("G161").Valuews.Range("F163").Value代替{{1} }用于分配图表属性,其中Target.Value表示这些单元格所在的工作表 - 例如wsActiveSheet或工作表被调用的任何内容。将图表属性的分配包含在Worksheets("Sheet1")子内而不是Workbook_SheetChange中,并且只要工作簿重新计算,您的图表就会更新。

这不是一个非常纯粹的解决方案,因为它不会检测单元Worksheet_ChangeF163在重新计算时是否实际发生了变化。因此,它存在以下风险:不必要地为4个属性分配未更改的值。但是,除非你有一个非常大的工作簿,并且你正在推动你的计算机可以处理的限制,否则从实际的角度来看这无关紧要。

答案 1 :(得分:0)

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
With ActiveSheet.ChartObjects("Chart 2").Chart
ActiveSheet.ChartObjects("Chart 2").Activate
' for main axes
ActiveChart.Axes(xlValue).MaximumScale = Worksheets("Single 
Tool").Range("$G$161").Value
ActiveChart.Axes(xlValue).MinimumScale = Worksheets("Single 
Tool").Range("$F$163").Value

'for secondary axes
ActiveChart.Axes(xlValue, xlSecondary).MaximumScale = Worksheets("Single 
Tool").Range("$G$161").Value
ActiveChart.Axes(xlValue, xlSecondary).MinimumScale = Worksheets("Single 
Tool").Range("$F$163").Value


End With
End Sub

我发现这种效果最好。谢谢大家