t-hom’s diary

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

VBA フローチャート作成ツールBread Chartに挿入機能検討

先ほど新版を公開したところだけど、以前から悩んでいた機能がなんとか実現できそうな感じがしてきたので、取り急ぎコードだけここに書いておく。
thom.hateblo.jp

実現したい機能

たとえば下図のようなことをやりたいとする。
f:id:t-hom:20190309235109p:plain

しかし、単純に列ごと切り取って挿入すると、コネクターが切れてぐちゃぐちゃに。
f:id:t-hom:20190309235433p:plain

また、単純に行挿入したけれど、プレースホルダーが無くてプロセスを配置できない。
f:id:t-hom:20190309235637p:plain

現状のバージョン1.2では、ひな形から作り直すしかない。

今回はこれを何とかするコードをとりあえず書いてみた。
とりあえずなので、ユーザーインターフェースはなく、F8で実行する仕様。
もちろん、中途半端なのでGitHubには反映させていない。

コード

標準モジュールを挿入してUtilとでもしておくと良い。

Sub FixConnectorBug()
    Dim sh As Shape
    For Each sh In ActiveSheet.Shapes
        Select Case sh.AutoShapeType
        Case _
            msoShapeFlowchartProcess, _
            msoShapeFlowchartDecision

            '切れたように見えて論理的につながっているコネクタの表示を直すには、
            'コネクタがつながっているシェイプを少し移動すれば良いことに気付いた。
            '移動してから戻すというコードを考えたけれど、
            'マクロで対応するときは移動しなくても位置を再設定さえすれば直った。
            '以下の一行は一見無意味に見えて、表示バグを修正しているコード。
            sh.Left = sh.Left
        End Select
    Next
End Sub

Sub InsertPlaceholderToSelection()
    Const ProcessWidth As Double = 100
    Const ProcessHeight As Double = 40
    Dim r As Range
    For Each r In Selection
        Dim sh As Shape
        Set sh = ChartSheet.Shapes.AddShape( _
            Type:=msoShapeFlowchartProcess, _
            Left:=r.Left + (r.Width - ProcessWidth) / 2, _
            Top:=r.Top + (r.Height - ProcessHeight) / 2, _
            Width:=ProcessWidth, _
            Height:=ProcessHeight)
        Call DeactivateProcess(sh)
        sh.OnAction = "Click"
    Next
End Sub

FixConnectorBugについて

列ごと入れ替えるとコネクターが切れると書いたけど、実は切れているわけではない。
コネクターを選択すると接続されていることを示す緑の端点が表示される。
実は下図でいう赤丸同士は、論理的にはつながっていて、表示がおかしいだけなのだ。
f:id:t-hom:20190310000235p:plain

右クリックで接続されているプロセスシェイプのどちらかを選択し(左だとマクロが発動するので)、その状態で左クリックでドラッグすると接続が元に戻ることを発見した。
f:id:t-hom:20190310000717g:plain

FixConnectorBugを実行するとすべてのシェイプを探索し、プロセスか判断だった場合(つまりコネクタ以外)はLeftプロパティで位置を再設定する。これでコネクターの表示が正常に戻る。

InsertPlaceholderToSelection

これは、プロセスのプレースホルダーが無いセルを選択して実行するとそこにプレースホルダーを作成するマクロ。
ひな型作成コードの一部を取り出しただけなので、なにも苦労は無かった。さっさと作っておけばよかった。

課題

今のところ手作業で行列の挿入・セルの挿入等を行った後にマクロで補完する方式なので、機能としてマクロに搭載するならまるっと自動でやりたい。でも欲張るとなかなか公開できないのが悩みどころ。

先行で使いたい方いたら今回の記事からコピペしていただくと良いかと。

あと、セルの挿入機能を使う以上、書式ズレの問題が避けられないのも課題。これもきちんとやるのは面倒くさそうだなぁ。

いずれにしても、光明が見えたので良かった。従来はプロセスを一つずつズラす方式を頭の中でシミュレーションして破綻してたので、セル挿入機能をベースにする方針を思いついたのは大きな収穫。むしろなぜ気付かなかったのか謎だ。

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