Использование VBScript для изменения цвета фона в диаграмме Excel

Я использую VBScript для создания точечной диаграммы из столбцов данных в Excel 2003. Все получается хорошо, но я хочу отредактировать некоторые свойства диаграммы, такие как цвет фона и метки осей. Я сделал это вручную в Excel и записал макрос, который дал мне следующий код VBA:

ActiveChart.PlotArea.Select
With Selection.Border
    .ColorIndex = 16
    .Weight = xlThin
    .LineStyle = xlContinuous
End With
With Selection.Interior
    .ColorIndex = 2
    .PatternColorIndex = 1
    .Pattern = xlSolid
End With
ActiveChart.Axes(xlCategory).Select
With Selection.TickLabels
    .ReadingOrder = xlContext
    .Orientation = 45
End With
ActiveChart.Axes(xlValue).AxisTitle.Select
With Selection
    .HorizontalAlignment = xlCenter
    .VerticalAlignment = xlCenter
    .ReadingOrder = xlContext
    .Orientation = xlHorizontal
End With
ActiveChart.ChartArea.Select
End Sub

Это выглядит нормально для VBA, но у меня возникли проблемы с преобразованием его в VBScript. Как мне начать? Это мой код на данный момент:

Set objChart = objExcel.Charts.Add()
With objExcel.ActiveChart
    .ChartType = xlXYScatterLinesNoMarkers
    .SeriesCollection(1).Interior.Color = RGB(255, 0, 0)
    .HasTitle = True
    .ChartTitle.Text = "usage"
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time"
    .Axes(xlValue, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "units"
    .HasLegend = False
    .SetSourceData objWorksheet.Range("E1","F" & LastRow), xlColumns
    .SetSourceData objWorksheet.Range("E1:F200"), xlColumns
End With

Строка .SeriesCollection(1).Interior.Color = RGB(255, 0, 0) вызывает ошибку: «Невозможно установить свойство цвета класса Interior». Я предполагаю, что мне не следует вызывать .SeriesCollection прямо под .Activechart. Какие-либо предложения? На данный момент я был бы просто счастлив иметь возможность изменить цвет фона диаграммы на белый и повернуть метки оси X на 45 градусов.

Заранее спасибо.


person vicjun    schedule 17.07.2013    source источник
comment
Этот VBA выглядит довольно близко к VBScript ... вы пробовали: с objExcel.ActiveChart «весь ваш код vba здесь» заканчивается?   -  person Papasmile    schedule 17.07.2013
comment
Если вы используете VBScript, вы не можете использовать такие константы, как xlCategory: Excel VBA знает их значения, но они недоступны в VBScript. Вы можете найти числовые значения в обозревателе объектов (F2 в VBEditor).   -  person Tim Williams    schedule 17.07.2013
comment
... или просто введите ?xlCategory и нажмите Enter в окне Immediate.   -  person Jon Peltier    schedule 20.08.2015


Ответы (3)


Порядок имеет значение. Прежде чем вы сможете получить доступ к серии, вы должны сначала добавить ее. То же самое касается и других свойств, таких как HasTitle. Кроме того, линии диаграммы XY не имеют внутреннего цвета, который доступен только в диаграммах, отображающих внутреннюю часть (например, круговых диаграммах или столбчатых диаграммах). Вы, вероятно, имеете в виду цвет границы здесь. Измените свой код на это:

Set objChart = objExcel.Charts.Add
With objChart
  ' define chart type
  .ChartType = xlXYScatterLinesNoMarkers

  ' define data
  .SetSourceData objWorksheet.Range("E1:F200"), xlColumns

  ' format chart
  .SeriesCollection(1).Border.Color = RGB(255, 0, 0)
  .PlotArea.Interior.Color = RGB(255, 255, 255)
  '.PlotArea.Interior.ColorIndex = 2  'alternative
  .HasTitle = True
  .ChartTitle.Text = "usage"
  .Axes(xlCategory, xlPrimary).HasTitle = True
  .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Time"
  .Axes(xlValue, xlPrimary).HasTitle = True
  .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "units"
  .HasLegend = False
End With

и это должно работать, если вы определили символические константы.

person Ansgar Wiechers    schedule 17.07.2013
comment
Большое спасибо, теперь работает изменение цвета линий. Но я бы хотел, чтобы цвет фона в графиках был белым, а не линия. Я также хочу наклонить метки оси X под углом 45 градусов. - person vicjun; 18.07.2013
comment
Цвет фона диаграммы можно изменить с помощью .ChartArea.Color, цвет фона графика можно изменить с помощью .PlotArea.Color. Вы также можете использовать .ColorIndex вместо .Color, чтобы назначить индексированный цвет (например, 2 для белого). - person Ansgar Wiechers; 18.07.2013
comment
Однако я получаю сообщение об ошибке: Объект не поддерживает это свойство или метод: 'PlotArea.Color' . Я помню, как раньше экспериментировал с этим методом, получая аналогичные результаты... Должен ли я сначала объявить что-то еще? Спасибо. - person vicjun; 18.07.2013
comment
Виноват. Это .PlotArea.Interior.Color, а не .PlotArea.Color. - person Ansgar Wiechers; 19.07.2013

Есть две вещи:

  1. установка области построения на определенный цвет

см. пример

'set plotting area to dark gray color
ActiveChart.PlotArea.Select
With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorBackground1
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = -0.5
    .Solid
End With

разум .ForeColor.ObjectThemeColor = msoThemeColorBackground1

  1. Задание определенного цвета общей области диаграммы (я имею в виду всю область диаграммы, кроме области построения)

    'установить серый цвет области диаграммы с помощью ActiveSheet.Shapes("NameChart").Fill .Visible = msoTrue .ForeColor.ObjectThemeColor = msoThemeColorBackground1 .ForeColor.TintAndShade = 0 .ForeColor.Brightness = -0.5 .Solid End With

Если имя диаграммы было установлено как «NameChart» ранее в коде VBA, при создании диаграммы

  'set the name of the Chart to "Cooper" to reference it later
ActiveChart.Parent.Name = "NameChart"

разум .ForeColor.ObjectThemeColor = msoThemeColorBackground1

Если мой ответ вам чем-то помог, пожалуйста, оцените его. Спасибо.

person George    schedule 07.03.2016

Единственные способы, которые я знаю, это использование VBScript или Python. Ниже приведен VBScript, который может вам помочь. Вам понадобится оператор if, чтобы сделать дату красной или нет.

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

В комментариях есть ссылка на каталог цветов.

Сохранить как ExcelDB.vbs

' Validate Variables.
Dim fso, strUserName , oShell

' Create an instance of the Scripting Shell
Set oShell = CreateObject( "WScript.Shell" )

' Get the Username from The Shell enviroment
strUserName = oShell.ExpandEnvironmentStrings( "%USERNAME%" )

' Create a File System Object named "fso".
Set fso = CreateObject("Scripting.FileSystemObject")

' Create Instance of Excel Object
Set objExcel = CreateObject("Excel.Application")

' Hide Alert messages
objExcel.DisplayAlerts = False

' Make Excel File Visible/Hidden (True=Visible , False = Hidden)
objExcel.Visible = True 

' Create a Workbook with 3 sheets named Retired, Styles and Patts
Set objWorkbook = objExcel.Workbooks.Add
objExcel.Activeworkbook.Sheets(1).Name = "Retired"
objExcel.Activeworkbook.Sheets(2).Name = "Styles"
objExcel.Activeworkbook.Sheets(3).Name = "Patts"

' Freeze header row (The first row will remain during sorting)

With objExcel.ActiveWindow
     .SplitColumn = 0
     .SplitRow = 1
End With
objExcel.ActiveWindow.FreezePanes = True


' Define Names for lookup tables.
objExcel.ActiveWorkbook.Names.Add "patterns", "=patts!$A$1:$b$150"
objExcel.ActiveWorkbook.Names.Add "styles", "=Styles!$A$1:$H$100"
objExcel.ActiveWorkbook.Names.Add "widths", "=Styles!$B$2:$B$101"

'Define Values for Cells

objExcel.Cells(1,1).Interior.ColorIndex = 3
objExcel.Cells(1,1).Value = "Red Background"                'Cell A1 Value
objExcel.Cells(2,1).Value = "GreenBorder"                   'Cell A2 Value
objExcel.Cells(2,2).Value = "1"
objExcel.Cells(2,3).Value = "1"
objExcel.Cells(2,4).Value = "1"
objExcel.Cells(2,5).Value = "12"
objExcel.Cells(2,6).Value = "12"
'Format Retired Cells

objExcel.Sheets("Retired").Cells(7, 2).Numberformat = "@"
objExcel.Worksheets("Retired").Cells(2,1).Borders.Color = RGB(0,255,0)
objExcel.Worksheets("Retired").Columns("A:A").Columnwidth = 20
objExcel.Worksheets("Retired").Columns("B:C").Columnwidth = 5
objExcel.Worksheets("Retired").Columns("D:D").Columnwidth = 15
objExcel.Worksheets("Retired").Columns("E:E").Columnwidth = 5
objExcel.Worksheets("Retired").Columns("F:H").columnwidth = 15
objExcel.Worksheets("Retired").Columns("I:I").Columnwidth = 5
objExcel.Worksheets("Retired").Columns("B").NumberFormat = "000"
objExcel.Worksheets("Retired").Columns("C").NumberFormat = "00"

'get a cell value and set it to a variable
row2Cell2 = objExcel.Cells(2,2).Value

'save the new excel file (make sure to change the location) 'xls for 2003 or earlier
objWorkbook.SaveAs "C:\Users\"&strUserName&"\Desktop\CreateExcel.xlsx" 

'close the workbook
'objWorkbook.Close 

'exit the excel program
'objExcel.Quit

В следующей строке показано, как вы меняете цвет ячейки Excel, где ячейка (1,1) = ячейка A1.

objExcel.Cells(1,1).Interior.ColorIndex = 3
person Michael Mulvey    schedule 26.11.2019
comment
docs.microsoft.com/en-us/office/vba/ API/excel.colorindex - person Michael Mulvey; 26.11.2019
comment
ablebits.com/office-addins-blog/2013/10/18/ - person Michael Mulvey; 26.11.2019