'
代码清单14.3: 在Excel中自动创建PowerPoint陈述
Sub
CreatePresentation()
Dim
ppt
As
PowerPoint.Application
Dim
pres
As
PowerPoint.Presentation
Dim
sSaveAs
As
String
Dim
ws
As
Worksheet
Dim
chrt
As
Chart
Dim
nSlide
As
Integer
On
Error
GoTo
ErrHandler
Set
ws
=
ThisWorkbook.Worksheets(
"
Reports
"
)
Set
ppt
=
New
PowerPoint.Application
Set
pres
=
ppt.Presentations.Add
pres.ApplyTemplate
=
"
C:\Program Files\Microsoft Office\Templates\Presentation Designs\Maple.gif
"
With
pres.Slides.AddSlide(
1
, ppLayoutTitle)
.Shapes(
1
).TextFrame.TextRange.Text
=
"
October Sales Analysis
"
.Shapes(
2
).TextFrame.TextRange.Text
=
"
11/5/2003
"
End
With
'
copy data
CopyDataRange pres, ws.Range(
"
Sales_Summary
"
),
2
,
2
CopyChart pres, ws.ChartObjects(
1
).Chart,
3
,
1
CopyDataRange pres, ws.Range(
"
Top_Five
"
),
4
,
2
'
save & close the presentation file
sSaveAs
=
GetSaveAsName(
"
Save As
"
)
If
sSaveAs
<>
"
False
"
Then
pres.SaveAs sSaveAs
End
If
pres.Close
ExitPoint:
Application.CutCopyMode
=
False
Set
chrt
=
Nothing
Set
ws
=
Nothing
Set
pres
=
Nothing
Set
ppt
=
Nothing
Exit Sub
ErrHandler:
MsgBox
"
sorry the following error has occurred:
"
&
vbCrLf
&
vbCrLf
&
Err.Description, vbOKOnly
Resume
ExitPoint
End Sub
Sub
CopyDataRange(pres
As
PowerPoint.Presentation, rg
As
Range, nSlide
As
Integer
, dScaleFactor
As
Double
)
'
copy range to clipboard
rg.Copy
'
add new blank slide
pres.Slides.AddSlide nSlide, ppLayoutBlank
'
paste the range to the slide
pres.Slides(nSlide).Shapes.PasteSpecial ppPasteOLEObject
'
scale the pasted object in powerPoint
pres.Slides(nSlide).Shapes(
1
).ScaleHeight dScaleFactor, msoTrue
pres.Slides(nSlide).Shapes(
1
).ScaleWidth dScaleFactor, msoTrue
'
center horizontally & vertically
'
might be a good idea to move this outside this procedure
'
so you have more control over whether this happens or not
CenterVertically pres.Slides(nSlide).Shapes(
1
)
CenterHorizontally pres.Slides(nSlide).Shapes(
1
)
End Sub
Sub
CopyChart(pres
As
PowerPoint.Presentation, chrt
As
Chart, nSlide
As
Integer
, dScaleFactor
As
Double
)
'
copy chart to clipboard as a picture
chrt.CopyPicture xlScreen
'
add slide
pres.Slides.AddSlide nSlide, ppLayoutBlank
'
copy chart to powerPoint
pres.Slides(nSlide).Shapes.PasteSpecial ppPasteDefault
'
scale picture
pres.Slides(nSlide).Shapes(
1
).ScaleHeight dScaleFactor, msoTrue
pres.Slides(nSlide).Shapes(
1
).ScaleWidth dScaleFactor, msoTrue
'
center horizontally & vertically
'
might be a good idea to move this outside this procedure
'
so you have more control over whether this happens or not
CenterVertically pres.Slides(nSlide).Shapes(
1
)
CenterHorizontally pres.Slides(nSlide).Shapes(
1
)
End Sub
Function
GetSaveAsName(sTitle
As
String
)
As
String
Dim
sFilter
As
String
sFilter
=
"
Presentation (*.ppt),*.ppt
"
GetSaveAsName
=
Application.GetSaveAsFilename(filefilter:
=
sFilter, Title:
=
sTitle)
End Function
Sub
CenterVertically(sl
As
PowerPoint.Slide, sh
As
PowerPoint.Shape)
Dim
lHeight
As
Long
lHeight
=
sl.Parent.PageSetup.SlideHeight
sh.Top
=
(lHeight
-
sh.Height)
/
2
End Sub
Sub
CenterHorizontally(sl
As
PowerPoint.Slide, sh
As
PowerPoint.Shape)
Dim
lWidth
As
Long
lWidth
=
sl.Parent.PageSetup.SlideWidth
sh.Left
=
(lWidth
-
sh.Width)
/
2
End Sub