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)
正如您所发现的,该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,并在完成后重新激活原始活动表.
| 归档时间: |
|
| 查看次数: |
1585 次 |
| 最近记录: |