3

Я пытаюсь написать подпрограмму Excel 2010 VBA для форматирования диаграмм в соответствии с заранее определенным (то есть определенным мной) стандартом. Конкретные атрибуты, которые я хочу установить, - это просто атрибуты, которые становятся доступными через окно «Форматировать ряд данных», которое открывается при двойном щелчке по ряду данных.

Стремясь найти имена различных свойств, которые мне нужно было установить, я записал в виде макроса изменения, которые я вносил в стиль ряда данных. Однако, хотя я могу установить разные цвета линии и цвета линии маркера в окне «Форматировать ряд данных», записанный макрос (аннотированный ниже) ссылается на объекты с одинаковыми именами (неразличимые) для цвета линии и цвета линии маркера.

Кроме того, когда я запускаю макрос, есть две проблемы. Во-первых, несмотря на то, что записанный макрос ссылается на свойство marker-fill .ForeColor.Brightness , эта строка выдает ошибку при выполнении макроса. В сообщении об ошибке «Метод Яркость объекта ColorFormat не удалось». Во-вторых, записанный код фактически одновременно устанавливает цвет линии маркера и основную линию для серии, поэтому в записанном коде они оба сначала устанавливаются на то, что, как я надеялся, будет цветом линии маркера, а затем оба на то, что я хотел основной цвет линии.

Как настроить заливку маркера, цвет линии маркера и цвет линии.

Sub Macro1()
'
' Macro6 Macro
' On Sheet 1 there is a single embedded chrt 
  ActiveSheet.ChartObjects("Chart 1").Activate
  ActiveChart.SeriesCollection(1).Select
  With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorText1
    .ForeColor.TintAndShade = 0
'    The following (recorded line produces an error)
    .ForeColor.Brightness = 0.5
    .Transparency = 0
    .Solid
  End With
  With Selection.Format.Line
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent5
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = 0.400000006
    .Transparency = 0
  End With
  With Selection.Format.Line
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent6
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = -0.5
    .Transparency = 0
  End With
End Sub

3 ответа3

4

Похоже, что эти варианты форматирования реализованы несколько неловко в Excel 2010 и 2013:

  1. Цвет и свойства линии задаются так, как код макроса их записал, используя Series.Format объекта и его потомков (Fill , Glow , Shadow и т.д. [1]).
  2. Цвет заливки маркера для всех маркеров серии задается с помощью параметра « Series.MarkerBackgroundColor или Series.MarkerBackgroundColorIndex . Аналогично, цвет линии маркера для всех маркеров в серии устанавливается с помощью Series.MarkerForegroundColor или Series.MarkerForegroundColorIndex . [2]
  3. Кроме того, маркер заливки и цвета линий могут быть установлены индивидуально через Series.Points(n).Format.Fill и Series.Points(n).Format.Line объектов. Однако , по крайней мере, в Excel 2013 изменяются Series.Points(n).Format.Line.ForeColor также изменяет цвет отрезка, непосредственно предшествующего соответствующей точке данных.

Свойства # 2 выглядят как пережитки предыдущей версии Excel DOM, хотя и с расширенными функциональными возможностями .MarkerForegroundColor и .MarkerBackGroundColor принимает любое значение RGB. Те из # 3 соответствуют новому уровню конфигурируемости, найденному в Excel 2010 и новее, но они кажутся ошибочными. Один раздражающий аспект ошибки заключается в том, что кажется, что цвета линии маркера проблематично переплетаются с цветом линии серии - насколько я могу судить, невозможно изменить цвет линии, не влияя также на цвета линии маркера, и наоборот. наоборот. В частности, может показаться, что невозможно добиться однородного цвета линии серии, одновременно применяя точечные вариации цвета линии маркера с использованием VBA. (Опять же, я тестирую здесь, в Excel 2013; 2010 может вести себя по-другому.)

В любом случае, в ситуациях, когда точечная подстройка цвета не требуется, вспомогательная функция, такая как следующая, может быть полезна для внесения изменений в цвет линии, не затрагивая заливку маркера или цвета линии (здесь указывается newLineColor как значение Long RGB [3]):

Sub ChangeLineColorOnly(srs as Series, newLineColor as Long)
    Dim oldMkrFill as Long, oldMkrLine as Long

    ' Store old marker colors
    oldMkrFill = srs.MarkerBackgroundColor
    oldMkrLine = srs.MarkerForegroundColor

    ' Set the series ForeColor
    srs.Format.Fill.ForeColor.RGB = newLineColor

    ' Restore the old marker colors
    srs.MarkerBackgroundColor = oldMkrFill
    srs.MarkerForegroundColor = oldMkrLine

End Sub

Альтернативная версия вышеупомянутой вспомогательной функции может быть легко написана для размещения цветов, заданных как SchemeColor [4], или для сохранения только цвета линии маркера и т.д.

Что касается .ForeColor.Brightness , по-видимому, в результате небрежного перекодирования функции «Запись макроса» при разработке выпуска Excel 2010. Вероятно, он должен был быть вставлен в записанный код VBA только для определенных типов диаграмм, где .Brightness является действительным атрибутом, который необходимо изменить.

[1] http://msdn.microsoft.com/en-us/library/office/ff839279(v=office.14).aspx
[2] http://msdn.microsoft.com/en-us/library/office/ff840677(v=office.14).aspx
[3] http://msdn.microsoft.com/en-us/library/zc1dyw8b%28v=vs.90%29.aspx
[4] http://msdn.microsoft.com/en-us/library/office/ff836764(v=office.14).aspx

0

Это работает для меня.

   ActiveChart.FullSeriesCollection(1).Select
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)
        .Transparency = 0
        .Solid
    End With
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)
        .Transparency = 0
    End With
-1

Я думал, что это сработало и для меня, за исключением того, что он превращает заливку в красный, независимо от того, какие значения RGB я ввел.

ActiveChart.FullSeriesCollection(1).Выбрать с помощью выбора.Формат.ЗаполнитьVisible = msoTrue.ForeColor.RGB = RGB(255, 0, 0).Прозрачность = 0.Твердый конец с

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .