Удаление объектов «chartobjects» из объекта «chartobjects» во время цикла

#excel #vba #loops #excel-charts

Вопрос:

Мой код VBA перебирает последовательность диапазонов и проверяет, что внутри каждого диапазона находится только одна диаграмма, удаляя все дополнительные диаграммы. Я хотел бы удалить все диаграммы, с которыми я уже имел дело, из коллекции chartobjects, которую я просматриваю, как удалить объект chartobject из объекта chartobjects?

Вот мой текущий код.

 Dim ChartsNotChecked As ChartObjects
Dim ChartsChecked As ChartObjects

Dim i As Long
Dim j As Long

Dim ChartBox As Range
Dim Char As ChartObject
Dim FirstChart As ChartObject
Dim OneFound As Boolean

Set ChartsNotChecked = ActiveSheet.ChartObjects
For j = 10 To 100 Step 10
    Set ChartBox = Range(Cells(1, j - 9), Cells(10, j))
    
    OneFound = False
    
    For Each Char In ChartsNotChecked
        
        If Not Intersect(Char.TopLeftCell, ChartBox) Is Nothing Then 'check if chart intersects current chartbox
            
            If Not OneFound Then 'catches first intersecting chart automatically
            
                Set FirstChart = Char
                OneFound = True
            
            Else
                If Not FirstChart Is Nothing Then Char.Delete 'deletes any other charts
            
            End If
        End If
        
    Next Char

'format FirstChart    
'remove FirstChart from ChartsNotChecked
'add FirstChart to ChartsChecked

Next j
 

Ответ №1:

ОТРЕДАКТИРОВАНО — сначала поместите все диаграммы в коллекцию, чтобы вы могли удалять их по ходу работы.

 Sub GG()
    
    Dim allCharts As New Collection
    Dim ChartsChecked As New Collection
    Dim i As Long, j As Long
    Dim ChartBox As Range
    Dim Char As ChartObject
    Dim OneFound As Boolean, ws As Worksheet
    
    Set ws = ActiveSheet
    
    'make a collection of all chartobjects
    For Each Char In ws.ChartObjects
        allCharts.Add Char
    Next Char
    
    For j = 10 To 100 Step 10
        Set ChartBox = ws.Range(ws.Cells(1, j - 9), ws.Cells(10, j))
        OneFound = False
        For i = allCharts.Count To 1 Step -1 'work backwards
            Set Char = allCharts(i)
            If Not Intersect(Char.TopLeftCell, ChartBox) Is Nothing Then 'check if chart intersects current chartbox
                If Not OneFound Then 'catches first intersecting chart
                    OneFound = True
                Else
                    Char.Delete 'deletes any other charts
                End If
                allCharts.Remove i 'remove from collection: was kept or deleted
            End If
        Next i
    Next j
End Sub
 

Комментарии:

1. Я хотел бы иметь возможность уменьшить размер массива, который я просматриваю. В вашем коде с 10 полями и 10 диаграммами каждое поле проверяет каждую диаграмму, так что в общей сложности выполняется 100. Если я удалю проверенную диаграмму из цикла, я проверю 10, затем 9, затем 8… таким образом, в общей сложности будет только 55 пробежек. Мой полный лист содержит примерно 60 диаграмм и 60 полей, поэтому я ищу способ ускорить обработку.