Диаграмма Excel: цветные метки данных по категориям — строки

Это следующий вопрос к этому:

Диаграмма Excel: цветные метки данных по категориям — столбцам

Следующий код раскрашивает метки данных диаграммы в соответствии с категориями и значениями, расположенными в двух строках:

  • строка 1 = категория
  • строка 2 = значение

Процедура работает нормально, пока категории находятся в строке 1, а значения — в строке 2.

Как заставить его работать с любым диапазоном из двух строк, например. ряды 5/6 или 27/28?

Cells(categoryColorRow, colIndex) и Cells(valueColorRow, colIndex) всегда указывают на строки 1 и 2.

Как получить colIndex из формулы ряда диаграммы?

Sub Labels_SourceROWS_v2()
   Dim p As Point
   Dim CatValueLength As Variant
   Dim dls As DataLabels
   Dim length As Long
   Dim labelItems As Variant
   Dim categoryColorRow As Long
   Dim valueColorRow As Long
   Dim colIndex As Long
   Dim color As Long
   Dim valueText As String
   Dim percentText As String
   Dim startPos As Long
   categoryColorRow = 1
   valueColorRow = 2
   colIndex = 2
   With ActiveChart.SeriesCollection(1)
       .HasDataLabels = True
       With .DataLabels
           .ShowValue = True
           .ShowCategoryName = True
           .Separator = vbLf
           .Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = vbBlack
           .Format.TextFrame2.TextRange.Font.Bold = False
           .NumberFormat = "0,0000"
           .Position = xlLabelPositionOutsideEnd
           .Font.Name = "Calibri"
           .Font.Size = 10
       End With
       For Each p In .Points
           labelItems = Split(p.DataLabel.Text, vbLf)
           labelItems(1) = Format(Replace(labelItems(1), ".", ","), "0.00")
           With p.DataLabel.Format.TextFrame2.TextRange
               'Load Label with Category and Value
               .Text = labelItems(0) & vbLf & labelItems(1)
               startPos = 1
               'Category
               length = Len(labelItems(0))
               color = ActiveSheet.Cells(categoryColorRow, colIndex).Font.color
               .Characters(startPos, length).Font.Bold = True
               .Characters(startPos, length).Font.Fill.ForeColor.RGB = color
               'Value
               color = ActiveSheet.Cells(valueColorRow, colIndex).Font.color
               startPos = startPos + length + 1
               length = Len(labelItems(1))
               .Characters(startPos, length).Font.Bold = True
               .Characters(startPos, length).Font.Fill.ForeColor.RGB = color
           End With
           colIndex = colIndex + 1
       Next
   End With
End Sub

РЕДАКТИРОВАТЬ

Решено FaneDuru:

Вам необходимо извлечь соответствующие строки и первый столбец из диапазона, на который нацелена диаграмма.

FaneDuru 26.05.2024 13:45
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я уже говорил в своем комментарии выше, вам нужно извлечь строки диапазонов серий из их формулы. Пожалуйста, протестируйте приведенный выше адаптированный код:

Sub Labels_SourceROWS_v2()
   Dim p As point, CatValueLength As Variant, dls As DataLabels, length As Long
   Dim labelItems As Variant, categoryColorRow As Long
   Dim valueColorRow As Long, colIndex As Long, color As Long
   Dim valueText As String, percentText As String, startPos As Long
   
   If TypeName(Selection) = "Range" Then MsgBox "You forgot selecting a chart...": Exit Sub

   categoryColorRow = 1
   With ActiveChart.SeriesCollection(1)
       .HasDataLabels = True

       'new code lines exgtracting the necesssary variables value:__
       valueColorRow = Range(Split(.Formula, ",")(2)).row
       categoryColorRow = Range(Split(.Formula, ",")(1)).row
       colIndex = Range(Split(.Formula, ",")(1)).column
       '____________________________________________________________

       With .DataLabels
           .ShowValue = True
           .ShowCategoryName = True
           .Separator = vbLf
           .Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = vbBlack
           .Format.TextFrame2.TextRange.Font.Bold = False
           .NumberFormat = "0,0000"
           .Position = xlLabelPositionOutsideEnd
           .Font.name = "Calibri"
           .Font.size = 10
        End With
       
       For Each p In .points
           labelItems = Split(p.DataLabel.Text, vbLf)
           labelItems(1) = Format(VBA.Replace(labelItems(1), ".", ","), "0.00")
           With p.DataLabel.Format.TextFrame2.TextRange
               'Load Label with Category and Value:
               .Text = labelItems(0) & vbLf & labelItems(1)
               startPos = 1
               'Category:
               length = Len(labelItems(0))
               color = ActiveSheet.cells(categoryColorRow, colIndex).Font.color
               .Characters(startPos, length).Font.Bold = True
               .Characters(startPos, length).Font.Fill.ForeColor.RGB = color
               'Value:
               color = ActiveSheet.cells(valueColorRow, colIndex).Font.color
               startPos = startPos + length + 1
               length = Len(labelItems(1))
               .Characters(startPos, length).Font.Bold = True
               .Characters(startPos, length).Font.Fill.ForeColor.RGB = color
           End With
           colIndex = colIndex + 1
       Next
   End With
End Sub

Пожалуйста, отправьте отзыв после тестирования.

Решение аналогично решению для «колонок-подписчиков». Вы оба используете =Range(Split(.Formula, ",").... Могу я спросить: что означает ",")(2)? Формула ряда: =SERIES(;Sheet1!$G$5:$J$5;Sheet1!$G$6:$J$6;1). Итак, ",") означает «разделить диапазон»? А (2) обозначает вторую строку =G6:J6? А (1) обозначает первую строку =G5:J5?

user23636411 26.05.2024 14:34

@ user23636411 Я не смотрел другие сабвуферы. Было очевидно, что вам необходимо сопоставить фактические целевые строки серии с используемыми переменными. Или наоборот... Формула ряда содержит обе строки (Category и Value). Поскольку формула сохраняет обе строки, вы можете извлечь правильный диапазон из элементов массива (первого или второго)...

FaneDuru 26.05.2024 14:41

Другие вопросы по теме