ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 名课 - Power BI数据分析与可视化实战 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
Python自动化办公应用大全 Excel 2021函数公式学习大典 Kutools for Office 套件发布 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: shenjianrong163

[求助] ppt vba怎样实现excel vba中Application.SendKeys "{TAB}"的功能?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-1-16 02:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
shenjianrong163 发表于 2020-1-15 22:20
谢谢!运行后有小点问题。

我更改了其中一点,可以运行了。只是运行完成后都要定位到工程模块,可以让 ...

Sub hh()
    Dim pw As Long
    Set ws = CreateObject("wscript.shell")
    pw = "123"
    ws.SendKeys "%LV%TE{tab 9}{end}{tab}V"
    ws.SendKeys "{tab}"
    ws.SendKeys pw
    ws.SendKeys "{tab}"
    ws.SendKeys pw
    ws.SendKeys "{ENTER}"
    ws.SendKeys "%Q"' 关闭工程模块并返回到ppt界面
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-16 12:11 | 显示全部楼层
lss001 发表于 2020-1-16 02:28
Sub hh()
    Dim pw As Long
    Set ws = CreateObject("wscript.shell")

谢谢!这是给当前的ppt设置密码的,如果想用当前ppt给同时打开的另一个ppt设置密码,有什么办法吗?

TA的精华主题

TA的得分主题

发表于 2020-1-16 14:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
shenjianrong163 发表于 2020-1-16 12:11
谢谢!这是给当前的ppt设置密码的,如果想用当前ppt给同时打开的另一个ppt设置密码,有什么办法吗?

Sub gg()
    With Application.Presentations("演示文稿2.ppt").Windows(1)
        If Not .Active Then '先激活演示文稿2
            Set oldWin = Application.ActiveWindow
            .Activate
        End If
    End With
    Dim pw As Long '再执行密码操作
    Set ws = CreateObject("wscript.shell")
    pw = "123"
    ws.SendKeys "%LV%TE{tab 9}{end}{tab}V"
    ws.SendKeys "{tab}"
    ws.SendKeys pw
    ws.SendKeys "{tab}"
    ws.SendKeys pw
    ws.SendKeys "{ENTER}"
    ws.SendKeys "%Q"
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-16 18:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lss001 发表于 2020-1-16 14:37
Sub gg()
    With Application.Presentations("演示文稿2.ppt").Windows(1)
        If Not .Active T ...

如果是手动打开的ppt可以,但如果是VBA代码打开的就不行,请看看问题出现在哪里?(所有幻灯片的后缀名都是.ppt  并且里面都有模块。)谢谢!
Sub gg(Str)
    With Application.Presentations("Str").Windows(1)
        If Not .Active Then '先激活演示文稿
            Set oldWin = Application.ActiveWindow
            .Activate
        End If
    End With
    Dim pw As Long '再执行密码操作
    Set ws = CreateObject("wscript.shell")
    pw = "123"
    ws.SendKeys "%LV%TE{tab 9}{end}{tab}V"
    ws.SendKeys "{tab}"
    ws.SendKeys pw
    ws.SendKeys "{tab}"
    ws.SendKeys pw
    ws.SendKeys "{ENTER}"
    ws.SendKeys "%Q"
End Sub

