【ExcelVBA】ListBoxのコネクタ名を書き換える

前回、Dictionaryを使って、リスト項目の選択順を 図形の選択順に反映できるようにしました。 コネクタも無事、選択順に矢印が向くようになりました。 残すは、コネクタタイプを変更した時の リスト名を書き換える処理を考えて行きます。 まず、使用してるコネクタタイプは二つ、 直線 カギ線 タイプをListBoxに取り込む際、コネクタ名が、長い&英語って事で、 直線・カギ線と省略した、タイプ名を表示するようにしています。 ただ、タイプ変更した場合、リストの表示はそのままになっていて、 変更後に分かりにくい状態になっています。 リストの書き換えについては、二通りの処理を思いついたので、 順に記事にまとめようと思います。 ・リストから当該コネクタ名を検索して書き換える ・Dictionaryに当該コネクタを登録して書き換える まず、コネクタタイプ変更のプロシージャをおさらいします。 ConnectorChangeモジュール(標準モジュール) Sub ConnectorTypeChange(connector As String) Dim con As Shape '選択図形取得' Dim conName As String 'コネクタ名取得' '開始・終了図形の判別子' Const biginShape As Long = 1 Const endShape A…

続きを読む

【ExcelVBA】Dictionaryを使って図形を配列管理する

前回、コネクタのタイプ変更をListBoxからできるようにしました。 範囲選択でシェイプを選択して、コネクタだけをListBoxに取得したのですが、 フロー図形を省いているって事は、フロー図形のみ取得する事もできる訳で… コネクタ作成もListBoxが活用できるやん!って事で処理を作る事にしました。 新しくbookを作成して、今まで作った処理を盛り込んで、 実際に使える物に仕上げていきたいと思います。 まずコネクタ追加なんですが、ListBoxが必要になるので、 その辺りから準備します。 UserFoam上部に、選択中図形取得ボタンを設置。 コネクタ作成・コネクタ変更のListBoxを、2つを用意します。 どちらのListBoxも、ColumnCountを2、ColumnWidthsを50pt,0ptに設定します。 MultiSelectを、Single→Multiに変更して複数選択できるようにします。 選択中図形取得については、前回記事を流用して作ります。 標準モジュールを2つ追加して、 シェイプ管理用のShapeManagerモジュール UserFoam管理用のPanelManagerモジュール を作ります。 まずは、選択中図形取得から ShapeManager(標準モジュール) Option Explicit Sub SelectionShapeSearch() Dim sh As Shap…

続きを読む

【ExcelVBA】ListBoxを使ってコネクタを選択する

前回、コネクタタイプを変更できるようにしたのですが、 選択範囲内のコネクタが全て変更されてしまうので、 選択したコネクタだけを変更できるようにしたいなと考えています。 Ctrl+で選択もいいのですが、 複数あった場合、一つ一つクリックしていくのって手間が掛かります。 そこで何かいい方法がないかとネットを渡り歩いていた所、 Infomentのブログ ~Excel VBA奮闘記~ さんのブログを見つけました。 フローチャート作りをされていて、 詳しくコードを説明されているので参考にさせて頂きたいと思います。 リストボックスで選択した項目に対応するオートシェイプを選択する 有用な記事を有難うございます。 この場を借りてお礼申し上げます。m(_ _)m 早速、この記事を参考に導入してみます。 まずは、コネクタを読み込むリストボックスが必要になるので、 新しくUserFoamを追加します。 今回は、UserFoam2が空いてるので、そこに作って行きます。 必要なツールは、リストボックス・ボタン3つです。 コネクタの名前を取り込むリストボックス 範囲選択した図形の中から、コネクタを取得するボタン コネクタタイプを切り替える各ボタン2つです。 続いて、UserFoam2の管理用モジュールを作ります。 標準モジュールを追加して、UF2Controllerとリネームしておきます。 UF2Controller(標準モジュール) Opti…

続きを読む

【ExcelVBA】コネクタの種類を変更する

