Обновлять диаграмму PowerPoint, не открывая книгу диаграмм и не делая ее невидимой - PullRequest
0 голосов
/ 11 июня 2018
Sub OO()
Dim oPPApp As Object, oPPPrsn As Object, oPPSlide As Object
Dim oPPShape As Object
Dim FlName As String

'~~> Change this to the relevant file
FlName = "C:\Users\lich_\Documents\test.pptx"


'~~> Establish an PowerPoint application object
On Error Resume Next
Set oPPApp = GetObject(, "PowerPoint.Application")

If Err.Number <> 0 Then
    Set oPPApp = CreateObject("PowerPoint.Application")
End If
Err.Clear
On Error GoTo 0

oPPApp.Visible = True
Set oPPPrsn = oPPApp.Presentations.Open(FlName, WithWindow:=msoFalse) 
Set oPPSlide = oPPPrsn.Slides(2)

With oPPSlide.Shapes("Chart1").Chart.ChartData
.ActivateChartDataWindow

.Workbook.Worksheets("Sheet1").Range("B2").Value = 0.1231
.Workbook.Close
End With



End Sub

Как вы можете видеть выше, я пытаюсь редактировать данные диаграммы в vba.

Но так как у меня есть контроль над многими диаграммами позже, я хотел бы сделать книгу невидимой (или нет).откройте его вообще, если это возможно)

With oPPSlide.Shapes("Chart1").Chart.ChartData
.ActivateChartDataWindow

.Workbook.Worksheets("Sheet1").Range("B2").Value = 0.1231
.Workbook.Close
End With

В этом коде я открыл методом «ActivateChartDataWindow» и изменил данные, которые я хочу и закрыл.

Есть ли способ сделать окноневидимы или редактировать данные даже не открывая?

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Возможно обновить существующие данные диаграммы без Activate согласно ответу @ mooseman.

Однако, если диаграмма новая / вставлена ​​во время выполнения, насколько я знаю, это невозможно сделать с помощью взаимодействия, так как метод AddChart добавляет диаграмму и одновременно создает / активирует книгу Excel.Хотя вам может не понадобиться вызывать метод Activate, нет способа вставить или добавить новую диаграмму, которая не требует открытия экземпляра Excel.Обойти это невозможно, это только то, как функционирует пользовательский интерфейс.

Обновление данных в EXISTING Chart / ChartData

Ниже собственного PowerPoint VBA, нодолжен легко переноситься в Excel с соответствующими ссылками

Sub test()
    Dim PPT As PowerPoint.Application
    Dim pres As Presentation
    Dim sld As Slide
    Dim shp As Shape
    Dim cht As Chart
    Dim rng As Object ' Excel.Range

    Set PPT = Application 'GetObject(,"PowerPoint.Application")
    Set pres = ActivePresentation
    Set sld = pres.Slides(1)
    Set shp = sld.Shapes(1)
    Set cht = shp.Chart

    Call changeData(cht, 6.3)

    pres.Slides.AddSlide pres.Slides.Count + 1, sld.CustomLayout
    Set sld = pres.Slides(pres.Slides.Count)
    sld.Shapes.AddChart().Chart.ChartData.Workbook.Application.WindowState = -4140

    Set cht = sld.Shapes(1).Chart
    Call changeData(cht, 3.9)

End Sub

Sub changeData(c As Chart, v As Double)
    Dim rng As Object
    With c.ChartData
        Set rng = .Workbook.Worksheets(1).ListObjects(1).Range
        rng.Cells(2, 2).Value = v ' etc.
        .Workbook.Close
    End With
End Sub

Требуется использовать блок With в VBA.

Некоторые краткие тесты предполагают, что это также можно выполнить через Interop изPython, используя win32com:

from win32com import client
ppt = client.Dispatch("PowerPoint.Application")
pres = ppt.ActivePresentation
sld = pres.Slides[0]
cht = sld.Shapes[0].Chart
cht.ChartData.Workbook.Worksheets[0].ListObjects[0].Range.Cells(2,2).Value = 9

А также в C #:

    using Microsoft.Office.Interop.PowerPoint;

    public static void foo(int value = 10)
    {

        Application ppt = new Microsoft.Office.Interop.PowerPoint.Application();
        Presentation pres = ppt.ActivePresentation;
        Slide sld = pres.Slides[1];
        Chart cht = sld.Shapes[1].Chart;
        {
            cht.ChartData
                .Workbook.Worksheets[1].ListObjects[1].Range.Cells(2, 2).Value = value;

        }
    }

Чтобы свернуть окно ChartData / Workbook:

На практике яУ меня не было надежной удачи при использовании метода With.Если вы не можете заставить его работать, то следующий лучший вариант - немедленно свернуть окно:

Sub changeData(c As Chart, v As Double)
    Dim rng As Object
    With c.ChartData
        .Activate
        .Workbook.Application.WindowState = -4140 '## Minimize Excel
        '## DO STUFF:
        Set rng = .Workbook.Worksheets(1).ListObjects(1).Range
        rng.Cells(2, 2).Value = v ' etc.
        .Workbook.Close
    End With
End Sub

Обратите внимание, что этот метод кратко мигает Excel на экране, и это отстой , потому что в этот короткий момент он может перехватывать нажатия клавиш / и т. Д.

0 голосов
/ 11 июня 2018

Вам не нужно активировать лист данных диаграммы для внесения в него изменений.

 With oPPSlide.Shapes("Chart1").Chart.ChartData
 'this updates the value in the datasheet
    .Workbook.Sheets(1).Range("B2").Value = 0.1231 
End with

Вы также можете установить лист данных диаграммы в соответствии с диапазоном в листе Excel

path2 = "C:\JohnDoe\Vasquez_061118.xlsm"
Set xlWorkBook = Workbooks.Open(FileName:=path2, ReadOnly:=True)
     With oPPSlide.Shapes("Chart1").Chart.ChartData
     'this updates the value in the datasheet
.Workbook.Sheets(1).Range("A1:B2").Value = xlWorkBook.Sheets(1).Range("A2:B3").Value
   End With
...