ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA导出模块、窗体、类模块给另一个PPT不成功

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-1-21 11:40 | 显示全部楼层 |阅读模式
实现功能:
        将文档“VBA导出模块、窗体、类模块给另一个PPT.ppt”中的模块、窗体、类模块等导出给自动打开的文档“新建演示文稿.ppt”。
        出现的问题:
        1.如果“新建演示文稿.ppt”中没有模块,则导入是成功的。
        2.如果“新建演示文稿.ppt”中已经有模块,这个就会变成复制“新建演示文稿.ppt”中的模块了。例如: “新建演示文稿.ppt”中已经有“模块1”,运行后多了一个“模块11”,原来的幻灯片中的模块、窗体等都没有复制过去。怎样解决这个问题?
        “VBA导出模块、窗体、类模块给另一个PPT.ppt”中的代码如下:
Sub CopyVBComponents() '复制窗体、模块、类模块给另一个PPT
    Dim f$, p$, d, ppt_name
    Set d = CreateObject("Scripting.Dictionary")
    p = ActivePresentation.Path & "\"
    f = Dir(p & "*.ppt")
    Do While Len(f)
        If f <> ActivePresentation.Name Then '本文件除外
            d(f) = ""
        End If
        f = Dir
    Loop
    ppt_name = d.keys '将字典的数据放入数组
    If (UBound(ppt_name) < 0) Then
        MsgBox "当前目录下没有其它的PPT", 48, "警告"
        Exit Sub
    Else
        For i = 0 To UBound(ppt_name)
            Set pptInput = Presentations.Open(p & "\" & ppt_name(i), ReadOnly:=msoFalse)
            '================= 以下是复制窗体、模块、类模块
            Dim vbc As Object
            Application.VBE.MainWindow.SetFocus
            For Each vbc In Application.VBE.ActiveVBProject.VBComponents
                vbc.Export p & "\" & vbc.Name '导出
                pptInput.VBProject.VBComponents.Import p & "\" & vbc.Name  '导入
                Kill p & "\" & vbc.Name  '删除导出
            Next
            Presentations(p & "\" & ppt_name(i)).Save
            Presentations(p & "\" & ppt_name(i)).Close
        Next i
    End If
End Sub
VBA导出模块、窗体、类模块给另一个PPT.rar (75.17 KB, 下载次数: 34)

TA的精华主题

TA的得分主题

发表于 2020-2-28 20:32 | 显示全部楼层
本帖最后由 lss001 于 2020-2-29 13:04 编辑

Sub CopyVBComponents()
    Dim f$, p$, s$, vs, ppt, ppts
    p = ActivePresentation.Path & "\"
    f = Dir(p & "*.ppt")
    On Error Resume Next
    Do While Len(f)
        If f <> ActivePresentation.Name Then '本文件除外
            Set ppt = ActivePresentation '务必先获取当前ppt/后打开ppts
            Set ppts = Presentations.Open(p & f, ReadOnly:=0)
            For Each vs In ppt.VBProject.VBComponents
                s = p & vs.Name: vs.Export s '导出
                ppts.VBProject.VBComponents.Import s  '导入
                Kill s: Kill s & ".frx" '删除s以及s.frx
            Next
            Presentations(p & f).Save
            Presentations(p & f).Close

        End If
        f = Dir
    Loop
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-28 22:34 | 显示全部楼层
lss001 发表于 2020-2-28 20:32
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal s As Long)
Sub CopyVBComponents() '复制窗体 ...

谢谢,总算明白问题的根本原因!

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-3-5 19:14 | 显示全部楼层
lss001 发表于 2020-2-28 20:32
Sub CopyVBComponents()
    Dim f$, p$, s$, vs, ppt, ppts
    p = ActivePresentation.Path & "\"

老师好,您有空时请帮忙看看这个帖子,谢谢:
https://club.excelhome.net/thread-1618676-1-1.html
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 12:06 , Processed in 0.045488 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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