2016-08-09 2 views
1

Я пытаюсь открыть конкретный слайд PowerPoint, выбранный пользователем в Excel. Код для открытия Powerpoint для конкретного слайда следующего (Тарг является строкой, как "Slide:12"):Установите презентацию PowerPoint, когда она уже открыта (из Excel)

Function rcFollowSlide(targ As String) 
    Dim PptPath As String 
    Dim pptApp As PowerPoint.Application 
    Dim pptPres As PowerPoint.Presentation 

    targ = Mid(targ, InStr(targ, ":") + 1) 
    targ = Left(targ, Len(targ) - 1) 
    PptPath = wsSettings.Range("PPTPath").Value 

    If IsPPTOpen(PptPath) Then 
     MsgBox "Already opened" 
     Exit Function 
     'Set ppres = 
    Else 
     Set pptApp = CreateObject("Powerpoint.Application") 
     Set pptPres = pptApp.Presentations.Open(PptPath) 
    End If 

    If targ > 0 And targ <= pptPres.Slides.Count Then 
     pptPres.Slides(CInt(targ)).Select 
    Else 
     MsgBox "Image " & targ & " N/A." 
    End If 
End Function 

Он работает очень хорошо, когда презентация закрыта, и он должен открыть его. Я хотел бы настроить презентацию Powerpoint на pptPres, когда она уже открыта, поэтому я мог бы заставить код продолжать работать, не открывая новый экземпляр этой презентации. Как я могу получить доступ к приложению в первую очередь и установить презентацию?

Для справки, вот функция, используемая для проверки того, открыт ли PPT.

Function IsPPTOpen(FileName As String) 
    Dim ff As Long, ErrNo As Long 

    On Error Resume Next 
    ff = FreeFile() 
    Open FileName For Input Lock Read As #ff 
    Close ff 
    ErrNo = Err 
    On Error GoTo 0 

    Select Case ErrNo 
    Case 0: IsPPTOpen = False 
    Case 70: IsPPTOpen = True 
    Case Else: Error ErrNo 
    End Select 
End Function 
+0

Try: 'Set pptPres = pptApp.Presentations (Dir (PptPath))' –

ответ

1

Я думаю, что это нужно сделать, это:

If IsPPTOpen(PptPath) Then 
    Set pptPres = pptApp.Presentations(Dir(PptPath)) 
    'Set ppres = 
    Exit Function 
Else 

Если вам необходимо активировать презентацию, попробуйте:

VBA.AppActivate (Dir(PptPath))  

Как вы уже отметили, это может также работать в некоторых (см. комментарий Тьерри ниже).

PPTApp.Activate 
PPTPres.Activate 
+1

AH Я Googled это сам и увидел, что я мог активировать он с 'pptApp.Activate', не хотел быть вампиром-помощником :) Также я буду принимать ваш ответ, когда смогу, но, ради упоминания об этом, я переместил' Set pptApp' перед условием If , –

+1

PPTApp.Activate с активацией PowerPoint, но если файл уже открыт и много открытых файлов ppt, презентация PptPath может быть неактивной презентацией. Мне нравится использовать AppActivate (pptPres.Name). –

+0

Хорошая точка @ThierryDalon 'AppActivate' является хорошей, потому что она идет по имени окна. OP также может выполнять 'pptPres.Activate' для активации конкретной именованной презентации. –

0

Я использую немного другой код:

ppProgram является PowerPoint.Application

ppPres является PowerPoint.Presentation

ppFullPath полный путь (Path Name & файла)

ppName является "чистым" Название запрошенной презентации

' more than 1 Presentstion open 
If ppProgram.Presentations.Count > 0 Then 
    ppName = Mid(ppFullPath, InStrRev(ppFullPath, "\") + 1, Len(ppFullPath)) 
    i = 1 
    Do Until i = ppProgram.Presentations.Count + 1 
     If ppProgram.Presentations.Item(i).Name = ppName Then 
      Set ppPres = ppProgram.Presentations.Item(i) 
      GoTo OnePager_Pres_Found 
     Else 
      i = i + 1 
     End If 
    Loop 
End If 

OnePager_Pres_Found: 
ppPres.Windows(1).Activate ' activate the Presentation in case you have several open 
+0

Будет ли это работать, если одновременно открыто более одного приложения Powerpoint? Например, если вы положили powerpoint в панель задач и щелкните по нему средним нажатием кнопки мыши. –

+0

PowerPoint позволяет только один экземпляр сам по себе, поэтому в общем случае вам не нужно беспокоиться о том, что сразу открыто одно приложение PPT (в отличие от Excel и Word). –