インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

Powerpoint VBA 道や線路を描くマクロ

皆さんのブログは楽しく眺めさせてもらっているんですが,とにかく時間が無い毎日を送っているところで,まったく自分では書けていませんでした。

暇だけではありませんね,ネタもすぐにはポンと出てこない。

とりあえず,半端ない忙しさの毎日ですので,仕事を家でも職場でもやっている毎日。

嫌いならブラック極まりないですね。

好きなことなので,どこまでが趣味でどこまでが仕事か判別しにくいところ。

ストレスフリーではあります。(ΦωΦ)


本題に。。

数年間使われ続けていた地図を含む資料を作り直して印刷屋さんにお願いする,という仕事も同時並行で来まして,

すげーめんどくさいなぁと思いながらも,その地図を使い続けるのが気持ち的に許せない。

海岸線などはトレースしていけばある程度描いてくれるので,それでまぁできました。

学校での使用については問題ないと書かれていたので,国土地理院さんの地図を利用させていただいて,Illustratorである程度トレース。

さて,道路全部描くとうざいので,通学に使われている道だけを描かないといけないんですが,道って少なくとも二本線くらいでは描かないと,というところです。

電車の路線はもちょいめんどくさいですよね。。

そこで,それをなんとかするマクロを作ってみました。すごい単純ですが,私にはとてもいいものとなりました。(ΦωΦ)

時間が無いので雑ですみませんが,結果とコードを載せます。

f:id:chemiphys:20170416135055p:plain 元絵です
f:id:chemiphys:20170416135122p:plain 曲線でなぞって
f:id:chemiphys:20170416135155p:plain マクロで修正

こんなマクロです。

Option Explicit

Sub MakeRoad()
    Dim roadOutline As Shape
    Dim roadInline As Shape
    
    Set roadOutline = ActiveWindow.Selection.ShapeRange(1)
    Set roadInline = roadOutline.Duplicate(1)
    
    roadOutline.Line.Weight = 4.5
    roadOutline.Line.ForeColor.RGB = vbBlack
    roadInline.Line.Weight = 2.25
    roadInline.Line.ForeColor.RGB = vbWhite
    roadInline.Left = roadInline.Left - 12
    roadInline.Top = roadInline.Top - 12
    
    Dim ActiveSlide As Slide: Set ActiveSlide = ActiveWindow.View.Slide
    ActiveSlide.Shapes.Range(Array(SIndex(roadOutline), SIndex(roadInline))).Group
End Sub
Sub MakeRailroad()
    Dim roadOutline As Shape
    Dim roadInline As Shape
    
    Set roadOutline = ActiveWindow.Selection.ShapeRange(1)
    Set roadInline = roadOutline.Duplicate(1)
    
    roadOutline.Line.Weight = 4.5
    roadOutline.Line.ForeColor.RGB = vbBlack
    roadInline.Line.Weight = 2.25
    roadInline.Line.ForeColor.RGB = vbWhite
    roadInline.Line.DashStyle = msoLineLongDash
    roadInline.Left = roadInline.Left - 12
    roadInline.Top = roadInline.Top - 12
    
    Dim ActiveSlide As Slide: Set ActiveSlide = ActiveWindow.View.Slide
    ActiveSlide.Shapes.Range(Array(SIndex(roadOutline), SIndex(roadInline))).Group
End Sub

Sub Edit2ndItemNode()
    Dim targetShape As Shape: Set targetShape = ActiveWindow.Selection.ShapeRange(1).GroupItems(1)
    targetShape.Select
End Sub

Function SIndex(ByVal targetShape As PowerPoint.Shape) As Long
    Dim TargetSlide As Slide: Set TargetSlide = ActivePresentation.Slides(targetShape.Parent.SlideIndex)
    
    If targetShape.Child = msoTrue Then '完全に真似させてもらった。グループ内図形の場合は親を返す
        Let SIndex = SIndex(targetShape.ParentGroup)
        Exit Function
    End If
    
    Dim db As Object: Set db = CreateObject("Scripting.Dictionary")
    Dim s As Shape
    Dim i As Long: i = 1
    
    For Each s In TargetSlide.Shapes
        db(s.Id) = i
        i = i + 1
    Next
    
    Let SIndex = db.Item(targetShape.Id)
    
End Function

MakeRoadというのが,一本線を 道のような二重線にします。
MakeRailroadというのが,一本線を 路線のようにします。白の点線のっけてるだけです。

ちょこっと編集したいというときに,二本の線を重ねていますので,下の線を選ぶのが大変です。
その時のために,下の黒線(グループ内のインデックスでは1となります。)を選ぶマクロがEidt2ndItemNodeです。
選ぶとこまではできますが,編集状態にするやり方はわからないので,キーボードにあるメニュー出すキーを押して頂点の編集を選べば下の線が編集できます。
完全に自分用マクロです(´▽`) '`,、'`,、

こんなものが役に立つ人がいるのかわかりませんが,とりあえず目新しいことが書けるネタだったので書きました。

今年度安定して記事が書けるまでとりあえず仕事がんばらないとなぁ( ´ー`)フゥー...

Duplicate後の図形のずれって私が前扱ったときは15だったと思うんですが,今回数値を書き出させると12でした。

何に依存するのかなぁ。

もし,きちんと図形が重ならなくてだめやんとなった方は,

    roadInline.Left = roadInline.Left - 12
    roadInline.Top = roadInline.Top - 12

イミディエイトウィンドウでずれの数値を確認して,上記部分をいじってもらえば,どうにかなると思われます。