zoukankan      html  css  js  c++  java
  • 用 VBA 实现在 PPT 最下边加个进度条

    用 VBA 实现在 PPT 最下边加个进度条,方便查看进行到总长度的多少,
    抓住了听讲人的心理:“啥时候才能讲完啊?”
    进度条只能体现已播放的幻灯片张数,不能用于计时。

    打开 PPT,按 Alt+F8 新建个宏,随便取个宏名,不用改宏作用区域,
    点“创建”,删除模块里的内容,把代码复制过去。
    (按 Alt+F11 之后插入模块也可以)

    进度条宏的作者是水木社区的
    dukenuke

    Sub ProgressBar()
    ' by dukenuke@newsmth.net
    ' Sun Jul 11 00:06:13 2010
    
        Dim mySlides As Slides
        Dim pageBar As ShapeRange
        Dim pageSHower As Shape
        Dim pageWidth, pageHeight, pageStep
        
        Set mySlides = Application.ActivePresentation.Slides
    
        pageWidth = Application.ActivePresentation.SlideMaster.Width
        pageHeight = Application.ActivePresentation.SlideMaster.Height
        pageStep = pageWidth / mySlides.Count
    
        On Error Resume Next
    
        For i = 2 To mySlides.Count
            Set pageBar = mySlides.Item(i).Shapes.Range(Array())
            Set pageBar = _
               mySlides.Item(i).Shapes.Range(Array("RectanglePageNum"))
    
            If IsNull(pageBar) Or pageBar.Count = 0 Then GoTo newBar
            Set pageSHower = pageBar.Item(1)
            GoTo nextPage
    
    newBar:
            Set pageSHower = mySlides.Item(i).Shapes.AddShape( _
                               msoShapeRectangle, 0, _
                               pageHeight - 3, i * pageStep, 3)
            pageSHower.Name = "RectanglePageNum"
    
    nextPage:
            pageSHower.Fill.ForeColor.RGB = RGB(179, 162, 199)
            pageSHower.Line.Visible = msoFalse
            pageSHower.Width = i * pageStep
            pageSHower.Top = pageHeight - 3
            pageSHower.Left = 0
            pageSHower.Height = 3
    
        Next
    End Sub

     

    颜色尺寸可以更改,现在的高度是3,在页面最下方,颜色是淡紫色。

    PowerPoint 2007/2010 需要另存为带宏的演示文稿,还可以把宏按钮添加
    到快速访问工具栏。

    开始讲 PPT 前先运行宏(按 Alt+F8 或用快速访问工具栏),运行一次即可,
    播放幻灯片时就会自动加上进度条,只有第一页不加,会自动根据当前页
    面数刷新进度。

    注:增减幻灯片(总页数改变)后要重新运行一次宏。

    2010-9-12,对宏进行更新:

    Sub ProgressBar()
    ' bydukenuke@newsmth.net
    ' Sun Jul 11 00:06:13 2010
    '
    ' Update by oicu#lsxk.org
    ' 2010/9/12 20:44
    ' 对首页以及隐藏幻灯片进行处理
    
        Dim mySlides As Slides
        Dim pageBar As ShapeRange
        Dim pageSHower As Shape
        Dim pageWidth, pageHeight, pageStep
        Dim MyArray() As Variant  '增加一个数组以便统计隐藏的幻灯片
        Dim i, j, k
        j = 0
        k = 0
    
        Set mySlides = Application.ActivePresentation.Slides
    
        pageWidth = Application.ActivePresentation.SlideMaster.Width
        pageHeight = Application.ActivePresentation.SlideMaster.Height
        ' pageStep = pageWidth / mySlides.Count
    
        ReDim MyArray(mySlides.Count, 0)
        
        For i = 1 To mySlides.Count'统计隐藏的幻灯片数
            If mySlides.Item(i).SlideShowTransition.Hidden = True Then
                j = j + 1
                MyArray(i, 0) = 1
            Else
                MyArray(i, 0) = 0
            End If
        Next
    
        '除去首页和隐藏的幻灯片后计算进度条长度增量
        If mySlides.Count - 1 - j > 0 Then
            pageStep = pageWidth / (mySlides.Count - 1 - j)
        Else
            pageStep = 0
        End If
    
        On Error Resume Next
    
        For i = 1 To mySlides.Count    ' 改为从1开始
            k = k + MyArray(i, 0)      ' 计算当前隐藏的幻灯片数
            Set pageBar = mySlides.Item(i).Shapes.Range(Array())
            Set pageBar = _
               mySlides.Item(i).Shapes.Range(Array("RectanglePageNum"))
    
            If IsNull(pageBar) Or pageBar.Count = 0 Then GoTo newBar
            Set pageSHower = pageBar.Item(1)
            GoTo nextPage
    
    newBar:
            Set pageSHower = mySlides.Item(i).Shapes.AddShape( _
                               msoShapeRectangle, 0, _
                               pageHeight - 3, i * pageStep, 3)
            pageSHower.Name = "RectanglePageNum"
    
    nextPage:
            pageSHower.Fill.ForeColor.RGB = RGB(179, 162, 199)
            pageSHower.Line.Visible = msoFalse
            ' pageSHower.Width = i * pageStep
           ' 计算进度条长度时除去首页和隐藏的幻灯片
            pageSHower.Width = (i - 1 - k) * pageStep
            pageSHower.Top = pageHeight - 3
            pageSHower.Left = 0
            pageSHower.Height = 3
            ' 删除首页和隐藏的幻灯片的进度条
            If i = 1 Or MyArray(i, 0) = 1 Then pageSHower.Delete
        Next
    End Sub  

    WPS演示安装了vba之后同样可以使用宏制作进度条,不过要修改几个地方才能使用。

    Sub ProgressBar()
    ' by oicu#lsxk.org
    ' 2010/9/18 22:48
    ' For WPS 演示
    
        Dim mySlides As Slides
        ' Dim pageBar As ShapeRange
        Dim pageSHower As Shape
        Dim pageWidth, pageHeight, pageStep
        Dim MyArray() As Variant  '增加一个数组以便统计隐藏的幻灯片
        Dim i, j, k
        j = 0
        k = 0
    
        Set mySlides = Application.ActivePresentation.Slides
    
        ' pageWidth = Application.ActivePresentation.SlideMaster.Width
        ' pageHeight = Application.ActivePresentation.SlideMaster.Height
        ' WPS演示不能取得母板的长宽,改成PageSetup
        pageWidth = Application.ActivePresentation.PageSetup.SlideWidth
        pageHeight = Application.ActivePresentation.PageSetup.SlideHeight
    
        ReDim MyArray(mySlides.Count, 0)
       
        For i = 1 To mySlides.Count ' 统计隐藏的幻灯片数
            If mySlides.Item(i).SlideShowTransition.Hidden = True Then
                j = j + 1
                MyArray(i, 0) = 1
            Else
                MyArray(i, 0) = 0
            End If
        Next
    
        ' 除去首页和隐藏的幻灯片后计算进度条长度增量
        If mySlides.Count - 1 - j > 0 Then
            pageStep = pageWidth / (mySlides.Count - 1 - j)
        Else
            pageStep = 0
        End If
    
        On Error Resume Next
    
        For i = 1 To mySlides.Count    ' 改为从1开始
            k = k + MyArray(i, 0)      ' 计算当前隐藏的幻灯片数
            
            ' WPS演示会自动增加数字在RectanglePageNum名称后面,
            ' 无法用下面的方法清除原有的进度条!只能循环删除。
            For j = 1 To mySlides.Item(i).Shapes.Count
                If VBA.Left(mySlides.Item(i).Shapes(j).Name, 16) = _
                "RectanglePageNum" Then mySlides.Item(i).Shapes(j).Delete
            Next
            
            ' Set pageBar = mySlides.Item(i).Shapes.Range(Array())
            ' Set pageBar = _
                mySlides.Item(i).Shapes.Range(Array("RectanglePageNum"))
    
            ' If IsNull(pageBar) Or pageBar.Count = 0 Then GoTo newBar
            ' Set pageSHower = pageBar.Item(1)
            ' GoTo nextPage
    
    newBar:  ' mso改为kso
            Set pageSHower = mySlides.Item(i).Shapes.AddShape( _
                               ksoShapeRectangle, 0, _
                               pageHeight - 3, i * pageStep, 3)
            pageSHower.Name = "RectanglePageNum"
    
    nextPage:
            pageSHower.Fill.ForeColor.RGB = RGB(179, 162, 199)
            pageSHower.Line.Visible = ksoFalse  ' mso改为kso
            ' 计算进度条长度时除去首页和隐藏的幻灯片
            pageSHower.Width = (i - 1 - k) * pageStep
            pageSHower.Top = pageHeight - 3
            pageSHower.Left = 0
            pageSHower.Height = 3
            ' 删除首页和隐藏的幻灯片的进度条
            If i = 1 Or MyArray(i, 0) = 1 Then pageSHower.Delete
        Next
    End Sub

     

    示例:

    《Marry Me》   http://v.youku.com/v_show/id_XMTg4ODY3MjE2.html

    转自:

      顺顺在线.用 VBA 实现在 PPT 最下边加个进度条.http://hi.baidu.com/zunx/blog/item/811f35d331b95f143bf3cf03.html

     

    知识共享许可协议
    作品Tim Zhang创作,采用知识共享署名 3.0 中国大陆许可协议进行许可。 。
  • 相关阅读:
    高低 接口
    算法
    一致连续性定理
    Brouwer fixed-point theorem
    minimum viable product
    Python星号*与**用法分析 What does ** (double star/asterisk) and * (star/asterisk) do for parameters? 必选参数 默认参数 可变参数 关键字参数
    zabbix 添加主机接口
    zabbix 添加主机接口
    zabbix 添加主机成功失败判断
    zabbix 添加主机成功失败判断
  • 原文地址:https://www.cnblogs.com/ccdc/p/2528869.html
Copyright © 2011-2022 走看看