Próbuję użyć programu Excel VBA do skopiowania niektórych wykresów do slajdów Powerpoint przy użyciu poniższych kodów, ale wyświetla błąd „Błąd automatyzacji katastrofalny błąd”. Nie mogę ustalić, na czym polega problem. Zastanawiam się, czy rozmiar pliku programu Excel jest zbyt duży. jak mogę rozwiązać problem?
Sub ExcelToPres()
Dim PPT As Object
Set PPT = CreateObject("PowerPoint.Application")
PPT.Visible = True
PPT.Presentations.Open Filename:="C:\test\test.pptx"
copy_chart "Sheet1", 2 ' Name of the sheet to copy graph and slide number the graph is to be pasted in
PPT.Save
PPT.Close
End Sub
Public Function copy_chart(sheet, slide)
Dim PPApp As Object
Dim PPPres As Object
Dim PPSlide As Object
Set PPApp = CreateObject("Powerpoint.Application")
Set PPApp = GetObject(, "Powerpoint.Application")
Set PPPres = PPApp.ActivePresentation
'PPApp.ActiveWindow.ViewType = ppViewSlide
PPApp.ActiveWindow.View.GotoSlide (slide)
Worksheets("Sheet1").Activate
ActiveSheet.ChartObjects("Chart 13").Chart.CopyPicture _ ****
Appearance:=xlScreen, Size:=xlScreen, Format:=xlPicture
'PPApp.ActiveWindow.View.GotoSlide PPSlide.SlideIndex
Set PPSlide = PPPres.Slides(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex)
With PPSlide
' paste and select the chart picture
.Shapes.Paste.Select
' align the chart
PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, True
End With
' Clean up
Set PPSlide = Nothing
Set PPPres = Nothing
Set PPApp = Nothing
End Function
Odpowiedzi:
Jedna lub druga z twoich procedur powinna wywoływać PPT i uzyskiwać obiekt PPT do pracy, a nie oba.
Jedną rzeczą, od której od razu jestem podejrzliwy, jest to, że procedura czyszczenia w copy_chart zamyka obiekt aplikacji PPT, więc gdy kontrola powraca do podprogramu wywołującego, obiekt jest zerowy. Jeśli błąd wystąpi w wierszu „PPT.Save”, włożę na niego pieniądze. ;-)
W każdym razie w opublikowanym kodzie są inne rzeczy, które są złą praktyką. Nigdy nie wybieraj niczego w PPT, chyba że jest to konieczne, na przykład. Zamiast tego użyj odwołań do obiektów. Zrobiłem mnóstwo modyfikacji do twojego przykładowego kodu, ale nie przetestowałem go tutaj; weź to za to, co jest warte, ale spróbuj.
źródło