我有打开Powerpoint模板的VBA代码,并且我想创建将填充Powerpoint模板的单独模块。打开powerpoint模板的vba将是“ MAIN”模块,并使用CALL命令,它将调用填充该模板的其他模块。就我而言,当我的代码进入第二个模块时,它给了我一个对象必需的错误。
以下是打开PowerPoint模板的代码: 这个很好用。
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需要再次声明吗?如果是这样,如何将pptemplate分配给我已经打开的当前powerpoint?
答案 0 :(得分:1)
您将要对调用的过程进行参数化,并将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
,在该默认值中,您将 reference 传递给对象指针。您会希望避免这种容易出错的问题。
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
,您可以将该错误移至 compile-time ,现在,编译器由于未声明而无法解析pptemplate
,并且拒绝运行可以执行的代码。 t编译。 ..这要强大得多。始终使用Option Explicit
。