Điều khiển PowerPoint với VBA từ Excel

Tại sao phải làm như vậy?

Tôi nhận được rất nhiều câu hỏi về cách ra lệnh cho các chương trình khác bằng VBA thông qua Excel. Trong bài viết này, chúng ta sẽ bàn về cách sao chép một dải ô xác định rồi dán nó vào bài thuyết trình PowerPoint. Có vẻ như nhiệm vụ này sẽ hiệu quả hơn khi thực hiện một cách thủ công. Tuy nhiên, bạn cần tổng hợp một bài thuyết trình có hơn 50 hình ảnh từ Excel, nên việc nhờ VBA macro thực hiện các nhiệm vụ khó khăn thì sẽ nhanh hơn rất nhiều! Hãy để tôi cho bạn thấy mã VBA rồi tôi sẽ đánh dấu một vài trong số các phần chính – những phần quan trọng.

Sub ExcelRangeToPowerPoint()
Dim rng As Range
Dim PowerPointApp As Object
Dim myPresentation As Object
Dim mySlide As Object
Dim myShape As Object’Copy Range from Excel
Set rng = ThisWorkbook.ActiveSheet.Range(“A1:C12″)

‘Create an Instance of PowerPoint
On Error Resume Next

‘Is PowerPoint already opened?
Set PowerPointApp = GetObject(class:=”PowerPoint.Application”)

‘Clear the error between errors
Err.Clear

‘If PowerPoint is not already open then open PowerPoint
If PowerPointApp Is Nothing Then Set PowerPointApp = CreateObject(class:=”PowerPoint.Application”)

‘Handle if the PowerPoint Application is not found
If Err.Number = 429 Then
MsgBox “PowerPoint could not be found, aborting.”
Exit Sub
End If

On Error GoTo 0

‘Optimize Code
Application.ScreenUpdating = False

‘Create a New Presentation
Set myPresentation = PowerPointApp.Presentations.Add

‘Add a slide to the Presentation
Set mySlide = myPresentation.Slides.Add(1, 11) ’11 = ppLayoutTitleOnly

‘Copy Excel Range
rng.Copy

‘Paste to PowerPoint and position
mySlide.Shapes.PasteSpecial DataType:=2  ‘2 = ppPasteEnhancedMetafile
Set myShape = mySlide.Shapes(mySlide.Shapes.Count)

‘Set position:
myShape.Left = 66
myShape.Top = 152

‘Make PowerPoint Visible and Active
PowerPointApp.Visible = True
PowerPointApp.Activate

‘Clear The Clipboard
Application.CutCopyMode = False

End Sub

 

Việc dạy Excel ngôn ngữ của PowerPoint

Để điều khiển PowerPoint từ bên trong Visual Basic Editor của Excel, chúng ta cần phải dạy Excel cách đọc các thuật ngữ của PowerPoint. PowerPoint sử dụng bộ từ vựng gồm có “Trang trình chiếu” và “Bài thuyết trình” – những từ này không tồn tại trong ngôn ngữ được mã hóa của Excel. Để khởi động thư viện các đối tượng của PowerPoint, bạn chỉ cần nhấp Tools trong Visual Basic Editor rồi chọn Reference. Rồi hãy chắc rằng tham chiếu Microsoft Office PowerPoint 12.0 Object Library được đánh dấu (phiên bản có thể khác nhau, ví dụ trong Office 2016, tham chiếu có thể là Office PowerPoint 16.0 Object Library). Trong hình ảnh dưới đây, tôi sẽ cho bạn thấy cách làm điều này một cách chính xác và chắc chắn là sau đó Excel sẽ biết ngôn ngữ của PowerPoint!

CẬP NHẬT: Tôi vừa cập nhật mã trong bài viết này nên bạn không cần phải thực hiện bước này, tuy nhiên tính năng itellisense dành cho bất kỳ đối tượng nào của PowerPoint trong Visual Basic Editor sẽ không chạy. Đây sẽ không phải là vấn đề quan trọng trừ khi bạn cần hướng lập trình cho việc thêm sự tự động hóa bổ sung trong PowerPoint vào VBA macro của bạn.

Mở PowerPoint từ bên trong Excel

