我有打开PowerPoint模板的VBA代码,我想创建单独的模块来填充PowerPoint模板。 打开PowerPoint模板的vba将是"MAIN"模块,并使用CALL命令,它将调用填充模板的其他模块。 就我而言,当我的代码到达第二个模块时,它给了我一个对象需要错误。
下面是打开幻灯片模板的代码: 这个工作正常。
Public Sub OpenTemplatePowerpoint()
Dim ppApp As powerpoint.Application
Dim ppPres As powerpoint.Presentation
Dim ppslide As powerpoint.Slide
TemplatePresPath = "powerpointpath"
Set ppApplication = CreateObject("PowerPoint.Application")
ppApplication.Visible = True
Set pptemplate = ppApplication.Presentations.Open(Filename:=TemplatePresPath, ReadOnly:=msoFalse) ', WithWindow:=msoFalse)
If ThisWorkbook.Sheets("Instructions").Range("D2").Value = True Then
Call Module1
Else
MsgBox ("AWW")
End If
End Sub
下面是被调用的模块的示例代码。
Set ppslide1 = pptemplate.Slides(1)
ppslide1.Select
With ppslide1.Shapes(15)
.Select
.Table.Cell(3, 2).Shape.TextFrame.TextRange.Text = Format(ThisWorkbook.Sheets("sheets").Range("L6").Value, "0.00")
End With
End Sub
当我调试时,这部分代码会突出显示
Set ppslide1 = pptemplate.Slides(1)
是因为我需要再次声明吗?如果是这样,如何将 pptemplate 分配给当前已打开的幻灯片?
您需要参数化调用的过程,并将Presentation
作为参数传递 - 您需要传递对象指针的副本; 这是使用ByVal
修饰符完成的:
Public Sub TheOtherProcedure(ByVal pptemplate As Presentation)
Dim ppslide As Slide
Set ppslide = pptemplate.Slides(1)
With ppslide.Shapes(15)
.Table.Cell(3, 2).Shape.TextFrame.TextRange.Text = Format(ThisWorkbook.Sheets("sheets").Range("L6").Value, "0.00")
End With
End Sub
如果不指定ByVal
,则会得到隐式默认值,即ByRef
,其中传递对对象指针的引用。这具有您希望避免的容易出错的影响。
Public Sub OpenTemplatePowerpoint()
Dim ppApp As powerpoint.Application
Dim ppPres As powerpoint.Presentation
Dim ppslide As powerpoint.Slide
TemplatePresPath = "powerpointpath"
Set ppApplication = CreateObject("PowerPoint.Application")
ppApplication.Visible = True
Set pptemplate = ppApplication.Presentations.Open(Filename:=TemplatePresPath, ReadOnly:=msoFalse) ', WithWindow:=msoFalse)
If ThisWorkbook.Sheets("Instructions").Range("D2").Value = True Then
'invoke TheOtherProcedure like this:
Module1.TheOtherProcedure pptemplate
'or like this:
TheOtherProcedure pptemplate
'or like this:
Call Module1.TheOtherProcedure(pptemplate)
'or like this:
Call TheOtherProcedure(pptemplate)
Else
MsgBox "AWW"
End If
End Sub
您收到一个对象需要错误,因为未指定Option Explicit
,即使您使用未声明的变量,这也允许 VBA 愉快地编译 - 这意味着您所做的任何拼写错误都不会被编译器捕获......因此,未申报的pptemplate
只是一个空Variant
;然而,成员调用(如pptemplate.Slides
(只能针对对象进行 - 由于Empty
不是对象,这就是运行时抛出"对象需要"的原因。通过指定Option Explicit
,您将该错误移动到编译时,现在编译器无法解析pptemplate
,因为它是未声明的,并且拒绝运行它无法编译的代码。..这要强大得多。始终使用Option Explicit
.