前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让Excel工作表中的形状动起来

让Excel工作表中的形状动起来

作者头像
fanjy
发布2024-03-25 13:47:59
900
发布2024-03-25 13:47:59
举报
文章被收录于专栏:完美Excel完美Excel

标签:VBA

下面是在网上找到的一段程序,可以让工作表中指定的矩形动起来。一个动作是转圈,一个动作是走斜线,如下图1所示。

图1

示例中矩形的名称为“Rectangle 1”。示例代码如下:

代码语言:javascript
复制
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '等待时间(毫秒)
Sub Move_Square()
 Dim centerLeft As Long
 Dim centerTop As Long
 Dim Radius As Double
 Dim Theta As Double
 
 centerLeft = 300
 centerTop = 300
 Radius = 100
 
 With ActiveSheet.Shapes(1)
   For Theta = 0 To 2 * Application.Pi() Step Application.Pi() / 48
     .Left = centerLeft + (Radius * Cos(Theta))
     .Top = centerTop + (Radius * Sin(Theta))
     Sleep 40
     DoEvents
   Next Theta
 End With
End Sub

Sub test()
 Sheet1.Shapes("Rectangle 1").Left = 300
 Sheet1.Shapes("Rectangle 1").Top = 200
 MoveShape Sheet1.Shapes("Rectangle 1"), 0!, 0!, #12:00:01 AM#
End Sub

Sub MoveShape(shp As Shape, ByVal fLeft As Single, ByVal fTop As Single, t As Date)
 ' 将指定的形状从它所在的位置移动到它经过间隔t的位置
 Const d2R = 1.74532925199433E-02
 Const n1   As Long = 20 ' 加速/减速步数
 Const n2   As Long = 20
 Const n    As Long = 2 * n1 + n2 '  总步数
 
 Dim fcv    As Single ' 滑行速度,像素/步
 Dim i      As Long
 Dim v      As Single ' 给定步数的速度
 
 Dim fNumLeft As Single ' 左侧插值分数分子
 Dim fNumTop As Single ' 顶部插值分数分子
 Dim fDen   As Single ' 插值分数分母
 Dim fLeftold As Single ' 原始左侧位置
 Dim fTopOld As Single ' 原始顶部位置
 
 fcv = 1 / (n - n1)
 
 With shp
   fLeft = fLeft - .Left
   fTop = fTop - .Top
   fLeftold = .Left
   fTopOld = .Top
 
   For i = 1 To n
     Select Case i
       Case 1 To n1
         ' 加速
         v = fcv * (1 + Cos(d2R * 180 * (1 + i / n1))) / 2
       Case n1 + 1 To n - n1
         ' 恒速
         v = fcv
       Case Else
         ' 减速
         v = fcv * (1 + Cos(d2R * 180 * (1 + (n - i) / n1))) / 2
     End Select
 
     Debug.Print Right("  " & i, 3) & _
       Format(v, "  0.00000") & _
       Format(.Left, "  ##0.0")
 
     .Left = .Left + v * (fLeft - fNumLeft) / (1 - fDen)
     .Top = .Top + v * (fTop - fNumTop) / (1 - fDen)
     fDen = fDen + v
     fNumLeft = .Left - fLeftold
     fNumTop = .Top - fTopOld
     DoEvents
     Sleep t * 86400000# / n
   Next i
 End With
End Sub

有兴趣的朋友,可以试试。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档