如何引用具有相同名称但在不同工作表上的图表?

eir*_*ude 11 excel vba excel-vba

我有两个包含图表的工作表,并使用宏来运行包含图表的所有工作表并更新图表中的值.

但是,在尝试在第一个工作表之后引用工作表中的图表时遇到问题 - 尽管工作表的引用发生了更改,但对图表的引用却没有.

循环看起来像这样:

For Each ws In ThisWorkbook.Worksheets
  Debug.Print ws.Name
  Debug.Print ws.ChartObjects("Kortsone").Chart.Name
  With ws.ChartObjects("Kortsone").Chart
    ...
  End With
Next ws
Run Code Online (Sandbox Code Playgroud)

我到达即时窗口的输出如下:

Grafar ovn 3
Grafar ovn 3 Kortsone
Grafar ovn 4
Grafar ovn 3 Kortsone
Run Code Online (Sandbox Code Playgroud)

正如您所看到的对工作表的引用更改,但图表引用没有.

有没有办法解决这个问题,还是我必须用独特的名称重命名我的所有图表?

我正在使用Excel 2013

- 编辑 -我现在已根据评论中的建议进行了一些测试,看来打印到即时窗口的内容取决于当前活动工作表的内容.

尝试使用for each chartobject遇到了与我之前相同的问题:

Sub test2()
  Dim ws As Worksheet
  Dim ch As ChartObject

  For Each ws In ThisWorkbook.Worksheets
    For Each ch In ws.ChartObjects
      If ws.CodeName = "Graf4" Then
      Debug.Print ws.Name
      Debug.Print ch.Name
      Debug.Print ch.Chart.Name
      End If
    Next ch
  Next ws
End Sub
Run Code Online (Sandbox Code Playgroud)

放弃:

Grafar ovn 4
Kortsone
Grafar ovn 3 Kortsone
Grafar ovn 4
Langsone
Grafar ovn 3 Langsone
...
Run Code Online (Sandbox Code Playgroud)

Thu*_*ame 5

正如您所发现的,该Workheet.ChartObjects方法将找到正确的ChartObject,但访问该Chartobject.Chart属性将返回ActiveSheet的图表.如果按名称或索引号引用ChartObject,则无关紧要.

如果使用该Worksheet.Shapes方法查找ChartObject,则行为相同.

此行为与早期版本的Excel不同.我确认代码在Excel XP/2002中有效,并且在2016年不起作用.我不确定行为何时发生变化.它可能是2013年,或者它可能是2013年和2016年的补丁?Office for Mac 2016中的行为是相同的(即.不起作用)

在Microsoft提出修复之前,您必须访问Chart属性之前激活工作表或激活ChartObject .

Sub test()
  Dim ws As Worksheet
  Dim co As ChartObject
  For Each ws In ThisWorkbook.Worksheets
    Debug.Print ws.Name
    Set co = ws.ChartObjects("Kortsone")

    ws.Activate
    'or
    co.Activate

    Debug.Print co.Chart.Name
    With ws.ChartObjects("Kortsone").Chart
    End With
  Next ws
End Sub
Run Code Online (Sandbox Code Playgroud)

我建议您暂时禁用ScreenUpdating,并在完成后重新激活原始活动表.