読者です 読者をやめる 読者になる 読者になる

Powerpoint VBAを使おう!

Powerpoint VBAやExcelのVBAで遊んでいます。Word VBAも始めました。

図形を描くために② 三角関数のグラフを描いてみる。

オートシェイプを関数で描かせるには,注意点がいくらかあるので,自分のためにもメモ。

Option Explicit

Sub test()
    Dim TSlide As Slide: Set TSlide = ActivePresentation.Slides(1)
    Dim i As Long, y As Long
    Dim StartX As Long: StartX = 50
    Dim StartY As Long: StartY = 100
    Dim dX As Long: dX = 5
    Dim dP As Currency: dP = 3.14 / 20
    Dim A As Long: A = 100
    Dim drwWave As FreeformBuilder, shpWave As Shape
    
    
    For i = 0 To 100
        
        y = CLng(A * Sin(dP * i))
        
        If i = 0 Then
            Set drwWave = TSlide.Shapes.BuildFreeform(msoEditingAuto, StartX, StartY - y)
            'drwWave.AddNodes msoSegmentLine, msoEditingAuto, StartX + 1, StartY - y
        End If
        
        drwWave.AddNodes msoSegmentLine, msoEditingAuto, StartX + i * dX, StartY - y
    Next
    Set shpWave = drwWave.ConvertToShape
    
    shpWave.Line.ForeColor.RGB = RGB(255, 0, 0)
    shpWave.Line.Weight = 2
    shpWave.Line.DashStyle = msoLineLongDash
End Sub

このコードを実行するとこんな感じ。
f:id:chemiphys:20161231003911p:plain
簡単にsinカーブが描けていると思います。わたしがやってることの基本はこんな感じです。
実際には合成波とかを考えるために,配列に波二つ分出して,足し算とかに使ってるので,かなり面倒な感じになってます。
大事なところが伝わりにくいので,今回はかなりシンプルに。

説明のメモ
今回はスライドショーでの実施を想定していません。ただ描くことだけなので,スライド1をTSlideとしています。

Dimがかなりの場所を占めてますね。宣言を強制してるので書かないわけにはいきません。
・グラフの書き始めはどうにでも変更できるように,StartXやStartYということで早めに書いています。
・x方向の増分はdXとしています。幅を調整できるように。
・位相は弧度法で考えることになってたと思うので,円周率を割るということで,dPという変数に入れています。
 今は20分割で描いてますが,細かく出す場合は適当に変更すれば変わります。
 変数の型はsingle,double,currencyどれでも影響はないとオモイマス。

フリーフォームで描く場合は,最初FreeformBuilderで描き始めて,AddNodesでポイントを追加していって,最後にConvertToShapeでShapeにします。
このために,drwWaveとshpWaveという二つを宣言しています。

関数 y=CLng(A*Sin(dp*i)) を二度書きたくないので,最初のポイントとその後で動作を変えます。( if i=0 then ~)
コメントアウトしている行は,1点しか点が描けていない場合,ConvertToShapeで怒られます。
なので,わたしは苦肉の策で,x方向に1だけずらした点をすぐ書いてエラーを回避するという手を取るためそれを書いている文です。
ここスマートにやれたらいいんですが,面倒なので手抜きでわたしはこんな風にします。。

最後のあたりは,線の色や種類をいじっているだけです。

これだけで関数をオートシェイプ化できますので,関数をきれいに書くのむずかしいなぁと思われている方,いかがでしょう。