Sub pptName()
    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   '获取所有的ppt文件名
    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)
                 Call hh(ppt_name(i))   'ppt_name(i)是当前目录下的别的ppt
                  Presentations(p & "\" & ppt_name(i)).Save
                  Presentations(p & "\" & ppt_name(i)).Close
        Next i
    End If
End Sub

TA的精华主题

TA的得分主题

发表于 2020-1-16 20:59 | 显示全部楼层
本帖最后由 lss001 于 2020-1-18 17:47 编辑
shenjianrong163 发表于 2020-1-16 18:18
如果是手动打开的ppt可以,但如果是VBA代码打开的就不行,请看看问题出现在哪里?(所有幻灯片的后缀名都 ...

Private Declare PtrSafe Sub Sleep Lib"kernel32" (ByVal dwMilliseconds As Long)
Sub pptName()
  Dim f$, p$, d, ppt_name
  Set d = CreateObject("Scripting.Dictionary")
    p= ActivePresentation.Path & "\"
    f= Dir(p & "*.ppt*")
   DoWhile Len(f)
      If f <>ActivePresentation.Name Then d(f) = ""
      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)
          DoEvents: Sleep 100 '转出控制权!!!
          Call gg(ppt_name(i))
          DoEvents: Sleep 100 '控制权转回!!!
          Presentations(p & "\" & ppt_name(i)).Save
          Presentations(p & "\" & ppt_name(i)).Close
      Next
  End If
End Sub
Sub gg(str)
  Dim pw&
  With Application.Presentations(str).Windows(1)
      If Not .Active Then
          Set oldWin = Application.ActiveWindow
          .Activate
      End If
  End With
  Set ws = CreateObject("wscript.shell")
   pw= "123"
  ws.SendKeys "%LV%TE{tab 9}{end}{tab}V"
  ws.SendKeys "%P" '改为%P
  ws.SendKeys pw
  ws.SendKeys "%C" '改为%C
  ws.SendKeys pw
  ws.SendKeys "~%{F11}" '改为~%{F11}
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-16 23:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lss001 发表于 2020-1-16 20:59
Dir(p & "*.ppt*")‘此处多了星号*
改为 >>>
Dir(p & "*.ppt")

Dir(p & "*.ppt*")     ‘此处的星号*是为了防止出现.pptm的文件,我也输出文件名测试过了,没有影响。
去掉Presentations(p & "\" & ppt_name(i)).Close 不关闭打开的PPT倒是可以,只是相同目录下,除当前PPT外只能再有一个PPT,再多就会出现一个有,另外的没有。而且vba打开的ppt个数是偶数的话,第一个的”查看工程密码“也没有打勾了。

TA的精华主题

TA的得分主题

发表于 2020-1-17 08:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lss001 于 2020-1-17 08:28 编辑
shenjianrong163 发表于 2020-1-16 23:03
Dir(p & "*.ppt*")     ‘此处的星号*是为了防止出现.pptm的文件,我也输出文件名测试过了,没有影响。
...

见楼上分析,转让控制权!

TA的精华主题

TA的得分主题

发表于 2020-1-17 08:03 | 显示全部楼层
本帖最后由 lss001 于 2020-1-17 08:27 编辑
shenjianrong163 发表于 2020-1-16 23:03
Dir(p & "*.ppt*")     ‘此处的星号*是为了防止出现.pptm的文件,我也输出文件名测试过了,没有影响。
...

见楼上具体分析,加上延时函数

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-17 23:40 | 显示全部楼层
lss001 发表于 2020-1-16 20:59
Private Declare PtrSafe Sub Sleep Lib"kernel32" (ByVal dwMilliseconds As Long) '增加延时函数Sub p ...

谢谢您的耐心回复,仍然不能关闭打开的PPT,否则添加密码就变为给当前的PPT添加了。如果去掉Presentations(p & "\" & ppt_name(i)).Close,那么程序能给打开的PPT添加工程密码,增加延时函数能够解决多个PPT文件了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-1-18 00:42 | 显示全部楼层
lss001 发表于 2020-1-16 20:59
Private Declare PtrSafe Sub Sleep Lib"kernel32" (ByVal dwMilliseconds As Long) '增加延时函数Sub p ...

我在主程序结束时才依次关闭打开的PPT,发现每次都要弹出一个工程属性窗口,于是我稍加修改,问题终于解决了。只是感觉关闭PPT的代码与前面的部分重复了,不简洁。
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub pptName()
   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) = ""
       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)
           DoEvents: Sleep 100 '转出控制权!!!
           Call gg(ppt_name(i)) '是gg不是hh
           Presentations(p & "\" & ppt_name(i)).Save
           DoEvents: Sleep 100 '控制权转回!!!
       Next
   End If
   If (UBound(ppt_name) > 0) Then ‘判断是否有打开的文件
       For i = 0 To UBound(ppt_name)
           Presentations(p & "\" & ppt_name(i)).Close
       Next
   End If

End Sub
Sub gg(str)
   Dim pw&
   With Application.Presentations(str).Windows(1) '注意str不可加冒号
       If Not .Active Then
           Set oldWin = Application.ActiveWindow
           .Activate
       End If
   End With
   Set ws = CreateObject("wscript.shell")
   pw = "123"
    Application.VBE.CommandBars(1).Controls("工具(T)").Controls("VBAProject 属性(&E)...").Execute
    ws.SendKeys "^{tab}"  '切换到密码页  Ctrl+tab
    ws.SendKeys "^v"      '勾选查看工程密码 Ctrl+V
    ws.SendKeys "{tab}"   '换到输入密码
    ws.SendKeys pw        '输入密码
    ws.SendKeys "{tab}"   '跳到下一个
    ws.SendKeys pw        '输入密码
    ws.SendKeys "{ENTER}" '确定
    ws.SendKeys "{Esc}"   'Esc取消工程属性窗口
    ws.SendKeys "^s"      '保存 Ctrl+S

End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-12-24 23:47 , Processed in 0.025627 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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