先ほど新版を公開したところだけど、以前から悩んでいた機能がなんとか実現できそうな感じがしてきたので、取り急ぎコードだけここに書いておく。
thom.hateblo.jp
実現したい機能
たとえば下図のようなことをやりたいとする。
しかし、単純に列ごと切り取って挿入すると、コネクターが切れてぐちゃぐちゃに。
また、単純に行挿入したけれど、プレースホルダーが無くてプロセスを配置できない。
現状のバージョン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について
列ごと入れ替えるとコネクターが切れると書いたけど、実は切れているわけではない。
コネクターを選択すると接続されていることを示す緑の端点が表示される。
実は下図でいう赤丸同士は、論理的にはつながっていて、表示がおかしいだけなのだ。
右クリックで接続されているプロセスシェイプのどちらかを選択し(左だとマクロが発動するので)、その状態で左クリックでドラッグすると接続が元に戻ることを発見した。
FixConnectorBugを実行するとすべてのシェイプを探索し、プロセスか判断だった場合(つまりコネクタ以外)はLeftプロパティで位置を再設定する。これでコネクターの表示が正常に戻る。
InsertPlaceholderToSelection
これは、プロセスのプレースホルダーが無いセルを選択して実行するとそこにプレースホルダーを作成するマクロ。
ひな型作成コードの一部を取り出しただけなので、なにも苦労は無かった。さっさと作っておけばよかった。
課題
今のところ手作業で行列の挿入・セルの挿入等を行った後にマクロで補完する方式なので、機能としてマクロに搭載するならまるっと自動でやりたい。でも欲張るとなかなか公開できないのが悩みどころ。
先行で使いたい方いたら今回の記事からコピペしていただくと良いかと。
あと、セルの挿入機能を使う以上、書式ズレの問題が避けられないのも課題。これもきちんとやるのは面倒くさそうだなぁ。
いずれにしても、光明が見えたので良かった。従来はプロセスを一つずつズラす方式を頭の中でシミュレーションして破綻してたので、セル挿入機能をベースにする方針を思いついたのは大きな収穫。むしろなぜ気付かなかったのか謎だ。