首页 文章

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

提问于
浏览
0

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

我试图用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 回答

  • 1

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

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

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

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

  • 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
    

    我发现这个效果最好 . 谢谢你们

相关问题