科学风景真好分享 http://blog.sciencenet.cn/u/sunbing01

博文

刘瑞祥:在PPT中用VBA实现精确绘图

已有 5970 次阅读 2018-11-16 16:07 |个人分类:编程|系统分类:科普集锦

  PPT里虽然绘图方便,但很多时候不够精确,比如我们要画一个120度的弧线,就很难做到准确。要想达到准确,最好的方法是用vba进行编程。下面我就写几段这样的程序。注意,这里只是针对一些图形难以精确画图的问题说的,所以不是vba画图语句大全。为清晰起见,下面的程序把关键地方加粗了。

先给出参数说明:

  • t:图形到幻灯片页面顶部距离

  • l:图形到幻灯片页面左边距离

  • w:图形宽度

  • h:图形高度(以上四个数据不是弧线本身所占据的位置和大小,而是弧线所属椭圆占据的位置和大小)

  • a1:角度1

  • a2:角度2(两个角度以横向右为正0度,逆时针为正,不明白的可以回忆中学数学课)

  • a3:空心环宽度比例(0-100,100及以上为满扇形)


  第1、2、3段程序中加粗语句的第一个参数决定了要绘制图形的类型,后四个参数分别决定了要绘制图形的位置和大小,即决定的是下左图中的八个浅色小点的位置,而s.Adjustments.Item(n)=…决定的是图形的具体形状,对应下左图中小黄点的位置。第四段程序中的加粗语句是以数组为参数,这些数组决定了多边形顶点坐标(见下右图的小黑点)。

  各个参数中的长度以“磅”为单位,角度以度为单位。厘米转化为磅的代码为:

Public Function cm2p(cm As Single) As Single

    cm2p = cm * 28.35

End Function

  我们可以先以厘米为单位设计好图形尺寸,用以上代码将其转化为磅,然后调用绘图程序。


程序1:画圆弧

Private Sub Draw1(t,l,w,h,a1,a2)

    On Err GoTo Err:

    Dim s As Shape

    Set s =ActiveWindow.View.Slide.Shapes.AddShape(msoShapeArc, t, l, w, h)

    s.Adjustments.Item(1) = -a2

    s.Adjustments.Item(2) = -a1

    Exit Sub

Err:

    MsgBox Err.Description, vbCritical + vbOKOnly, "错误"

End Sub


程序2:画弓形(在PPT里称为“弦形”,即弦及所对应的圆弧)

Private Sub Draw2(t, l, w, h, a1, a2)

    On Err GoTo Err:

    Dim s As Shape

    Set s = ActiveWindow.View.Slide.Shapes.AddShape(msoShapeChord, t, l, w, h)

    s.Adjustments.Item(1) = -a2

    s.Adjustments.Item(2) = -a1

    Exit Sub

Err:

    MsgBox Err.Description, vbCritical + vbOKOnly, "错误"

End Sub


程序3:画空心弧

Private Sub Draw3(t, l, w, h, a1, a2, a3)

    On Err GoTo Err:

    Dim s As Shape

    Set s =ActiveWindow.View.Slide.Shapes.AddShape(msoShapeBlockArc, t, l, w, h)

    s.Adjustments.Item(1) = -a2

    s.Adjustments.Item(2) = -a1

    s.Adjustments.Item(3) = a3 / 200     '将a3转化为0-0.5之间

    Exit Sub

Err:

    MsgBox Err.Description, vbCritical + vbOKOnly, "错误"

End Sub


程序4:画多边形(本例为画一个直角三角形,数组参数为顶点的坐标,其中a(*,0)为横向坐标,a(*,1)为纵向坐标,实际运行时改变其中的数组即可。如果首尾顶点坐标相同则为闭合的多边形,不同为折线段)

Private Sub Draw4( )

On Err GoTo Err:

    Dim arr() As Single

        ReDim arr(0 To 3, 0 To 1)

        arr(0, 0) = 0: arr(0, 1) = 0: arr(1, 0) = 0: arr(1, 1) = 100

        arr(2, 0) = 200: arr(2, 1) = 100: arr(3, 0) = 0: arr(3, 1) = 0

    ActiveWindow.View.Slide.Shapes.AddPolyline SafeArrayOfPoints:=arr

    Exit Sub

Err:

    MsgBox Err.Description, vbCritical + vbOKOnly, "错误"

End Sub


程序5:调整连接符。本例是先选择一个连接符对象,然后利用下面程序进行调整,即这里并没有创建新的连接符,而且本程序里连接符是否连接到已有对象以及连接符的类型【直线、肘形、曲线】

Private Sub Draw5(Optional a1=0,Optional a2=0.5,Optional a3=1)

On Error Goto Err:

    With ActiveWindow.Selection.ShapeRange(1)

        If .Connector = msoFalse Then        

            MsgBox "您选择的不是连接符,请选择一个连接符对象。", vbCritical + vbOKOnly, "警告"

        Else

            If .Adjustments.Count = 0 Then

                MsgBox "没有可以调整的点,如果您选择的是直线连接符,请改为肘形连接符或曲线连接符再进行调整。", vbOKOnly + vbInformation

           Else

                .Adjustments.Item(1)=a1

                If .Adjustments.Count >1 Then .Adjustments.Item(2)=a2

                If .Adjustments.Count >2 Then .Adjustments.Item(3)=a3

            End If

        End If

    End With

    Exit Sub

Err:

    MsgBox "没有选择对象,请选择一个连接符对象。", vbOKOnly + vbCritical, "警告"

End Sub




https://blog.sciencenet.cn/blog-3388899-1146606.html

上一篇:致科学网小编一个关于博客的问题
下一篇:请教张云老师两个电路的动画
收藏 IP: 221.197.66.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-19 15:59

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部