我有这个甘特图,我正在查看计划与实际日期。 问题是图表不会同步开始/结束日期。
我试图用VBA将最大/最小值链接到单元格,但它不会这样。
我尝试使用此网站: https://peltiertech.com/link-excel-chart-axis-scale-to-values-in-cells/
但他的代码对我的图表不起作用。
日期必须相同,如果我更改右侧表格中的某些值,则一起更改 有任何想法吗? 感谢
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
答案 0 :(得分:1)
您重复使用的代码是一个简单的演示程序,它允许在工作表上的6个特定单元格中的一个更改时操作图表的轴。但是,这些更改旨在由用户通过键盘进行。以这种方式进行更改会触发Worksheet_Change
事件,并允许识别已更改的单元格。事件例程中的代码根据特定工作表单元格的更改来修改图表的轴。
正如David Ziemens在评论中指出的那样,你的问题是,如果一个单元格因为通过公式重新计算而改变了值,则此更改不会触发Worksheet_Change
事件。 (当然,工作表上其他地方手动输入的更改完全有可能触发Worksheet_Change
事件和重新计算,导致感兴趣的单元格通过公式更改其值。但是,在这种情况下, Target
参数将标识手动更改的单元格,而不是通过公式重新计算的单元格。)
丢弃Select ... Case
结构,这实际上只在您尝试重用的演示程序的上下文中有用。相反,请更改代码,使其无条件地直接从单元格G161
和F163
更新所有4个图表属性(因此请使用ws.Range("G161").Value
和ws.Range("F163").Value
代替{{1} }用于分配图表属性,其中Target.Value
表示这些单元格所在的工作表 - 例如ws
或ActiveSheet
或工作表被调用的任何内容。将图表属性的分配包含在Worksheets("Sheet1")
子内而不是Workbook_SheetChange
中,并且只要工作簿重新计算,您的图表就会更新。
这不是一个非常纯粹的解决方案,因为它不会检测单元Worksheet_Change
和F163
在重新计算时是否实际发生了变化。因此,它存在以下风险:不必要地为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
我发现这种效果最好。谢谢大家