根据工作簿中的embedded式图表的位置(例如,左右和上下顺序)循环embedded图表,

我试图循环遍历特定工作表中的图表,然后使用以下代码将它们移到所有工作表末尾的新图表工作表中:

Dim ws As Worksheet, co As ChartObject, c As Chart Set ws = ThisWorkbook.Sheets("nameofSheet") ws.Activate For Each co In ws.ChartObjects Set c = co.Chart 'do stuff with c Next co 

问题是,这是遵循它们的创build顺序。 随着时间的推移,我在这里和那里慢慢添加更多的“function”,从而构build了我的工作簿,因此按照创build顺序处理图表是没有意义的。

有没有一种方法来循环工作表上的图表根据他们在工作表中的位置? 例如,从左到右然后直到下来。 我至less需要某种已知的顺序,以便我可以正确处理图表。

如果没有,将单独更改图表名称分别为“图表1”,“图表2”,…,“图表n”使上述代码我使用的工作?

你需要的解决scheme是遍历列表并构build一个包含co.BottomRightCell.Address内容的co.BottomRightCell.Address ;

如果您的graphics重叠,并开始在同一个单元格,您也有解决scheme使用

  co.Top co.Left 

然后命令这个列表,例如列第一行,然后是行,并且您有“位置sorting”列表。

我的解决scheme – 不是最佳的,因为我不知道如何在vba中制作hashmap:

 Sub macro() Dim ws As Worksheet, co As ChartObject, c As Chart Dim arr As Object Set arr = CreateObject("System.Collections.ArrayList") Set ws = ThisWorkbook.Sheets("Sheet1") ws.Activate For Each co In ws.ChartObjects ' Initialise the ArrayList, for instance by taking values from a range: arr.Add co.Top + 10000 * co.Left Next co arr.Sort ' Optionally reverse the order 'arr.Reverse For Each x In arr For Each co In ws.ChartObjects If (co.Top + 10000 * co.Left = x) Then 'MsgBox x Set c = co.Chart ' do stuff with c co.Select co.Activate End If Next co Next x End Sub 

对初始语法稍作修改,可以按顺序select图表,代码将按照您select的顺序处理它们。

请注意,Excel循环未选中的图表对象的顺序是按照它们的Z顺序,从后到前。 这通常是插入图表的顺序,但是您可以向前和向后移动图表以影响此图表,并且可以在“select”窗格上重新排列图表。

这是一个简单的六张图表。 它们的标题按照它们创build的顺序显示图表对象名称,图表1到图表6。

重命名之前有六个图表

这是我用来重命名图表的代码:

 Sub RenameCharts() Dim sh As Shape Dim i As Long For Each sh In Selection.ShapeRange i = i + 1 sh.Name = "CHART_" & Format(i, "00") sh.Chart.ChartTitle.Text = sh.Name Next End Sub 

我按顺序select了图表,第一行从左到右,然后是第二行,从左到右; 通过点击select第一个图表,通过在按住Ctrl的同时点击第二个图表,select所有图表。 当所有的图表被选中,我跑了代码。

结果如下所示。 图表按我select的顺序命名。 请注意,我没有影响他们的Z顺序,只是他们的名字。

重命名后的六个图表

您现在可以使用图表对象名称来处理您的图表:

 For i = 1 To 6 ' or whatever With ActiveSheet.ChartObjects("CHART_" & Format(i, "00")).Chart ' process the chart End With Next 

或者,您可以跳过重命名过程,按照我所做的重命名图表的顺序select图表,然后按照以下顺序处理图表:

 For Each sh In Selection.ShapeRange With sh.Chart ' process the chart End With Next