Bây giờ chúng ta đã dạy PowerPoint cách giao tiếp với Excel, hãy xem xét cách chúng ta có thể hoàn thành việc dán dải ô vào một trang trình chiếu hoàn toàn mới. Gần khúc đầu của mã có một phần trông như thế này:

‘Create an Instance of PowerPoint
On Error Resume Next’Is PowerPoint already opened?
Set PowerPointApp = GetObject(class:=”PowerPoint.Application”)’Clear the error between errors
Err.Clear

‘If PowerPoint is not already open then open PowerPoint
If PowerPointApp Is Nothing Then Set PowerPointApp = CreateObject(class:=”PowerPoint.Application”)

‘Handle if the PowerPoint Application is not found
If Err.Number = 429 Then
MsgBox “PowerPoint could not be found, aborting.”
Exit Sub
End If

On Error GoTo 0

Trong phần này của mã, chúng ta đang xác định liệu Microsoft PowerPoint có đang mở hay không. Nếu PowerPoint đã mở sẵn rồi, thì chúng ta có thể tạo một biến tương đương với toàn bộ chương trình bằng cách sử dụng GetObject. Nếu PowerPoint không chạy, chúng ta có thể sử dụng CreateObject để chạy một mô phỏng của  PowerPoint rồi tạo một biến tương đương với bản mô phỏng đó của PowerPoint.

Khi sử dụng CreateObject, ứng dụng cuối cùng sẽ bắt đầu chạy nhưng nó không hiển thị trên màn hình. Vì thế, chúng ta cần phải bật cài đặt Visible lên (bằng true). Đồng thời, VBA với PowerPoint sẽ khác một chút so với VBA với Excel trong việc nó độc lập hơn trên cửa sổ của nó – cửa sổ này được hiển thị trên màn hình. Vì thế, một lệnh thiết thực phải được viết để Activate PowerPoint.

‘Make PowerPoint Visible and Active
PowerPointApp.Visible = True
PowerPointApp.Activate

 

Điều khiển PowerPoint từ bên trong Excel

Bây giờ thì bạn có thể chắc chắn 100% rằng PowerPoint đang chạy, bạn có thể bắt đầu kiểm soát nó! Đầu tiên, hãy ra lệnh cho PowerPoint tạo ra một bài thuyết trình hoàn toàn mới rồi tạo ra một trang trình chiếu để bạn có thể dán dải ô của mình vào. Bên cạnh đó, rất quan trọng để tạo một biến trong mỗi giai đoạn thực hiện để nếu bạn có muốn tham chiếu bài thuyết trình hay một trang trình chiếu mới tạo, thì bạn chỉ cần thực hiện điều đó với biến tương ứng.

‘Create a New Presentation
Set myPresentation = PowerPointApp.Presentations.Add’Add a slide to the Presentation
Set mySlide = myPresentation.Slides.Add(1, 11) ’11 = ppLayoutTitleOnly

Sao chép từ Excel, dán vào trang trình chiếu

Bây giờ bạn đã có một bài thuyết trình mới và một trang trình chiếu mới, bạn có thể ra lệnh cho Excel dán dải ô của bạn vào PowerPoint. Gần phần đầu của mã, có một dòng cho phép bạn xác định cụ thể dải ô mà bạn muốn sao chép. Biến rng được sử dụng để ghi nhớ dải ô này và cho phép bạn tham chiếu dải ô vào lúc khác trong mã này.

Lưu ý: Thật là một ý tưởng hay khi đặt mã – mã này có thể cần phải được thay đổi một cách thủ công tại một thời điểm nào đó trong tương lai – gần phần đầu của đoạn chương trình con. Điều này ngăn bạn phải cuộn xuống mã của mình rồi chỉ ra chính xác nơi mà bạn đánh vần dải ô bạn muốn sao chép hay trang tính mà bạn muốn lấy dữ liệu. Điều này có thể giúp bạn tiết kiệm rất nhiều thời gian và không gây khó hiểu!

‘Copy Range from Excel
Set rng = ThisWorkbook.ActiveSheet.Range(“A1:D12”)’Copy Excel Range
rng.Copy’Paste to PowerPoint and position
Set mySlide = myPresentation.Slides.Add(1, 11) ’11 = ppLayoutTitleOnly
Set myShapeRange = mySlide.Shapes(mySlide.Shapes.Count)