2017-02-22 26 views
0

Я создаю макрос для создания диаграммы. Я записал макрос, пока я генерирующий образец диаграммы, но теперь мне нужно иметь макрос работает независимо от названия графика (Chart 9 в данном случае)Получить имя диаграммы с VBA

Sheets("statistics").Select 
Sheets("statistics").Range("A101:C106").Select 
ActiveSheet.Shapes.AddChart.Select 
ActiveChart.ChartType = xlColumnStacked 
ActiveChart.SetSourceData Source:=Range("statistics!$A$101:$C$106") 
ActiveChart.ChartArea.Select 
ActiveSheet.Shapes("Chart 9").Name = "waterfall" 
ActiveChart.Location Where:=xlLocationAsObject, Name:="summary" 
ActiveSheet.ChartObjects("waterfall").Activate 
ActiveSheet.Shapes("waterfall").IncrementLeft 80 
ActiveSheet.Shapes("waterfall").IncrementTop -2200 
ActiveSheet.ChartObjects("waterfall").Activate 
ActiveSheet.Shapes("waterfall").ScaleWidth 1.6025463692, msoFalse, msoScaleFromTopLeft 
ActiveSheet.Shapes("waterfall").ScaleHeight 1.6084106153, msoFalse, msoScaleFromTopLeft 
ActiveSheet.ChartObjects("waterfall").Activate 
ActiveChart.Legend.Select 
Selection.Delete 
ActiveSheet.ChartObjects("waterfall").Activate 
ActiveChart.SeriesCollection(1).Select 
Selection.Format.Fill.Visible = msoFalse 
ActiveChart.SeriesCollection(2).Select 
ActiveChart.SeriesCollection(2).Points(6).Select 
With Selection.Format.Fill 
    .Visible = msoTrue 
    .ForeColor.ObjectThemeColor = msoThemeColorAccent3 
    .ForeColor.TintAndShade = 0 
    .ForeColor.Brightness = 0 
    .Solid 
End With 
ActiveChart.SeriesCollection(2).Points(1).Select 
With Selection.Format.Fill 
    .Visible = msoTrue 
    .ForeColor.ObjectThemeColor = msoThemeColorAccent3 
    .ForeColor.TintAndShade = 0 
    .ForeColor.Brightness = 0 
    .Solid 
End With 
With Selection.Format.Fill 
    .Visible = msoTrue 
    .ForeColor.ObjectThemeColor = msoThemeColorAccent1 
    .ForeColor.TintAndShade = 0 
    .ForeColor.Brightness = 0 
    .Transparency = 0 
    .Solid 
End With 
ActiveChart.SeriesCollection(2).Points(5).Select 
With Selection.Format.Fill 
    .Visible = msoTrue 
    .ForeColor.ObjectThemeColor = msoThemeColorAccent1 
    .ForeColor.TintAndShade = 0 
    .ForeColor.Brightness = 0 
    .Solid 
End With 
With Selection.Format.Fill 
    .Visible = msoTrue 
    .ForeColor.RGB = RGB(255, 0, 0) 
    .Transparency = 0 
    .Solid 
End With 
ActiveChart.SetElement (msoElementDataLabelCenter) 
ActiveChart.SeriesCollection(2).Points(1).Select 
ActiveChart.ChartArea.Select 
ActiveChart.ChartArea.Select 
ActiveChart.SeriesCollection(2).Points(1).Select 
ActiveChart.PlotArea.Select 
ActiveChart.SeriesCollection(2).Select 
ActiveChart.SetElement (msoElementDataLabelCenter) 
ActiveChart.SetElement (msoElementPrimaryValueAxisTitleHorizontal) 
Selection.Caption = "hrs" 
ActiveChart.Axes(xlValue).AxisTitle.Select 
Selection.Left = 7 
Selection.Top = 13.028 

Я попытался

Sheets("statistics").Range("A101:C106").Select 
ActiveSheet.Shapes.AddChart.Select 
ActiveChart.ChartType = xlColumnStacked 
ActiveChart.SetSourceData Source:=Range("statistics!$A$101:$C$106") 
ActiveChart.ChartArea.Select 
Set ThisChart = ActiveChart 
ActiveSheet.Shapes(ThisChart).Name = "waterfall" 

, но он не работает

+0

Вы создаете только 1 диаграмму на листе или несколько диаграмм? –

+0

это зависит от пользователя. –

ответ

2

Попробуйте код, приведенный ниже, он будет перебрать в «Статистика» лист всех существующих ChartObjects, и если он находит ChartObject с именем «Диаграмма 9» будет переименовать его в «водопад ».

Примечание: вы можете использовать аналогичный подход для создания диаграммы, без необходимости использовать Select, ActiveSheet и ActiveChart.

Код

Option Explicit 

Sub RenameExistingChart() 

Dim ChtObj As ChartObject 

For Each ChtObj In Worksheets("statistics").ChartObjects 
    If ChtObj.Name = "Chart 9" Then 
     ChtObj.Name = "waterfall" 
    End If 
Next ChtObj 

End Sub 

Edit 1: создать диаграмму с ChtObj:

Set ChtObj = Worksheets("statistics").ChartObjects.Add(Left:=100, Top:=100, _ 
            Width:=100, Height:=100) ' <-- just default settings , modify later  
With ChtObj 
    .Chart.ChartType = xlColumnStacked 
    .Chart.SetSourceData Source:=range("statistics!$A$101:$C$106") 
    .Name = "waterfall" 

    With .Chart.SeriesCollection(2).Format.Fill ' modify fill for series (2) 
     .Visible = msoTrue 
     .ForeColor.ObjectThemeColor = msoThemeColorAccent3 
     .ForeColor.TintAndShade = 0 
     .ForeColor.Brightness = 0 
     .Solid 
    End With 

    .Chart.SeriesCollection(1).ApplyDataLabels ' add data lables to series (1) 

End With 
+0

Возможно, мой вопрос был не ясен. Я редактирую его для этой цели. –

+0

@ L.Dutch, что вы пытаетесь сделать? Наверное, я не понимал, чего вы пытаетесь достичь? –

+0

Я хочу, чтобы макрос работал на диаграмме, которую он создает, независимо от его имени. –

1

Вы могли бы использовать что-то вроде этого:

Sub ChartStuff() 
Dim cht As Shape 
Range("A101:A106").Select 
ActiveSheet.Shapes.AddChart.Select 
Set cht = ActiveSheet.Shapes(1) 
cht.Name = "waterfall" 
End Sub 

Надежда это он LPS!

+2

Что делать, если на листе больше одного графика? –

1

Работа с графиками в VBA немного сложна. При использовании Addchart, выбор будет ChartArea ChartArea является частью диаграммы, которая является частью ChartObject Наименования диаграммы вы видите, на самом деле название ChartObject

Вы можете сделать что-то вроде это:

Range("A101:A106").Select 
ActiveSheet.Shapes.AddChart.Select 

Dim ca As ChartArea, ch As Chart, co As ChartObject 
Set ca = Selection 
Set ch = ca.Parent 
ch.ChartType = xl3DColumn 
Set co = ch.Parent 
co.Name = "waterfall" 
Debug.Print ca.Name, ch.Name, co.Name 
+0

На самом деле очень легко получить ссылку на диаграмму: 'Set ch = ActiveSheet.Shapes.AddChart.Chart' – Rory

+0

Вы правы. Сложно предположить, что возвращаемое значение является «Chart», а Selection - «ChartArea» ... – FunThomas

Смежные вопросы