EXCEL VBA: Как программно изменить свойство .Place диаграммы по имени - PullRequest
1 голос
/ 08 января 2020

У меня есть следующий код, где я пытаюсь изменить свойство .Placement диаграммы, озаглавленной «MyChart».

enter image description here

выделенная строка приводит к ошибке, в которой говорится: «Элемент с указанным именем не найден».

Как видно из рисунка, я также попытался:

MyChart.Placement = xlFreeFloating

Однако, насколько я понимаю что .Placement является свойством ChartObject, а не самой Chart.

Вот код из pi c выше:

 'Format Main Title
  MyChart.ChartTitle.Font.Size = 14
  MyChart.ChartTitle.Font.Bold = True
  MyChart.ChartTitle.Font.Name = "TimesNewRoman"

  'Set FreeFloating Property
  ActiveSheet.ChartObjects("MyChart").Placement = xlFreeFloating

  'MyChart.Placement = xlFreeFloating

Как я могу изменить свойство .Placement для MyChart (то есть, как я могу изменить свойство .Placement для определенной диаграммы по имени)? Любая помощь приветствуется.

====================================== ==========================================

В ответ на предлагаемое решение: Когда Я пытаюсь этот код, я получаю это сообщение об ошибке:

enter image description here

enter image description here

Не знаю Я не понимаю, как имя графика может быть чем угодно, кроме «MyChart». Вот код, который создает этот график:

Set MyChart = ActiveSheet.ChartObjects.Add(Left:=Cells(Row0 + (j3 - 1) * 22, Col0 + ChartStart + 1 + (k3 - 1) * 7).Left, _
                        Top:=Cells(Row0 + (j3 - 1) * 22, Col0 + ChartStart + 1 + (k3 - 1) * 7).Top, _
                        Width:=310, _
                        Height:=300).Chart

                    MyChart.ChartType = xlXYScatter
                    MyChart.HasLegend = False

                    With MyChart
                        'XAxis Label
                        .Axes(xlCategory, xlPrimary).HasTitle = True
                        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = XName(i3, 1)
                        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Font.Bold = True
                        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Font.Name = "TimesNewRoman"
                        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Font.Size = 10
                        'YAxis Label
                        .Axes(xlValue, xlPrimary).HasTitle = True
                        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = YName
                        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Font.Bold = True
                        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Font.Name = "TimesNewRoman"
                        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Font.Size = 10
                    End With

                    'Remove Gridlines
                    For Each axs In MyChart.Axes
                        axs.HasMajorGridlines = False
                        axs.HasMinorGridlines = False
                    Next

                    With MyChart.SeriesCollection.NewSeries
                        .Name = "Scatterplot of " & YName & " by " & XName(i3, 1)
                        .Values = y5
                        .XValues = WorksheetFunction.Index(X4, 0, i3 + 1)
                        'Format Markers
                        .MarkerBackgroundColorIndex = 2
                        .MarkerForegroundColorIndex = 5
                        .MarkerStyle = 8
                    End With

                    '5% around the edges
                    'XXX 999

                    'Vertical Axes NOT at zeros

                    If WorksheetFunction.Min(WorksheetFunction.Index(X4, 0, i3 + 1)) < 0 Then
                        MyChart.Axes(xlCategory).CrossesAt = MyChart.Axes(xlCategory, xlPrimary).MinimumScale
                    End If

                    'Format Main Title
                    MyChart.ChartTitle.Font.Size = 14
                    MyChart.ChartTitle.Font.Bold = True
                    MyChart.ChartTitle.Font.Name = "TimesNewRoman"

                    'Set FreeFloating Property
                    ActiveSheet.ChartObjects("MyChart").Placement = Excel.XlPlacement.xlFreeFloating

                    'MyChart.Placement = xlFreeFloating


                    'Set FreeFloating Property
'                    ActiveChart.Select
'                    Selection.Placement = xlFreeFloating

Ответы [ 2 ]

1 голос
/ 08 января 2020
 'Format Main Title
  MyChart.ChartTitle.Font.Size = 14
  MyChart.ChartTitle.Font.Bold = True
  MyChart.ChartTitle.Font.Name = "TimesNewRoman"

  'Set FreeFloating Property
  ActiveSheet.ChartObjects(MyChart.name).Placement = Excel.XlPlacement.xlFreeFloating

  'In mine this is running too
  'ActiveSheet.ChartObjects(MyChart.name).Placement = xlFreeFloating

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

enter image description here

Первый метод, сравнить mychart. имя с ActiveSheet.ChartObjects.chart.Name и использовать ActiveSheet.ChartObjects

For Each thechart In ActiveSheet.ChartObjects
    If thechart.Chart.Name = myChart.Name Then
       myChartName = thechart.Name

       thechart.Placement = Excel.XlPlacement.xlFreeFloating

       Exit For
    End If
Next

Второй метод, использовать myChart.parent

  myChart.Parent.Placement = Excel.XlPlacement.xlFreeFloating
0 голосов
/ 09 января 2020

Это код, который я разработал с помощью user11982 ...

MyChart.Name возвращает имя листа и имя диаграммы:

MyChart.Name = Sheet 1 Chart 2

Поскольку я просто хочу диаграмму имя:

            txtary = Split(MyChart.Name, " ")
            ChartName = txtary(2) & " " & txtary(3)

            'Set FreeFloating Property
            ActiveSheet.ChartObjects(ChartName).Placement = Excel.XlPlacement.xlFreeFloating
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...