Отдельные модули не распознают переменные - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть код VBA, который открывает шаблон PowerPoint, и я хочу создать отдельные модули, которые будут заполнять шаблон PowerPoint.VBA, открывающая шаблон powerpoint, будет модулем «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 моей текущей точке PowerPoint, которая уже открыта?

1 Ответ

0 голосов
/ 24 сентября 2018

Вы захотите параметризовать вызванную процедуру и передать 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.

...