2013-05-20 24 views
6

Mam kod, który wymaga ode mnie informacji, na którym SlideIndex powinien działać (np. Gdzie wstawić nowy slajd, gdzie wstawić obiekt ChartObject itp. .). Około 99% czasu, można skutecznie uzyskaniem SlideIndex przez:Jak uzyskać obiekt SlideIndex widocznego slajdu w programie Powerpoint, gdy SelectionType = ppSelectionNone

Dim w as Long 'slide index variable 
w = ActivePresentation.Windows(1).Selection.SlideRange(1).SlideIndex 

Inne 0,1% w czasie, gdy ActivePresentation.Windows(1).SelectionType = ppSelectionNone, będzie to się nie uda, ponieważ (zrozumiałe) nie można uzyskać z następujących SlideIndex wybór, ponieważ nie ma wyboru. Może się tak zdarzyć, jeśli użytkownik nieumyślnie "wybrał" przestrzeń między dwoma slajdami w panelu Schemat.

Co chciałbym zrobić, najlepiej jest uzyskać własność suwaka, który jest widoczny w panelu Slajdy SlideIndex:

enter image description here Obecnie mam jakiś kod, który sprawdza, czy SelectionType jest ppSelectionNone, więc może uwięzić warunek, po prostu nie wymyśliłem sposobu zidentyfikowania slajdu w panelu slajdów.

Function GetMySlide() 
Dim w as Long 
    If Not ActivePresentation.Windows(1).Selection.Type = ppSelectionNone Then 

     w = ActivePresentation.Windows(1).Selection.SlideRange(1).SlideIndex 
     Set GetMySlide = ActivePresentation.Slides(w) 

    Else: 

     MsgBox "No slide is currently selected. Please select a slide in the Outline pane in order to proceed.", vbInformation 
     Set GetMySlide = Nothing 
     Exit Function 
    End If 
End Function 

Aktualizacja

Moje rozwiązanie tymczasowe jest użycie zmiennej publicznej lastUsedSlide próbując śledzić ostatnio wybranego slajdu. Mogę włączyć to zdarzenie WindowSelectionChange, ale miałem nadzieję, że będzie prostsze rozwiązanie. Gdybym myślał, że ta metoda będzie działała, to zawsze używałbym go, ale potencjalnie wprowadza nieprzewidziane błędy, ponieważ lastUsedSlide nie jest niezawodnym proxy dla what_slide_i_am_currently_looking_at.

Odpowiedz

2

David, być może można użyć dodatkowo Activate metoda Window.Pane obiekt tak:

'new code: 
ActivePresentation.Windows(1).Panes(2).Activate 
'your code 
Dim w as Long 'slide index variable 
w = ActivePresentation.Windows(1).Selection.SlideRange(1).SlideIndex 

Jednak proszę przeczytać trochę więcej o Pane.ViewType właściwości, które mogą być pomocne. W moim prostym teście zarówno Panes(2) jak i Panes(3) działa, ale możesz mieć inny kontekst wywoływania twojego sub.

+0

Sprawdzę dwa razy, ale kiedy spróbowałem tego dziś rano, 'Activate' nadal pozostawiał mnie z' SelectionType = ppSelectionNone', więc nie byłem w stanie odnieść się do 'ActivePresentation.Windows (1) .Selection .SlideRange ... '. –

+0

OK, myślę, że to może faktycznie zadziałać. Pozwól mi przetestować to nieco więcej :) –

+0

Będąc w widoku normalnym (PPT2016 btw), mogę aktywować okienko 2 (Przesunięcie), a następnie okienko 1 (miniaturka), aby wymusić wybór miniatury, ale TYLKO podczas przechodzenia przez kod. W czasie wykonywania, kończę bez wyboru! –

2

Potencjał obejście, tutaj:

http://eileenslounge.com/viewtopic.php?f=30&t=1667

If ActiveWindow.Selection.Type = ppSelectionNone Then 
    Select Case ActiveWindow.ViewType 
    Case ppViewNormal 
     ActiveWindow.ViewType = ppViewSlide 
     ActiveWindow.ViewType = ppViewNormal 
    Case ppViewSlideSorter 
     ActiveWindow.ViewType = ppViewSlide 
     ActiveWindow.ViewType = ppViewSlideSorter 
    Case Else 
     ' ? 
    End Select 
End If 
' A slide should be selected now 

nie szczególnie dbać o to, estetycznie, ale wydaje się działać, rodzaj. Jedynie normalnie, jeśli wybór znajduje się pomiędzy slajdami, zmusza to wybór do pierwszego z tych dwóch slajdów, gdy myślę, że drugi byłby bardziej intuicyjny. Mogę zmodyfikować mój kod, aby to uwzględnić, ale nadal nie jest idealny.

+2

Drugi może, ale nie musi być bardziej intuicyjny, ale nie tak działa PPT. Jeśli umieścisz kursor między slajdami w widoku sortera lub panelu miniaturek, a następnie wstaw nowy slajd, wstawi nowy slajd w pozycji kursora ... po poprzednim slajdzie. To prawdopodobnie logika stojąca za tym, jak się to zachowuje. –

+0

@SteveRindsberg dobry punkt. Dla moich celów, myślę, że można bezpiecznie założyć, że gdy slajd znajduje się w * widoku *, użytkownik zamierza, aby aplikacja działała na tym slajdzie (a nie na poprzednim slajdzie). W każdym razie odpowiedź KazJawa wydaje się działać, zmuszając "Wybór" z powrotem do aktualnie oglądanego slajdu. –

Powiązane problemy