各个模块无法识别变量

时间:2018-09-23 22:39:38

标签: vba module call

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

1 个答案:

答案 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

相关问题