長らくブログ更新をサボって申し訳ないです(ToT)>゛スンマセン いろいろとやる事があって、暫く触れなかったので、 記事を書く事もできませんでした。 7月中は、なにかと忙しいので更新頻度は低いですが、 ぼちぼちと処理を作っていこうと思うので、温かい目で見守って頂けると助かります。 さて、フローチャート作りも、いよいよ大詰めになりました。 最後は、コネクタのタイプを変更するです。 コネクタのタイプを変更できるようにする意味なんですが、 接続した図形を移動させた場合、位置によって線タイプを変更する必要があります。 例えば、 こんな感じで図形を移動させると直線タイプでは表示が分かりにくくなります。 当然、カギ線に変更したいのですが、削除して引き直すってのは面倒です。 なので、コネクタを選択しておいて、タイプを切り替える処理を考えてみます。 単純に切り替えるだけでは、面白くないので、 カギ線の時は、結合点も変更できるようにしてみたいと思います。 はたして上手く作れるのか… ( ー̀ωー́ ).。oஇ 選択中のコネクタのタイプを切り替えるには、 現状のタイプを判別できないと切り替える事もできないので、 コネクタタイプを取得して、判別できるようにします。 コネクタのタイプを取得するには、ConnectorFormatプロパティを使います。 標準モジュール Option Explicit Sub Typ…

続きを読む

【ExcelVBA】動的配列で複数図形を一括接続する

最近、ウォーキングをするようになって、 少し減量に成功したケロです。 全然、記事とは関係ない事から書き始めましたが、 ウォーキング1hr~1.5hrほどするとPCを触る時間が減ります。 なのでブログも更新が進まないって事が書きたかったですが… 個人的な話なんでこれくらいにして。 フローの修正が残っていたので、まとめてみようと思います。 今回は、複数の図形に一括で直線を繋げる処理を作ってみます。 カギ線の場合、結合点を指定する必要があるので、 直線のみの対応になります。 ここで考えておく必要があるのが、 ・全図形なのか ・選択した図形なのか の二点です。 フローなら図形が当然増えていきます。 全図形にすると数が多い事や、後から追加した図形の接続を考えると、 選択した図形の一括接続がいいと思います。 まず、以前に作った図形接続のプロシージャを見てみます。 標準モジュール4に作っていたので、リネームしてLineConnectに変更します。 オブジェクト名を変更するとリネームする事ができます。 LineConnectモジュールを開いて、接続プロシージャを開きます。 標準モジュール(LineConnect) Option Explicit Sub Connection() Dim arrow As Shape '矢印線取得' Dim selectSh(2) As Sha…

続きを読む

【ExcelVBA】線を識別してループを飛ばす

フローチャート作りもいよいよ大詰めとなりました。 完成とするには、3つの課題が残っております。 ・図形揃えで線が反応する ・複数図形一括つなぎ ・線種を切り替える 今回は、図形揃えで線を反応させなくする処理を作ります。 おさらいになりますが、 図形の中央揃えをつくりました。 全ての図形と選択図形を中央揃えする、二つのプロシージャを作ったのですが、 標準モジュールが増えたので、どこに組んだか分からなくなるので、 まず、モジュールの名前を変更します。 図形中央揃えは、全図形と選択図形の二つなんですが、 選択図形の場合、線を選ばなければ問題ないので、 全図形の方を修正していきます。 修正する部分を確認する為にプロシージャを見てみます。 標準モジュール(ShapeCentering) Option Explicit Sub PositionCheck() Dim sh As Shape '図形取得' Dim cell As Range '図形下セル取得' Dim posLeft As Double '図形の左位置' Dim posTop As Double '図形の縦位置' Dim leftBorder As Double '横境界線' Dim topBorder As Double '縦境界線' Dim addLeft A…

続きを読む

【ExcelVBA】結合点を選択できるようにする

前回、図形を線で繋ぐ事ができたのですが、 いろいろと修正部分があるので、順次作っていこうと思います。 その前に、今回テストを繰り返す内に、標準モジュールが増えてしまいました。 コードを記載する際、標準モジュールとしていたのですが、 一つのモジュールに、何個もプロシージャを書いてるわけではないので、 分かりにくくなると思います。 どのモジュールに組んでるか分かり易くする為に、モジュール名を変更する事にしました。 モジュール名の変更は、 モジュールを選択するとオブジェクト名が表示されるので、 この部分(赤枠)を書き換える事で好きな名前にする事ができます。 少し逸れたので話を戻して、 今回は、カギ線繋ぎについて修正していきます。 カギ線繋ぎで問題なのが、 結合点が4に固定されてるのは、使い勝手が悪い。 図形を選択してないとエラーが出る。 図形の選択数が、1個の時、3個以上の時、機能しなくなる。 この辺りを修正する必要があります。 修正案として、 ・図形選択を2つに限定する ・結合点を選択できるようにする ・エラー対応 この3つを組み込んでみようと思います。 まずは、エラー対応と図形を2つ選択した時だけ機能する処理を作ります。 標準モジュール(LineConnect) Sub ElbowConnect() Dim arrow As Shape '矢印線取得' Dim s…

