单个模块无法识别变量



我有打开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.

最新更新