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

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

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

Как заставить код работать с данными, расположенными в двух столбцах?

  • столбец A = категория
  • столбец B = значение

Замена

Dim categoryColorRow As Long
Dim valueColorRow As Long
categoryColorRow = 1 
valueColorRow = 2
colIndex = 2 

с

Dim categoryColorCol As Long
Dim valueColorCol As Long
categoryColorCol = 1 
valueColorCol = 2 
colIndex = 2 

не работает. Это не меняет поведение кода. Для операции будут использоваться только строки, а не столбцы в качестве источника.

Вот и вся процедура, она отлично работает для строк:

Sub Labels_SourceROWS()
  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
          .ShowPercentage = True
          .Separator = vbLf
          .Format.TextFrame2.TextRange.Font.Bold = False
          .NumberFormat = "#.##0,00;- #.##0,00"
          .Position = xlLabelPositionBestFit
          .Font.Name = "Arial Narrow"
          .Font.Size = 8
      End With
      For Each p In .Points
          labelItems = Split(p.DataLabel.Text, vbLf)
          labelItems(1) = Format(Replace(labelItems(1), ".", ","), "0.00")
          labelItems(2) = Format(Replace(labelItems(2), ".", ","), "0.00%")
          With p.DataLabel.Format.TextFrame2.TextRange
              'load datalabel
              .Text = labelItems(0) & vbLf & labelItems(1) & vbLf & labelItems(2)
              startPos = 1
              length = Len(labelItems(0)) 'Category
              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
              'Percentage
              color = ActiveSheet.Cells(valueColorRow, colIndex).Font.color
              startPos = startPos + length + 1
              length = Len(labelItems(2))
              .Characters(startPos, length).Font.Bold = False
              .Characters(startPos, length).Font.Fill.ForeColor.RGB = color
          End With
          colIndex = colIndex + 1
      Next
  End With
End Sub

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

Ответы 1

Ответ принят как подходящий
  • Cells(valueColorRow, colIndex) и Cells(valueColorRow, colIndex) указывают на неправильные ячейки.
  • colIndex получается из формулы ряда диаграмм.
Sub Labels_SourceCOLUMNS()
   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 valueColorCol As Long
   Dim colIndex As Long
   Dim color As Long
   Dim valueText As String
   Dim percentText As String
   Dim startPos As Long
   categoryColorRow = 1
   valueColorCol = 2
   ' colIndex = 2
'   ActiveSheet.ChartObjects(1).Activate
'    Dim s As Series
'    Set s = ActiveChart.SeriesCollection(1)
'    Stop
   With ActiveChart.SeriesCollection(1)
       colIndex = Range(Split(.Formula, ",")(1)).Column
       categoryColorRow = Range(Split(.Formula, ",")(1)).Row ' **
       .HasDataLabels = True
       With .DataLabels
           .ShowValue = True
           .ShowCategoryName = True
           .ShowPercentage = True
           .Separator = vbLf
           .Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = vbBlack
           .Format.TextFrame2.TextRange.Font.Bold = False
           .NumberFormat = "0,0000"
           .Position = xlLabelPositionOutsideEnd
           .Font.Name = "Arial Narrow"
           .Font.Size = 10
       End With
       For Each p In .Points
            startPos = 1
           labelItems = Split(p.DataLabel.Text, vbLf)
           'labelItems(1) = Format(Replace(labelItems(1), ".", ","), "0.00") 'no need
           labelItems(2) = Format(Replace(labelItems(2), ".", ","), "0.00%")
           With p.DataLabel.Format.TextFrame2.TextRange
               ' load datalabel with text
               .Text = labelItems(0) & vbLf & labelItems(1) & vbLf & labelItems(2)
               length = Len(labelItems(0)) 'Category
               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(categoryColorRow, colIndex + 1).Font.color
               startPos = startPos + length + 1
               length = Len(labelItems(1))
               .Characters(startPos, length).Font.Bold = True
               .Characters(startPos, length).Font.Fill.ForeColor.RGB = color

               color = vbBlack
               startPos = startPos + length + 1
               length = Len(labelItems(2))
               .Characters(startPos, length).Font.Bold = False
               .Characters(startPos, length).Font.Fill.ForeColor.RGB = color
           End With
           categoryColorRow = categoryColorRow + 1
       Next
   End With
End Sub


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