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

t-hom’s diary

主にVBAネタを扱っているブログです。

VBA SmartArtを使ってシートごとに作業ステップを表示するバーを作成するマクロ

VBA

今回はVBAでSmartArtを使ってシートごとに作業ステップを表示するバーを作成してみようと思う。

作成物のイメージはこのようなもの。
f:id:t-hom:20170119111553p:plain

今回マクロで作成するのは上部のStepを表示するバーの部分だけ。

シート2ならStep2がハイライトされる。
f:id:t-hom:20170119105223p:plain

ひとつの業務に使用する一連のマクロをExcelブックにまとめてしまうことがよくある。
実行順が決まっており、それぞれシートに分かれている場合にこのようにステップが表示されていると気が利くと思われるかもしれない。

手でも作れるけれど、色の塗り分けが面倒なのと、ステップの変更などで何度も入れ替えたりする必要が出てくるかもしれないのでここはマクロでさくっと作れるようにしておきたい。

ということで早速完成コードの紹介。

Sub Stepバー作成()
    Dim sheetNo As Long
    For sheetNo = 1 To ThisWorkbook.Worksheets.Count
        'Stepバー生成
        Dim ws As Worksheet: Set ws _
            = ThisWorkbook.Worksheets(sheetNo)
        Dim sh As Shape: Set sh _
            = ws.Shapes.AddSmartArt(Application.SmartArtLayouts( _
                "urn:microsoft.com/office/officeart/2005/8/layout/hChevron3"), 5, 5)
        sh.Height = 20
        sh.Width = 500
        
        '一旦ノードを全削除
        Dim i As Long
        For i = 1 To sh.SmartArt.Nodes.Count
            sh.SmartArt.Nodes.Item(1).Delete
        Next
        
        'ブックの数だけノードを追記しつつ、
        '対象ブックのStepだけオレンジに、それ以外はグレーアウト
        Dim stepNo As Long
        For stepNo = 1 To ThisWorkbook.Worksheets.Count
            With sh.SmartArt.Nodes.Add
                .Shapes(1).Fill.ForeColor.RGB = IIf(sheetNo = stepNo, _
                    XlRgbColor.rgbOrange, _
                    XlRgbColor.rgbLightGray)
                .TextFrame2.TextRange.Text = "Step" & stepNo
            End With
        Next
    Next
End Sub

使い方は、シートをあらかじめ必要な枚数分追加しておいてこのマクロを実行するだけ。
するとシートの枚数に応じたStep数でバーが作成される。

このマクロはShape型、SmartArt型、SmartArtLayout型、SmartArtNode型の4つの関係を押さえておくと理解しやすい。が、これらについてはMSDNなどに説明を譲る。

オブジェクトブラウザやTypeName関数で、それぞれが持つプロパティがどのようなデータ型を返すのかを把握するのが理解のポイントである。

Application.SmartArtLayoutsにURLみたいな引数を渡している部分があるが、これはSmartArtの種類を示すIDである。覚えられるものではないし、マクロの記録で調べられるのでそこは気にしなくて良い。

あ、後で気づいたけど、この手のマクロはパワポのほうが活用できそう。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。