ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4008|回复: 8

[求助] ppt VBA代码,怎样操作删除母版视图中“任何幻灯片都不使用”的版式?谢谢!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-9-16 22:15 | 显示全部楼层 |阅读模式
PowerPoint2007文件,点开母版视图,会看到很多版式页面有“任何幻灯片都不使用”的提示,如何使用vba代码,一键操作将这些都不使用的版式页面删除掉?

TA的精华主题

TA的得分主题

发表于 2019-1-18 13:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
在网上找了好久,最后自己琢磨出来的。试了试可以解决问题。

Option Explicit

Sub ModifyDesign()
    Dim oSlide As Slide
    Dim Dic As Object, i As Long
   
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each oSlide In ActivePresentation.Slides
        Dic(oSlide.Design.Index) = ""
    Next oSlide
   
    For i = ActivePresentation.Designs.Count To 1 Step -1
        If Not Dic.exists(i) Then ActivePresentation.Designs(i).Delete
    Next i
   
    Set Dic = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2019-1-19 20:19 | 显示全部楼层
sodm 发表于 2019-1-18 13:22
在网上找了好久,最后自己琢磨出来的。试了试可以解决问题。

Option Explicit

有些能删,可发现有些删不了,能找下附件这个删不了的原因么?

★二氧化碳的制法.rar

70.94 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2019-1-21 11:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
此段代码,用来删除PPT中有“幻灯片母版:任何幻灯片都不使用”的情况。不适用删除母版下一阶的“版式:任何幻灯片都不使用”这种情况。
你的PPT我打开看了,只有一个母版,所以不用删除。
可以到菜单栏中的“视图”,然后点击“幻灯片母版”。查看一下自己的母版。

TA的精华主题

TA的得分主题

发表于 2019-1-21 14:55 | 显示全部楼层
sodm 发表于 2019-1-21 11:19
此段代码,用来删除PPT中有“幻灯片母版:任何幻灯片都不使用”的情况。不适用删除母版下一阶的“版式:任 ...

3楼我的附件中:
第一张母版显示:诗情画意 幻灯片母版:由幻灯片1使用
第二张母版显示:诗情画意 标题母版:任何幻灯片都不使用
不适用删除“任何幻灯片都不使用”的标题母版吗?代码能修改吗?

TA的精华主题

TA的得分主题

发表于 2019-1-22 10:31 | 显示全部楼层
本帖最后由 sodm 于 2019-1-23 15:10 编辑

根据你的要求,以下代码可以同时删除任何幻灯片都不使用的母版和版式。不过个人还是觉得母版应该有多个版式的,不用的都删除了可能不好,所以建议用2楼的代码。

Option Explicit
Sub DeleteUnusedMaster()
    Dim oSlide As Slide
    Dim Dic As Object, i As Long, j As Long
    Dim oDicItem As Variant, DicItem As Variant
    Dim oFlag As Boolean
   
    Set Dic = CreateObject("Scripting.Dictionary")
    '获得幻灯片母版编号和版式名称
    For Each oSlide In ActivePresentation.Slides
        Dic(oSlide.Design.Index) = Dic(oSlide.Design.Index) & "," & oSlide.CustomLayout.Name
    Next oSlide
    '删除任何幻灯片都不使用母版和版式
    For i = ActivePresentation.Designs.Count To 1 Step -1
        With ActivePresentation.Designs(i)
            If Not Dic.exists(i) Then
                .Delete
            Else
                DicItem = Split(Right(Dic(i), Len(Dic(i)) - 1), ",")
                For j = .SlideMaster.CustomLayouts.Count To 1 Step -1
                    oFlag = False
                    For Each oDicItem In DicItem
                        If oDicItem = .SlideMaster.CustomLayouts(j).Name Then oFlag = True
                    Next oDicItem
                    If oFlag = False Then .SlideMaster.CustomLayouts(j).Delete
                Next j
            End If
        End With
    Next i
   
    Set Dic = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2019-1-22 20:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
sodm 发表于 2019-1-22 10:31
根据你的要求,以下代码可以同时删除任何幻灯片都不使用的母版和版式。不过个人还是觉得母版应该有多个版式 ...

谢谢老师的升级代码。
测试发现:1、在ppt2003中.SlideMaster没有.CustomLayouts这个属性:显示方法和数据成员未找到。
2、ppt2010中.SlideMaster.CustomLayouts(j).Delete这句出错,显示:
运行时错误  '-2147188160 (80048240)。
Slide (unknown member):Invalid request. Can't delete master.
但:加入On Error Resume Next后,能删除“任何幻灯片都不使用”的母版。
可能还需完善一下。

TA的精华主题

TA的得分主题

发表于 2019-1-23 14:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
由于PPT2003到PPT2007微软设计思路不同,代码无法做到兼顾,只好分开。PPT2010遇到的错误已完善,经自己测试可以正常运行。

PPT2003 删除任何幻灯片都不使用的母版,代码如下:

Option Explicit
Sub ModifyDesign()
    Dim oSlide As Slide
    Dim Dic As Object, i As Long
   
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each oSlide In ActivePresentation.Slides
        Dic(oSlide.Design.Index) = ""
    Next oSlide
   
    For i = ActivePresentation.Designs.Count To 1 Step -1
        If Not Dic.exists(i) Then ActivePresentation.Designs(i).Delete
    Next i
   
    Set Dic = Nothing
End Sub

PPT2007/2010 删除任何幻灯片都不使用的母版和版式,代码如下:(备注:PPT2010以上的未测试过,欢迎大家测试告知结果)

Option Explicit
Sub DeleteUnusedMaster()
    Dim oSlide As Slide
    Dim Dic As Object, i As Long, j As Long
    Dim oDicItem As Variant, DicItem As Variant
    Dim oFlag As Boolean
   
    Set Dic = CreateObject("Scripting.Dictionary")
    '获得幻灯片母版编号和版式名称
    For Each oSlide In ActivePresentation.Slides
        Dic(oSlide.Design.Index) = Dic(oSlide.Design.Index) & "," & oSlide.CustomLayout.Name
    Next oSlide
    '删除任何幻灯片都不使用母版和版式
    For i = ActivePresentation.Designs.Count To 1 Step -1
        With ActivePresentation.Designs(i)
            If Not Dic.exists(i) Then
                .Delete
            Else
                DicItem = Split(Right(Dic(i), Len(Dic(i)) - 1), ",")
                For j = .SlideMaster.CustomLayouts.Count To 1 Step -1
                    oFlag = False
                    For Each oDicItem In DicItem
                        If oDicItem = .SlideMaster.CustomLayouts(j).Name Then oFlag = True
                    Next oDicItem
                    If oFlag = False Then .SlideMaster.CustomLayouts(j).Delete
                Next j
            End If
        End With
    Next i
   
    Set Dic = Nothing
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-3-28 19:56 , Processed in 0.060929 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表