Комбинированная диаграмма Excel VBA для определения области и маркеров линии на основе динамического выбора - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь выполнить комбо-диаграмму с областью и маркерами линии. Поскольку это динамическая диаграмма. Но если пользователь поменяет местами Население и метрику между строками, он не будет работать так, как хотелось бы. Я хочу, чтобы население всегда было областью, а метрика - маркерами линий. Также население должно быть вторичной осью.

sub test() 
Dim myString As String
myString = Selection.Address
ActiveSheet.Shapes.addchart2(201, xlColumnClustered).Select

ActiveChart.SetSourceData Source:=Range(myString)
ActiveChart.FullSeriesCollection(1).ChartType = xlColumnClustered
ActiveChart.FullSeriesCollection(1).AxisGroup = 1
ActiveChart.FullSeriesCollection(2).ChartType = xlLineMarkers
ActiveChart.FullSeriesCollection(2).AxisGroup = 1
ActiveChart.FullSeriesCollection(1).ChartType = xlLineMarkers
ActiveChart.FullSeriesCollection(2).ChartType = xlArea
ActiveChart.FullSeriesCollection(2).AxisGroup = 2
End sub

Мой набор данных такой

  STATISTIC SEP-10 OCT-10 NOV-10 DEC-10 JAN-10 FEB-10 MAR-10
  METRIC    0       0      111.1   55.1  0      0      0
  Population 7      1      18      36    98     1      1

Здесь мой код работает так, как требуется, но если строки метрики и совокупности меняются местами, тогда метрика используется в качестве диаграммы области, а совокупность - в качестве линейного графика. Можно ли сделать так, чтобы он проверял, какая строка содержит POP (должен быть без учета регистра), чтобы быть графом области и вторичной осью, а другая - маркером линии.

Предлагаемый ответ для приведенного ниже (код от AU) enter image description here

1 Ответ

0 голосов
/ 01 ноября 2018

Далее отредактировал мой ответ. все еще работает в Excel 2007, пожалуйста, измените его в соответствии с вашими требованиями.

Sub test()
Dim myString As String
myString = Selection.Address

Dim Rng, RngX, RngMet, RngPop As Range, popRow, MetRow As Long

With ActiveSheet
Set Rng = .Range(myString)
Set RngX = .Range(Rng.Cells(1, 2), Rng.Cells(1, Rng.Columns.Count))
MetRow = 2
popRow = 3
    If InStr(1, UCase(Rng.Cells(2, 1).Value), "POP") > 0 Then
    MetRow = 3
    popRow = 2
    End If

Set RngPop = .Range(Rng.Cells(popRow, 2), Rng.Cells(popRow, Rng.Columns.Count))
Set RngMet = .Range(Rng.Cells(MetRow, 2), Rng.Cells(MetRow, Rng.Columns.Count))

.Shapes.AddChart(201, xlColumnClustered).Select

'ActiveChart.SetSourceData Source:=Range(myString)
'ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(1).Values = RngMet
'ActiveChart.SeriesCollection(1).ChartType = xlColumnClustered
ActiveChart.SeriesCollection(1).AxisGroup = 1
ActiveChart.SeriesCollection(1).ChartType = xlLineMarkers
ActiveChart.SeriesCollection(1).Name = Rng.Cells(MetRow, 1).Value

'ActiveChart.SeriesCollection.NewSeries
ActiveChart.SeriesCollection(2).Values = RngPop
ActiveChart.SeriesCollection(2).ChartType = xlLineMarkers
ActiveChart.SeriesCollection(2).ChartType = xlArea
ActiveChart.SeriesCollection(2).AxisGroup = 2
ActiveChart.SeriesCollection(2).Name = Rng.Cells(popRow, 1).Value
ActiveChart.SeriesCollection(1).XValues = RngX

ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = 2
ActiveChart.Axes(xlCategory, xlPrimary).TickLabels.NumberFormat = "MMM-yy"
ActiveChart.Axes(xlCategory, xlPrimary).HasTitle = True
ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = Rng.Cells(1, 1).Value
End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...