当前位置: 首页 > news >正文

[最新版]PowerPoint纯vba实现流畅逐帧动画(无任何辅助)

众所周知ppt原生的动画太过拉跨。特别是直线动画,刹车非常慢且无法调节,强行缩短时间又直接砍掉刹车效果等等。此处纯vba动画是逐帧绘制,所以理论上能提供远超原生动画的效果,甚至达到ae那种效果也是有可能的 : )

先放一个最常见的方法。运行可看到“对象名”形状向右移动100磅(约3.5cm)

Private Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long Dim t As Single Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes(对象名)'需要手动设定 for i = 1 to 100 t = Timer shp.left = shp.left + 1 Do While Timer < t + 0.01 DoEvents ' 持续刷新界面 Loop next

很多人说在新版这种用不了了(excel还能)。新版ppt更改渲染机制,将间隔短的变更全部打包到一起。导致动画非常卡甚至不动。这里分享一种新方法,不用外挂,仅强制刷新界面

Sub Test() Dim idx As Long Dim t As Single Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes("a") '需要手动设定 For i = 1 To 100 t = Timer shp.Left = shp.Left + 1 t = Timer Do While Timer < t + 0.01 DoEvents ' 持续刷新界面 idx = ActivePresentation.SlideShowWindow.View.Slide.SlideIndex ActivePresentation.SlideShowWindow.View.GotoSlide idx Loop Next End Sub

运行示例

这里是通过gotoslide强制刷新。gotoslide优先级在打包渲染之上,所以能覆盖掉ppt原有规则

通过这个,我们还能实现ppt原生无法实现的急刹移动,平滑放大等。效果非常不错。这边放一个示例动画,完全基于vba实现无外挂

(注:看起来卡是录屏原因。实测这种动画达到60帧完全没问题!)

代码比较复杂,这里免费放一个打包好的 :)

Private Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long Sub Delay(ms As Long) Dim t As Single t = Timer Do While Timer < t + ms / 1000 DoEvents ' 持续刷新界面 RefreshSlideShow Loop End Sub Sub RefreshSlideShow() Dim idx As Long idx = ActivePresentation.SlideShowWindow.View.Slide.SlideIndex ActivePresentation.SlideShowWindow.View.GotoSlide idx End Sub Sub Move1(对象名 As String, 结束坐标X As Double, 结束坐标Y As Double, 衰减系数 As Double, 帧率 As Long) 结束坐标X = 结束坐标X * 28.346457 结束坐标Y = 结束坐标Y * 28.346457 Dim startL As Double Dim startT As Double Dim deltaL As Double Dim deltaT As Double Dim movedelay As Long Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes(对象名) movedelay = 1000 / 帧率 startL = shp.Left startT = shp.Top deltaL = 结束坐标X - startL deltaT = 结束坐标Y - startT Do If Not deltaL = 0 Then shp.Left = shp.Left + (deltaL / 衰减系数) deltaL = deltaL / 衰减系数 End If If Not deltaT = 0 Then shp.Top = shp.Top + (deltaT / 衰减系数) deltaT = deltaT / 衰减系数 End If deltaL = 结束坐标X - shp.Left deltaT = 结束坐标Y - shp.Top Delay movedelay If (Abs(deltaT) < 0.2) And (Abs(deltaL) < 0.2) Then Exit Do End If Loop shp.Left = 结束坐标X shp.Top = 结束坐标Y End Sub Sub SetPosition(对象名 As String, X As Double, Y As Double) X = X * 28.346457 Y = Y * 28.346457 Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes(对象名) shp.Left = X shp.Top = Y End Sub Sub 渐显移动(对象名 As String, 起始x As Double, 起始y As Double, 终止x As Double, 终止y As Double, 衰减系数 As Double, 渐显系数 As Double, 帧率 As Long) Call SetPosition(对象名, 起始x, 起始y) Dim i i = 1 起始x = 起始x * 28.346457 起始y = 起始y * 28.346457 终止x = 终止x * 28.346457 终止y = 终止y * 28.346457 Dim startL As Double Dim startT As Double Dim deltaL As Double Dim deltaT As Double Dim movedelay As Long Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes(对象名) movedelay = 1000 / 帧率 startL = shp.Left startT = shp.Top deltaL = 终止x - startL deltaT = 终止y - startT Do i = i - 渐显系数 If i <= 0 Then shp.Fill.Transparency = 0 Else shp.Fill.Transparency = i End If If Not deltaL = 0 Then shp.Left = shp.Left + (deltaL / 衰减系数) deltaL = deltaL / 衰减系数 End If If Not deltaT = 0 Then shp.Top = shp.Top + (deltaT / 衰减系数) deltaT = deltaT / 衰减系数 End If deltaL = 终止x - shp.Left deltaT = 终止y - shp.Top Delay movedelay If (Abs(deltaT) < 0.2) And (Abs(deltaL) < 0.2) Then Exit Do End If Loop shp.Left = 终止x shp.Top = 终止y End Sub Sub SetSize(对象名 As String, W As Double, H As Double) Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes(对象名) H = H * 28.346457 W = W * 28.346457 shp.Height = H shp.Width = W End Sub Sub setSH(对象名 As String, 透明度 As Double) Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes(对象名) shp.Fill.Transparency = 透明度 End Sub Sub CHsize(对象名 As String, 结束宽W As Double, 结束高H As Double, 衰减系数 As Double, 帧率 As Long) 结束宽W = 结束宽W * 28.346457 结束高H = 结束高H * 28.346457 Dim startH As Double Dim startW As Double Dim deltaH As Double Dim deltaW As Double Dim movedelay As Long Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes(对象名) movedelay = 1000 / 帧率 startH = shp.Height startW = shp.Width deltaH = 结束高H - startH deltaW = 结束宽W - startW Do If Not deltaH = 0 Then shp.Height = shp.Height + (deltaH / 衰减系数) deltaH = deltaH / 衰减系数 End If If Not deltaW = 0 Then shp.Width = shp.Width + (deltaW / 衰减系数) deltaW = deltaW / 衰减系数 End If deltaH = 结束高H - shp.Height deltaW = 结束宽W - shp.Width Delay movedelay If (Abs(deltaW) < 0.2) And (Abs(deltaH) < 0.2) Then Exit Do End If Loop shp.Height = 结束高H shp.Width = 结束宽W End Sub Sub Show2(对象名 As String, 始透明度 As Double, 末透明度 As Double, 衰减系数 As Double, 帧率 As Long) Dim movedelay As Long Call setSH(对象名, 始透明度) Set sld = ActivePresentation.SlideShowWindow.View.Slide Set shp = sld.Shapes(对象名) movedelay = 1000 / 帧率 Dim dti As Double dti = 末透明度 - 始透明度 Do shp.Fill.Transparency = shp.Fill.Transparency + (dti / 衰减系数) dti = 末透明度 - shp.Fill.Transparency If Abs(dti) <= 0.02 Then Exit Do End If Delay movedelay Loop End Sub

