Это следующий вопрос к этому:
Диаграмма Excel: цветные метки данных по категориям — столбцам
Следующий код раскрашивает метки данных диаграммы в соответствии с категориями и значениями, расположенными в двух строках:
Процедура работает нормально, пока категории находятся в строке 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:


Как я уже говорил в своем комментарии выше, вам нужно извлечь строки диапазонов серий из их формулы. Пожалуйста, протестируйте приведенный выше адаптированный код:
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 Я не смотрел другие сабвуферы. Было очевидно, что вам необходимо сопоставить фактические целевые строки серии с используемыми переменными. Или наоборот... Формула ряда содержит обе строки (Category и Value). Поскольку формула сохраняет обе строки, вы можете извлечь правильный диапазон из элементов массива (первого или второго)...
Вам необходимо извлечь соответствующие строки и первый столбец из диапазона, на который нацелена диаграмма.