2013-05-20 30 views
6

Tôi có một số mã yêu cầu tôi biết những gì SlideIndex hoạt động trên (ví dụ: vị trí chèn trang trình bày mới, vị trí chèn ChartObject, v.v. .). Khoảng 99% thời gian, tôi thành công có thể có được SlideIndex bởi:Làm thế nào tôi có thể lấy SlideIndex của một Slide hiển thị trong Powerpoint khi SelectionType = ppSelectionNone

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

Các khác 0,1% thời gian, khi ActivePresentation.Windows(1).SelectionType = ppSelectionNone, nó sẽ thất bại, bởi vì (dễ hiểu) nó không thể có được SlideIndex của lựa chọn, bởi vì không có lựa chọn. Điều này có thể xảy ra nếu người dùng vô tình "đã chọn" khoảng trống giữa hai trang trình bày trong ngăn Phác thảo.

Những gì tôi muốn làm, lý tưởng, là có được SlideIndex tài sản của slide mà có thể nhìn thấy trong cửa sổ Slides:

enter image description here Tôi hiện đang có một số mã kiểm tra liệu SelectionTypeppSelectionNone, vì vậy tôi có thể bẫy điều kiện, tôi chỉ không tìm ra cách để xác định slideIndex của Slides Pane.

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 

Cập nhật

giải pháp tạm thời của tôi là sử dụng một biến nào lastUsedSlide trong một nỗ lực để theo dõi các phần Slide thời gian gần đây được lựa chọn nhiều nhất. Tôi có thể kết hợp điều này với sự kiện WindowSelectionChange, nhưng hy vọng sẽ có một giải pháp đơn giản hơn. Nếu tôi nghĩ phương pháp này sẽ luôn hoạt động, tôi sẽ sử dụng nó, tuy nhiên, nó có khả năng giới thiệu các lỗi không lường trước được, vì lastUsedSlide không phải là proxy đáng tin cậy cho what_slide_i_am_currently_looking_at.

Trả lời

2

David, có thể bạn có thể sử dụng thêm phương pháp Activate cho Window.Pane đối tượng như thế này:

'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 

Tuy nhiên, xin đọc một số khoảng hơn Pane.ViewType tài sản mà có thể là hữu ích. Trong thử nghiệm đơn giản của tôi cả hai công việc Panes(2)Panes(3) hoạt động nhưng bạn có thể có ngữ cảnh khác nhau gọi điện cho phụ của bạn.

+0

Tôi sẽ kiểm tra lại, nhưng khi tôi thử sáng nay, 'Kích hoạt' vẫn còn để lại cho tôi' SelectionType = ppSelectionNone', và vì vậy tôi không thể tham chiếu đến 'ActivePresentation.Windows (1) .Selection .SlideRange ... '. –

+0

OK, tôi nghĩ điều này thực sự có thể hiệu quả. Hãy để tôi kiểm tra nó nhiều hơn một chút :) –

+0

Khi ở chế độ xem Bình thường (PPT2016 btw), tôi có thể Kích hoạt Pane 2 (Trượt) rồi Pane 1 (hình thu nhỏ) để chọn hình thu nhỏ, nhưng CHỈ khi bước qua mã. Vào thời gian chạy, tôi kết thúc mà không có một lựa chọn! –

2

workaround tiềm năng, ở đây:

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 

Tôi không đặc biệt là chăm sóc cho nó, về mặt thẩm mỹ, nhưng có vẻ như để làm việc, loại. Chỉ có điều là bình thường nếu lựa chọn là giữa các trang trình bày, lực lượng này lựa chọn đầu tiên trong hai trang trình bày đó, khi tôi nghĩ rằng thứ hai sẽ trực quan hơn. Tôi có thể sửa đổi mã của mình để giải thích cho điều này, nhưng nó vẫn không lý tưởng.

+2

Thứ hai có thể hoặc không trực quan hơn, nhưng đó không phải là cách PPT hoạt động. Nếu bạn đặt con trỏ giữa các trang trình bày trong khung nhìn sắp xếp hoặc khung hình thu nhỏ, sau đó chèn một trang trình bày mới, nó sẽ chèn trang trình bày mới vào vị trí của con trỏ ... sau trang trình bày trước. Đó có thể là logic đằng sau cách cư xử này. –

+0

@SteveRindsberg điểm tốt. Vì mục đích của tôi, tôi nghĩ rằng an toàn khi giả sử rằng khi một trang chiếu ở chế độ xem *, người dùng dự định ứng dụng sẽ hành động trên trang trình bày này (không phải trang trình bày trước đó). Trong mọi trường hợp, câu trả lời của KazJaw dường như làm điều này bằng cách buộc 'Selection' quay lại trang chiếu hiện tại. –