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

Итак, у меня есть код, который использует созданный график (графики с 1 по 3) и у меня также есть код, чтобы очистить все, чтобы я мог снова запустить анализ.

Дело в том, что если я все очистлю и попытаюсь запустить, следующие 3 созданные диаграммы будут названы с 4 по 6, если я не сохраню закрытие и снова не открою Excel.

Есть ли способ, что после удаления диаграмм следующая, созданная в этой таблице, будет снова именоваться с 1 по 3?

Код здесь:

Private Sub Run_Click()

   Application.Run "ATPVBAEN.XLAM!Regress", ActiveSheet.Range(Cells(19, 5), Cells(19 + Cells(16, 4).Value, 5)), _
        ActiveSheet.Range(Cells(19, 2), Cells(19 + Cells(16, 4).Value, 2)), False, True, 95, ThisWorkbook.Worksheets("Resultados1").Range("$A$9"),  _
        True, True, True, True, , True
    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveSheet.Shapes("Chart 1").IncrementLeft -228.75
    ActiveSheet.Shapes("Chart 1").IncrementTop 268.5
End Sub

Ответы [ 3 ]

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

Вот как Excel называет свои формы. Он сохраняет текущий счетчик и использует следующее значение индекса для следующей фигуры. Счетчик сбрасывается при работе на другом листе. (Есть также счетчик листов и счетчик книг).

Но первая диаграмма, которую вы добавляете после удаления всех других диаграмм, - это все еще ChartObjects (1), будь то "Диаграмма 1", "Диаграмма 4" или "Диаграмма 54321". Так что настройте свой код:

Private Sub Run_Click()

    Application.Run "ATPVBAEN.XLAM!Regress", ActiveSheet.Range(Cells(19, 5), Cells(19 + Cells(16, 4).Value, 5)), _
        ActiveSheet.Range(Cells(19, 2), Cells(19 + Cells(16, 4).Value, 2)), False, True, 95, ThisWorkbook.Worksheets("Resultados1").Range("$A$9"),  _
        True, True, True, True, , True
    ActiveSheet.ChartObjects(1).Activate
    ActiveSheet.Shapes(1).IncrementLeft -228.75
    ActiveSheet.Shapes(1).IncrementTop 268.5
End Sub
0 голосов
/ 03 ноября 2018

Спасибо большое, ребята.

Это решение, которое я придумал, сработало для меня:

Private Sub RegN_Click()

Application.ScreenUpdating = False

 Application.Run "ATPVBAEN.XLAM!Regress", ActiveSheet.Range(Cells(19, 5), Cells(19 + Cells(16, 4).Value, 5)), _
    ActiveSheet.Range(Cells(19, 2), Cells(19 + Cells(16, 4).Value, 2)), False, True, 95, ThisWorkbook.Worksheets("Resultados1").Range("$A$9" _
    ), True, True, True, True, , True

    For i = 1 To ActiveSheet.ChartObjects.Count
        ActiveSheet.ChartObjects(i).Name = "Chart " & i
    Next i

    ActiveSheet.ChartObjects("Chart 1").Activate
    ActiveSheet.Shapes("Chart 1").IncrementLeft -228.75
    ActiveSheet.Shapes("Chart 1").IncrementTop 268.5
    ActiveSheet.ChartObjects("Chart 3").Activate
    ActiveSheet.Shapes("Chart 3").IncrementLeft -445.5
    ActiveSheet.Shapes("Chart 3").IncrementTop 363
    ActiveSheet.ChartObjects("Chart 2").Activate
    ActiveSheet.Shapes("Chart 2").IncrementLeft -1096.5909448819
    ActiveSheet.Shapes("Chart 2").IncrementTop 550
    ActiveSheet.ChartObjects("Chart 2").Activate

Поскольку у меня установлена ​​кнопка «Удалить все» для использования перед повторным запуском анализатора, теперь мне не нужно закрывать и заново открывать программу.

Greets.

0 голосов
/ 29 октября 2018

Этот фрагмент кода создаст две диаграммы с именем My_Chart .

Добавляет ChartObject , который является контейнером для диаграммы, встроенной в рабочий лист, перед добавлением фактического объекта Chart в контейнер.

ChartObject назван и удален перед повторным созданием в другом месте.
Я добавил Debug.Assert False, поэтому код останавливается перед удалением первого графика.

Sub BuildTwoCharts()

    Dim oCht As ChartObject
    Dim wrkSht As Worksheet

    Set wrkSht = ThisWorkbook.Worksheets("Sheet1")

    'Create 1st chart.
    ''''''''''''''''''''''
    Set oCht = wrkSht.ChartObjects.Add _
        (Left:=50, Top:=80, Width:=200, Height:=100)

    With oCht
        .Name = "My_Chart" 'Name it here.
        With .Chart
            .SetSourceData Source:=Range("A1:D4")
        End With

        'Pause code, then delete the chart when you tell it to carry on.
        Debug.Assert False 'Press F5 to continue.
        .Delete
    End With


    'Create 2nd chart.
    '''''''''''''''''''''''''''''''
    With wrkSht
        Set oCht = .ChartObjects.Add _
            (Left:=.Range("H2").Left, Top:=.Range("H2").Top, _
             Width:=.Range("H2:L2").Width, Height:=.Range("H2:H10").Height)
    End With

    With oCht
        .Name = "My_Chart" 'Name it here.
        With .Chart
            .SetSourceData Source:=Range("A1:D4")
        End With
    End With

End Sub
...