VBA确定“for each loops”中的对象的顺序

我怎样才能控制我的图表装置在for each循环的顺序? 现在图表是随机select的, 图表2,图表7,图表5等

我应该重命名预定义的图表名称吗? 如果是这样,我该怎么做?

  ... 'Loop charts ThisWorkbook.Activate Dim objCht As Object Dim i As Integer i = 1 For Each objCht In Worksheets(Detailed.Name).ChartObjects With objCht '.Chart ThisWorkbook.Activate .Copy dataFile.Activate Select Case i Case 1 Application.Goto Range("B2") Case 2 Application.Goto Range("B17") Case 3 Application.Goto Range("R17") Case 4 Application.Goto Range("J17") Case 5 Application.Goto Range("N17") Case 6 Application.Goto Range("J2") Case Else MsgBox "Hmmmm...." End Select ActiveSheet.PasteSpecial Format:="Picture (Enhanced Metafile)", Link:=False, DisplayAsIcon:=False End With i = i + 1 Next objCht ... 

这是你想要的吗? 我假设图表是按顺序命名的。 即1到任何数字( Charts.Count

 Dim ws As Worksheet Dim objChart As ChartObject Dim i As Long Set ws = ThisWorkbook.Sheets("YourSheetName") For i = 1 To ws.ChartObjects.Count Debug.Print ws.ChartObjects("Chart " & i).Chart.Name With ws.ChartObjects("Chart " & i).Chart '~~> Do what you want here End With Next i 

For Each从第一个到最后For Each元素迭代一个集合,按顺序添加它们。

因此,要么按照您希望迭代的顺序剪切并粘贴(即删除和重新创build)每个图表对象,要么使用序列命名它们,并使用For循环从ChartObjects集合中提取每个图表名字,就像Siddharth的答案一样 。

唯一的问题是集合想要迭代For Each循环。 如果使用For循环迭代集合,则会付出性能损失。

最好的方法(如果你想承担直接的控制,而不是让你的代码使用潜在的随机指标)将是重命名您的图表。 为此,请转至主页>查找并select>select窗格。 从这里,你可以直接命名你的图表,然后做这样的事情。

 ThisWorkbook.Activate Dim objCht As Object For Each objCht In Worksheets(Detailed.Name).ChartObjects With objCht '.Chart ThisWorkbook.Activate .Copy dataFile.Activate Select Case objChart.Name Case "Name1" Application.Goto Range("B2") Case "Name2" Application.Goto Range("B17") Case "Name3" Application.Goto Range("R17") Case "Name4" Application.Goto Range("J17") Case "Name5" Application.Goto Range("N17") Case "Name6" Application.Goto Range("J2") Case Else MsgBox "Hmmmm...." End Select ActiveSheet.PasteSpecial Format:="Picture (Enhanced Metafile)", Link:=False, DisplayAsIcon:=False End With i = i + 1 Next objCht 

这一切都说,它乞求为什么你的图表随机重新sorting自己的问题? 另外,像这样的方法不会非常灵活,因为您添加更多的图表(您必须添加名称,并且每次手动定位)。