Метки данных сводной диаграммы из диапазона в VBA - PullRequest
0 голосов
/ 22 января 2019

Визуальная сводная диаграмма

Я пытаюсь отредактировать сводную диаграмму так, чтобы ее метки данных уменьшались при необходимости (т.е. 6-значные числа делятся на 1000), что требуетдобавление пользовательских меток из диапазона ячеек к числу, чтобы показать, что оно масштабировано.Например, число, изначально равное 800 000, будет преобразовано в 800 в сводной таблице с помощью настраиваемой серии формул, а затем другая ячейка с формулой определит, масштабировано ли это, и покажет «M» (для мили), если оноИмеет.

Статически я могу выполнить это без VBA, просто установив флажок «Значение из ячеек» в дополнение к полю «Значение» при форматировании меток данных.Тем не менее, при изменении представления, как я должен делать постоянно, сбрасывается ссылка, которую я сделал при проверке «Value from Cells».Кроме того, мои ярлыки часто возвращаются к тому, чтобы быть бесцветными и меньше, чем я их сделал.Поэтому я чувствую, что мне нужно создать макрос, который будет обновлять мои метки данных для включения поиска диапазона и изменения размера при каждом изменении таблицы.Мой код для этой цели приведен ниже.

Dim numSubs As Integer
Dim Labels As Range
numSubs = 7 'find a way to count number of active series
For i = 1 To numSubs
    With Sheet16.ChartObjects("Chart 2").SeriesCollection(i).DataLabels
        .ShowRange = False
        .Format.TextFrame2.TextRange. _
            InsertChartField msoChartFieldRange, "='New PC Mapping'!$I$32:$I$34", 0 'find a way to cycle thru ranges
        .Format.TextFrame2.TextRange.Font.Bold = msoTrue
        .Format.TextFrame2.TextRange.Font.Size = 14
    End With
Next

Во-первых, VBA говорит мне, что я не могу запустить SeriesCollection на своем графике, что является методом, показанным во всех примерах, которые я прочитал.Я понятия не имею, в чем суть проблемы.Я проверил, что он может идентифицировать Sheet16.ChartObjects ("Chart 2")

Во-вторых, мне нужно найти способ циклически проходить через несколько диапазонов, поскольку у каждой серии есть свои.Моя строка кода здесь - от записи макроса, потому что я не мог найти код для выполнения этого где-либо онлайн, поэтому я уверен, что его можно улучшить, но в текущей форме он принимает строку формулы, что затрудняетдля перемещения с Range.Offset, например.

Оттуда, я знаю, как вызвать его, когда сводная таблица адресована.Мне просто нужна помощь, чтобы заставить его работать только над одной серией, и я могу обобщить.Спасибо!

1 Ответ

0 голосов
/ 23 января 2019

Спасибо за помощь в комментариях, Крис!

Я нашел способ сделать нужный мне цикл:

Set dataLabelRange = Sheet24.Range("I20:I22").Offset(0, i)
dataLabelString = "='New PC Mapping'!" & dataLabelRange.Address

С i ++ каждый цикл и dataLabelString вставляются там, где адрес идет выше.

Для тех, кому нужен способ пересвязать адреса в макросе, например, вызванный щелчком на сводной таблице, которая может разорвать эти ссылки, мой окончательный код ниже:

Dim dataLabelRange As Range
Dim dataLabelString As String
Dim mySeries As Series
Dim i As Integer
i = 0
For Each mySeries In Sheet16.ChartObjects("Chart 1").Chart.FullSeriesCollection
    Set dataLabelRange = Sheet24.Range("I20:I22").Offset(0, i) 'runs through columns of 3 side by side, which is how I had the labels I wanted to add
    dataLabelString = "='*Sheet Name*'!" & dataLabelRange.Address
    mySeries.ApplyDataLabels
    With mySeries.DataLabels
        .ShowRange = False
        .Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, dataLabelString, 0
        .ShowRange = True
        .Format.TextFrame2.TextRange.Font.Bold = msoTrue 'addition code for formatting labels
        .Format.TextFrame2.TextRange.Font.Size = 14
        .Separator = " "
    End With
    i = i + 1
Next mySeries
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...