Подсчет и форматирование диаграмм Excel VBA

#excel #vba #charts #counting

Вопрос:

Я хотел бы создать макрос, который подсчитывает количество диаграмм в заданном диапазоне, а затем выполняет определенные действия в зависимости от подсчитанного числа. Я знаю activesheet.chartobjects.count , что будет учитываться по всему листу, как бы я изменил, чтобы считать в пределах диапазона?

Вот скелет моего кода.

 Sub chrt_chck()
    Dim rng As Range
    Dim x As Long
    Set rng = Range("A1:F10")
    x = ActiveSheet.rng.ChartObjects.Count
    
    If x > 1 Then
    'select and delete all charts in range
    End If
    
    If x = 1 Then
    'select that chart and update format
    Else
    'create chart and set format
    End If
End Sub

 

Ответ №1:

Пожалуйста, попробуйте следующий способ:

 Sub chrt_chck()
    Dim rng As Range, chO As ChartObject, x As Long, arrChO() As ChartObject, k As Long, El
    
    Set rng = Range("B2:D15") ' Range("A1:F10")
    ReDim arrChO(ActiveSheet.ChartObjects.count - 1)
    For Each chO In ActiveSheet.ChartObjects
        If Not Intersect(chO.TopLeftCell, rng) Is Nothing Then
            x = x   1
            Set arrChO(k) = chO: k = k   1
        End If
    Next
    
    If x > 1 Then
    'select and delete all charts in range
        For Each El In arrChO
            Debug.Print El.name
            El.Delete
        Next
    End If
    
    If x = 1 Then
    'select that chart and update format
         With arrChO(0)
            .Select
            Debug.Print .name
            'do wahtever needed with the chart...
         End With
    Else
    'create chart and set format
    End If
End Sub
 

Он подсчитывает все объекты диаграммы, левый верхний угол которых находится внутри rng диапазона.

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

1. Почему вы определили и x, и k? k мне кажется ненужным. Независимо от того, действует ли кодекс.

2. @Elis: arrChO является массивом на основе нуля и x должен подсчитывать диаграммы… K изначально равно 0. Я мог бы использовать X - 1 здесь, но я привык иметь для этого отдельную переменную. Иногда существуют условные итерации, в которых полезно использовать что-то простое для проверки в конце, если это необходимо, без путаницы с повторяемой переменной. Я могу сказать, что это дело привычки… Хорошая привычка, я бы (все еще) осмелился поверить… 🙂 Я также мог бы объявить массив 1 To ActiveSheet.ChartObjects.count . Но мой опыт заставил меня использовать то решение, которое я использую.

3. Незначительное исправление: Когда лист не содержит диаграмм, вычисляется как и выдает ошибку, поэтому я сделал отступ и в состоянии IF, которое зависит от значения . arrChO(ActiveSheet.ChartObjects.count - 1) arrChO(-1) Redim for ActiveSheet.ChartObjects.count

4. Проверьте перед этим, если количество >0… теперь я за рулем.