使用方法:把这些全复制进去。新开一个sub 输入call ······调用

比如上面那个动画,只需要这样写

Call Move1("a", 0, 0, 7, 400) Call CHsize("a", 33.867, 19.05, 7, 400) Delay 500 Call CHsize("a", 3, 3, 7, 400) Call Move1("a", 15.43, 8.03, 7, 400) Delay 500

其中move是移动,chsize是平滑放大。四个值分别对应终止坐标xy,系数(越大越平滑),帧率(设60帧会有点卡,所以尽量大点,但不能超过500帧)

感谢阅读!

http://www.jsqmd.com/news/1249316/

相关文章:

  • 学编程用拼音命名,挺好的
  • 「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(四)
  • 名包回收2026邯郸指南 毓典寄卖行本地奢侈品回收实体店铺 - 毓典寄卖行
  • 一套系统服务多组织怎么选:集团、连锁、SaaS 创业的多租户方案对比(2026)
  • 2026 翡翠店铺推荐全攻略:避坑 + 实测榜单,瑞丽市论邦珠宝店为何稳居榜首? - 互联网科技品牌测评
  • AtCoder Beginner Contest 466
  • OpenWrt 软路由解析公网IPV6域名访问家庭NAS的问题答疑
  • 麒麟信安服务器操作系统V3.5.2重磅发布!
  • 2026国内技术转移硕士MTT项目全盘点-交大领衔综合对比与选型指南
  • 2026年河北玻璃钢管道厂家挑选攻略 烁歌环保等企业实力梳理 - 八方八方
  • 「Qt Widget中文示例指南」如何实现文档查看器?(二)
  • 飞书AI流程不再“伪智能”:如何用Rule Engine+LLM Prompt链实现真正条件驱动(附可审计日志模板)
  • 白城奢侈品回收哪家好?亿兔奢品专业服务全解析 - 你就像风一样
  • 10支海外采购团驻场,2027北京算力展全球商贸对接升级
  • 「实战应用」如何使用图表控件LightningChart创建数据采集系统?(一)
  • 2026AI写歌APP推荐 国产AI作曲工具实测对比
  • 无锡名包回收也有“潜规则”?一份内部鉴定扣分标准流出 - 一日一测评
  • 深入解析Tiva™微控制器复位机制:从原理到实战的嵌入式系统稳定性设计
  • 重庆回收黄金小知识,黄金纯度决定回收价格 - 每日生活报
  • ubantu 24,使用sealos v5.1.1 安装 k8s v1.33.6
  • 2026军队文职备考干货|零基础上岸攻略,小白直接抄作业
  • 2026年长春机构挑选攻略 吉林良智事务所等优质机构实测梳理 - 八方八方
  • 苏州黄金回收和以旧换新哪个更划算? - 生活时报
  • 2026 河北碳酸锂回收行业深度梳理:合规锂原料回收厂家权威盘点 - 八方八方
  • Keil C51工程转VSCode Keil Assistant开发全过程
  • 如何公网远程访问OpenWRT软路由web界面
  • ArcMap AddIN之 word报告插件 动态报告
  • 基于Spring Boot的应届毕业生实习就业系统的设计(毕设-完整源码+论文)
  • 手表回收价格由什么决定?5 大定价因素一次性讲明白 - 讯息早知道
  • 2023长安·大数据产业生态大会举行,麒麟信安“操作系统+云”为大数据筑牢安全基座