構成図自動結線マクロ(その4)一括削除と1つ削除
2021年09月21日
今回もオートシェープの自動結線マクロの話。
挿入したコネクタがイメージと違ったなんてことよくある。
一括で挿入したものを1つずつ消すのは辛い。
手動操作ならUnDo(Ctrl+z)が効くが、マクロだと戻せないので
削除機能を実装してみた。
現在選択中のオブジェクトがいくつあるから・・・なんで複数なことをやろうとしたけど、
名称に設定した通番の最大値をもつオブジェクトを調べて消すだけじゃん。
通番管理でコネクタの挿入処理は複雑になったけど、しゃーない。
名称は、 "myCn_" で始まるように統一したので、"myCn_"を含むオブジェクトを全削除する機能も実装。
ちなみにオートシェープの一覧はAlt+F10で確認ができる。
以下、ソース。
挿入したコネクタがイメージと違ったなんてことよくある。
一括で挿入したものを1つずつ消すのは辛い。
手動操作ならUnDo(Ctrl+z)が効くが、マクロだと戻せないので
削除機能を実装してみた。
現在選択中のオブジェクトがいくつあるから・・・なんで複数なことをやろうとしたけど、
名称に設定した通番の最大値をもつオブジェクトを調べて消すだけじゃん。
通番管理でコネクタの挿入処理は複雑になったけど、しゃーない。
名称は、 "myCn_" で始まるように統一したので、"myCn_"を含むオブジェクトを全削除する機能も実装。
ちなみにオートシェープの一覧はAlt+F10で確認ができる。
以下、ソース。
PR
構成図自動結線マクロ(その3)コネクタの調整
2021年09月20日
今回もオートシェープの自動結線マクロの話。
結線することはできたけど、鍵コネクタでつなぐと線が重なって見えない。
これだと困るのでコネクタの形状を調整するマクロを作った。
アジャストは
shp.Adjustments.Item(1) = 0~1で指定するらしい。
コネクタの場合、線分のどの位置で折り曲がるかを設定する。
初期値は0.5で、ちょうどまんなかで鍵型になる。
やりたいことは、複数選択したコネクタで曲げる位置をずらす。
初期のアジャスト位置に対して、コネクタ番号×5%でずらす仕様に。
試してみると、50~80%にコネクタが集まるので、全体を手前にずらすことも必要とわかった。
で、番号順にずらす機能と全体をそのままずらす機能を±両方向へ設定可能にした。
Const adjustNum = 5 / 100 'アジャスタの分母 小さい方がずれる
shp.Adjustments.Item(1) = shp.Adjustments.Item(1) ± i * adjustNum
iを1に変更すれば全体がシフトする。
こんな感じ
以下、ソース。
結線することはできたけど、鍵コネクタでつなぐと線が重なって見えない。
これだと困るのでコネクタの形状を調整するマクロを作った。
アジャストは
shp.Adjustments.Item(1) = 0~1で指定するらしい。
コネクタの場合、線分のどの位置で折り曲がるかを設定する。
初期値は0.5で、ちょうどまんなかで鍵型になる。
やりたいことは、複数選択したコネクタで曲げる位置をずらす。
初期のアジャスト位置に対して、コネクタ番号×5%でずらす仕様に。
試してみると、50~80%にコネクタが集まるので、全体を手前にずらすことも必要とわかった。
で、番号順にずらす機能と全体をそのままずらす機能を±両方向へ設定可能にした。
Const adjustNum = 5 / 100 'アジャスタの分母 小さい方がずれる
shp.Adjustments.Item(1) = shp.Adjustments.Item(1) ± i * adjustNum
iを1に変更すれば全体がシフトする。
こんな感じ
以下、ソース。
構成図自動結線マクロ(その2)接続点の変更
2021年09月20日
前回、オートシェープの自動結線するマクロを作った。
ブログのアップにあたって手直ししたけど、
初回バージョンは上から下に線を引く想定だったので
こんな残念な結合点に。
で、始点と終点の接続点を回転できると便利そうなので作った。
コネクタを選択した状態で、
「始点を回転」、「終点を回転」ボタンをクリックすると
コネクタの接続点が反時計回りに回転する。
【回転前】
【回転後】
前回も触れたけど、鍵コネクタの接続点のオートシェープ名が取得できず苦戦。
わかってしまえばなんてことないのにね。
参考ページ(Edgeのコレクション機能便利だわ・・・)
https://infoment.hatenablog.com/entry/2018/09/21/072707
https://vba-andmore.hatenablog.com/entry/2016/05/11/220000
以下、ソース。
ブログのアップにあたって手直ししたけど、
初回バージョンは上から下に線を引く想定だったので
こんな残念な結合点に。
で、始点と終点の接続点を回転できると便利そうなので作った。
コネクタを選択した状態で、
「始点を回転」、「終点を回転」ボタンをクリックすると
コネクタの接続点が反時計回りに回転する。
【回転前】
【回転後】
前回も触れたけど、鍵コネクタの接続点のオートシェープ名が取得できず苦戦。
わかってしまえばなんてことないのにね。
参考ページ(Edgeのコレクション機能便利だわ・・・)
https://infoment.hatenablog.com/entry/2018/09/21/072707
https://vba-andmore.hatenablog.com/entry/2016/05/11/220000
以下、ソース。
構成図自動結線マクロ(その1)
2021年09月20日
構成図自動結線マクロ(その1)
会社の同僚がエクセルを使って物理構成図を作成していた。
接続するLANポートをオートシェープで作って、そこに番号を振る。
そして、ポート同士を直線コネクタや鍵コネクタで接続する。
LANケーブル90本も引くのに、手作業は辛すぎないか・・・?
しかも、LANポートの位置をずらすと鍵コネクタのアジャスタが
初期化されて動かせず。
これはやばすぎる!!ってことでオートシェープ関係について調べてみた。
まずは物理構成図の基本をチェック。
https://shigotoswitch.com/?p=1231
確かにオブジェクト選択とセルに合わせるボタンを用意しとくと便利。
次に見つけたのがこれ。★
http://blog.livedoor.jp/qoozy/archives/52567093.html
複数のオートシェープを選択してマクロを実行すると、
1つ目に選択したシェイプから2~n番目のシェイプに線を引いてくれる。
これは素晴らしい!!
ソースも書いてあるので、流用させてもらうことにした。
ここでやりたいことの整理。
1.構成図を書くうえで、結線を簡単に描きたい。
2.完成した構成図から結線リストを作成したい。
3.鍵コネクタの線が重なるのを避けたい。
4.なるべく汎用性を持たせるために、修正や取り消しをしたい。
大体こんな感じ。
1については、上記のページを流用すればOK。
2は、コネクタを接続したときに両端のオブジェクトの名前を取得できればいけそう。
3は余力があれば。。。
さっそく★ページのソースを流用してつくってみた。
With ActiveSheet.Shapes.AddConnector の部分で仮のコネクタを作成する。
以下のメソッドで始点と終点のオブジェクトおよび接続箇所を指定。
.ConnectorFormat.BeginConnect Selection.ShapeRange(1), 3 '最初にクリックしたものから
.ConnectorFormat.EndConnect Selection.ShapeRange(i), 1
後々ハマったんだけど、「Selection.ShapeRange(1)」で指定するのはいまいちで
コネクタの接続点の図形名称を取得できなくなる。
【修正前】For i = 1 To Selection.ShapeRange.CountのSelection.ShapeRange(i)
【修正後】For Each shp In Selection.ShapeRangeのshp(shpはShapeオブジェクト)
カンマの後の数値が接続点で、1:上、2:左、3:下、4:右 だった。
今回は、下から上に接続で固定。
.RerouteConnectionsを指定すると、接続点を自動判定してくれるけど
修正が大変になるので使用見送り。
2つのオブジェクトでSelection.ShapeRange(i).Topを比較して決定した。
今回は長くなるのでいったん終了。
引く線は、直線コネクタと鍵コネクタと曲線コネクタの3種類を用意。
With ActiveSheet.Shapes.AddConnector(線種, 0, 0, 0, 0)で
線種を変更すればいいんだけど、withの中身だったのでうまくパラメータ化できず
ださい作りになってしまった。
他の部分はせめてパラメータ化しないとと思って直してたら
コネクタ種類の数値オプションあんじゃん。自作の受け渡しの値と同じだし。
終盤に出てくるオブジェクト名の命名や冒頭に出てくるmaxNumの計算は
自作したコネクタのやり直しマクロへの布石。
オリジナルの名称と通番を振っておけば、けつから順に削除できる。
(UnDoを作るつもりだったけど、1つだけ消すほうが簡単で便利だった。)
NameArrayは、終了時に挿入したコネクタを選択状態にしたかったから用意。
結果はこんな感じ。
【実行前】FWのLポートを最初に選択。
【実行後】FWのLポートから各ポートにコネクタを作成。
以下、ソース。
会社の同僚がエクセルを使って物理構成図を作成していた。
接続するLANポートをオートシェープで作って、そこに番号を振る。
そして、ポート同士を直線コネクタや鍵コネクタで接続する。
LANケーブル90本も引くのに、手作業は辛すぎないか・・・?
しかも、LANポートの位置をずらすと鍵コネクタのアジャスタが
初期化されて動かせず。
これはやばすぎる!!ってことでオートシェープ関係について調べてみた。
まずは物理構成図の基本をチェック。
https://shigotoswitch.com/?p=1231
確かにオブジェクト選択とセルに合わせるボタンを用意しとくと便利。
次に見つけたのがこれ。★
http://blog.livedoor.jp/qoozy/archives/52567093.html
複数のオートシェープを選択してマクロを実行すると、
1つ目に選択したシェイプから2~n番目のシェイプに線を引いてくれる。
これは素晴らしい!!
ソースも書いてあるので、流用させてもらうことにした。
ここでやりたいことの整理。
1.構成図を書くうえで、結線を簡単に描きたい。
2.完成した構成図から結線リストを作成したい。
3.鍵コネクタの線が重なるのを避けたい。
4.なるべく汎用性を持たせるために、修正や取り消しをしたい。
大体こんな感じ。
1については、上記のページを流用すればOK。
2は、コネクタを接続したときに両端のオブジェクトの名前を取得できればいけそう。
3は余力があれば。。。
さっそく★ページのソースを流用してつくってみた。
With ActiveSheet.Shapes.AddConnector の部分で仮のコネクタを作成する。
以下のメソッドで始点と終点のオブジェクトおよび接続箇所を指定。
.ConnectorFormat.BeginConnect Selection.ShapeRange(1), 3 '最初にクリックしたものから
.ConnectorFormat.EndConnect Selection.ShapeRange(i), 1
後々ハマったんだけど、「Selection.ShapeRange(1)」で指定するのはいまいちで
コネクタの接続点の図形名称を取得できなくなる。
【修正前】For i = 1 To Selection.ShapeRange.CountのSelection.ShapeRange(i)
【修正後】For Each shp In Selection.ShapeRangeのshp(shpはShapeオブジェクト)
カンマの後の数値が接続点で、1:上、2:左、3:下、4:右 だった。
今回は、下から上に接続で固定。
.RerouteConnectionsを指定すると、接続点を自動判定してくれるけど
修正が大変になるので使用見送り。
2つのオブジェクトでSelection.ShapeRange(i).Topを比較して決定した。
今回は長くなるのでいったん終了。
引く線は、直線コネクタと鍵コネクタと曲線コネクタの3種類を用意。
With ActiveSheet.Shapes.AddConnector(線種, 0, 0, 0, 0)で
線種を変更すればいいんだけど、withの中身だったのでうまくパラメータ化できず
ださい作りになってしまった。
他の部分はせめてパラメータ化しないとと思って直してたら
コネクタ種類の数値オプションあんじゃん。自作の受け渡しの値と同じだし。
終盤に出てくるオブジェクト名の命名や冒頭に出てくるmaxNumの計算は
自作したコネクタのやり直しマクロへの布石。
オリジナルの名称と通番を振っておけば、けつから順に削除できる。
(UnDoを作るつもりだったけど、1つだけ消すほうが簡単で便利だった。)
NameArrayは、終了時に挿入したコネクタを選択状態にしたかったから用意。
結果はこんな感じ。
【実行前】FWのLポートを最初に選択。
【実行後】FWのLポートから各ポートにコネクタを作成。
以下、ソース。
リストにある文字列を含むか判定_改良版
2021年06月14日
前回作ったツールで12万行のリストと照合をかけたら
400行を処理するのに460秒。1行で1秒かかった。。。
それと、リストに空白セルがあると
誤カウントで処理が終わらないことが判明。
比較条件にリストが空白でないことを追加した。
IF Key1List(j) <> "" And
IF Key2List(j) <> "" And
処理時間については、
比較対象の列を配列に格納して、配列同士を比較する処理に変更してみた。
Dim KeyText(): ReDim KeyText(LastRow)
Cells(Gyo, KeyCol) = KeyText(Gyo)
セルの値を読み込む回数は変わらないので
これだけじゃダメかなと思いつつも実験。
結果はなんと、30秒で処理完了。
そんな爆速になるなんてびっくり!
以下ソース。
400行を処理するのに460秒。1行で1秒かかった。。。
それと、リストに空白セルがあると
誤カウントで処理が終わらないことが判明。
比較条件にリストが空白でないことを追加した。
IF Key1List(j) <> "" And
IF Key2List(j) <> "" And
処理時間については、
比較対象の列を配列に格納して、配列同士を比較する処理に変更してみた。
Dim KeyText(): ReDim KeyText(LastRow)
Cells(Gyo, KeyCol) = KeyText(Gyo)
セルの値を読み込む回数は変わらないので
これだけじゃダメかなと思いつつも実験。
結果はなんと、30秒で処理完了。
そんな爆速になるなんてびっくり!
以下ソース。