続きを読む

【ExcelVBA】図形を線で繋ぐ

図形移動が作れたので、いよいよ大詰めの “線で繋ぐ" でっす。 フローチャートなんで、線で繋がないと意味がないです。 繋ぐ方法は、線を引いて二つの図形を繋げるだけなんで、 簡単と言えば簡単なんですが… まずは、線で繋ぐ部分を手動で行ってみようと思います。 まずは、矢印線を選択してシート上に作成します。 線が引けたら繋ぎたい図形の結合点に、線の結合点を重ねる事で、 図形と線を接合する事ができます。 ひし形の図形にも矢印線を結合して、図形を移動させてみます。 結合された線は、図形と共に移動します。 これをコードにしていきます。 まずは、矢印線を引いてみます。 標準モジュール Option Explicit Sub Connection() Dim arrow As Shape Set arrow = ActiveSheet.Shapes.AddConnector(msoConnectorStraight, 250, 300, 250, 370) With arrow.Line .EndArrowheadStyle = msoArrowheadTriangle .Visible = msoTrue .Weight = 1.75 End With End Sub 説明する…

続きを読む

【ExcelVBA】図形をセル中央に整列させる

図形移動の処理を作れたのですが、 Dragで移動させられると楽なのにと思っています。 そこで、Drop時にセルの中央に合わせられないかと考えていたのですが、 実現が難しいんですよね。( ̄~ ̄;) ウーン いろいろと考えて思いついたのが、 図形を一括で整列させる方法です。 Drop時にセル中央に移動しなくても 移動させた図形を一括でセル中央に整列させられれば、 もう少し、直感的な作業ができるのでは!?と考えました。 これなら図形を個々に調整するより楽かもって事で処理を考えてみます。 まず図形がどのセル上にあるか判断する必要があります。 セルが分かれば、そのセルの中央に移動させるだけの処理なので簡単に作れそうです。 シート上の図形を取得して、どのセルか割り出します。 標準モジュール Option Explicit Sub CellSearch() Dim sh As Shape 'シート上の図形取得' Dim cell As Range '図形下のセルを取得' For Each sh In ActiveSheet.Shapes With ActiveSheet.Shapes(sh.Name) Set cell = Range(.TopLeftCell, .BottomRightCell) End With …

続きを読む

【ExcelVBA】図形を好きなセルに移動させる

フローチャートを作りたいって事で、 前回は、作図のコードを組む事ができました。 図形が用意できたので、続ていは移動処理を考えてみようと思います。 図形を移動させると綺麗に並べるのに手間が掛かります。 わざわざセルの、グリッド線に合わせたり、目算で中央に合わせたり… 正直面倒でっす。ヽ(´~`;)ウーン 移動させたら自動的にセル中央に揃ってくれると楽なのにと 何度思った事か。 今回は、この辺りを考えてみようと思っています。 移動のさせ方なんですが、Drag&Dropで狙ったセルに移動させる方法が、 直感的で楽な方法なんですが、実装が困難なんです。 マウスのクリックを検知する方法が独特なんです。 フォーム上とかオブジェクト上と限定的で、 シート上では検出するのが難しいんですよね。 WindowsAPIを使えば実装できるようなんですが、 正直、敷居が高くて難しいです。 なので違う方法を考えてみます。 図形を移動させるには、 ・移動させる図形を取得 ・移動先のセルを取得 二つの動作が必要になります。 まずは、図形の取得を作ってみます。 ・選択した図形を取得する まず、どの図形を動かすかって事が分からないと移動させる事もできないので、 選択中の図形を特定していきます。 方法としては、二つあって、 ・全図形の中から選択中の物を探す ・クリックした時に図形を取得する 全シェイプ中から探す場…

続きを読む