GetChartElement возвращает неправильную серию диаграмм

#excel #vba

#преуспеть #vba #excel

Вопрос:

У меня есть график диаграммы EXCEL, содержащий линии и точки. Я использую MouseUp/GetChartElement , чтобы определить, какую серию пользователь щелкнул левой кнопкой мыши. Chart_MouseUp Код основан на коде, который Джон Пелтье любезно разместил на своем веб-сайте :

 Private Sub Chart_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal X As Long, ByVal Y As Long)

    Dim elementId As Long
    Dim arg1 As Long
    Dim arg2 As Long
    
    Dim xlSer As Series
    
    With ActiveChart
        .GetChartElement X, Y, elementId, arg1, arg2
        If elementId = xlSeries Then
            If Button = xlPrimaryButton And Shift = 4 Then
                Set xlSer = .SeriesCollection(arg1)
                MsgBox "User clicked series " amp; xlSer.Name
            End If
        End If
    End With
End Sub
  

Проблема в том, что серия, возвращаемая кодом, смещена на 1: например, если я нажимаю на серию # 6, то код говорит, что я нажал на серию # 7. На диаграмме, похоже, нет никаких скрытых рядов (я проверил, прокручивая Chart.SeriesCollection ), поэтому я довольно сбит с толку. Был бы признателен за любые комментарии или мысли … заранее спасибо

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

1. Что Debug.Print ActiveChart.SeriesCollection.count возвращает в немедленном окне, по сравнению с тем, что, по вашему мнению, является последней серией?

2. выводится 8 — это количество рядов, показанных на графике

3. И если вы нажмете на последнюю, что возвращает функция?

4. Runtime error '1004' - parameter not valid . В режиме отладки ошибка вызвана тем, что arg1 равно 9, что на 1 больше, чем SeriesCollection.Count

5. Это происходит на всех ваших диаграммах, которые вы пробовали? Если да, вы просто адаптируете функцию для возврата Set xlSer = .SeriesCollection(arg1 - 1) … Даже если это не имеет никакого значения, поскольку SeriesCollections начинается с 1. Но это будет способ / обходной путь использовать его по мере необходимости … 🙂

Ответ №1:

Как указал FaneDuru, одна из серий была скрыта ( SeriesCollection.Format.Line.Visible = False ), так что она была включена в общее количество серий (предположительно, где-то поддерживается Excel), но исключена из SeriesCollection.Count . Удаление скрытой серии решило проблему