選択されている図形の種類を判定して図形のサイズと位置を再調整するボタンの中身のメモ
エクセルアドインの午後のパレットの午後の
見出し付きテキストボックスは複数の図形をグループ化しているだけ
レイアウトの崩れてしまったのを右の状態にするボタン
再調整画像付きTB
選択された図形を再調整する
これの動きのメモ
サイズの調整をしてから位置の調整をしている
サイズ調整は
見出しと本文の図形の幅を画像に合わせる
高さは文字に合わせる
位置の調整は
基準が見出し図形にして
画像図形を見出しの下側
本文を画像図形の下側
これには選択された図形が何の図形なのかを取得する必要がある
見出し図形なのか、本文用のテキストボックスなのかとか
これが難しかったのでメモしておこうかと
もっといい方法がありそうだけど思いつかない
グループ化された図形の選択状態は2種類ある
AとBと区別すると
これはグループ化図形をそのまま選択した状態で
名前のところが「グループ化 339」になっている
これがA
これはグループ化図形の中の見出し部分の図形を選択した状態
名前のところが「正方形/長方形 340」になっている
これがB
グループ化図形の中の画像図形を選択した状態
名前のところが「図 342」になっている
これもB
グループ化図形の中の1つの図形を選択しているBの違い
B状態は特殊で1つのグループ化図形を選択している時だけで
複数のグループ化図形を選択している状態では発生しない
こういう状況はありえない
複数図形を選択しているのにグループ化図形の中の1つの図形を選択した状態
左がB状態で右がA状態って言うことになはらない
必ずこうなる
A状態の選択が2つになる
図形のいろいろな選択状態(Selection.ShapeRangeの中)を見てみる
Sub testShape()
Dim SR As ShapeRange
Set SR = Selection.ShapeRange
End Sub
図形を選択した状態で↑を実行して一時停止して
SRの中身を見てみる
ローカルウィンドウの表示方法
メニューの表示からローカル ウィンドウで表示される
一個の四角形図形を選択した状態
グループ化図形ではないのでグループ化に関係するところの値は
GroupItemsがこのメンバにアクセスできるの~ParentGroupが指定された値は境界を超えて~
とかまともな値が入っていないのがわかる
TypeがmsoAutoShape
グループ化図形を選択した状態
ParentGroupはさっきと同じでエラーみたいになっている
TypeはmsoGroupになっている、この図形はグループ化図形ですってことかな
GroupItemsの中身を見てみる
Item1から3があってそれがが個別の図形を表しているみたい
Item1の中身を見てみる
Item1の型はVariant/Object/Shapeって表示されているから
図形
3つは見出しと本文と画像の3つの図形ってことみたい
グループ化図形の中の本文用図形のテキストボックスを選択した状態
GroupItemsはエラーみたいになっている
TypeはTextBoxになっている
ParentGroupはなにか値が入っているので中身を見てみる
Nameもグループ化 339ってなっている
ここまでまとめると
簡単に見分けることができるのはグループ化図形そのままの時で
これはType=msoGroupで判定できる
問題は単独図形なのかグループ化図形の中の1つなのかの判断
ParentGroupになにか値が入っているなら
グループ化図形の中の1つってことになるけど
この判定の仕方がわからない
例えば
Sub testShape()
Dim SR As ShapeRange
Set SR = Selection.ShapeRange
If IsError(SR.ParentGroup) Then ’エラーの判定
'処理
End If
If SR.ParentGroup Is Nothing Then ’空っぽの判定
'処理
End If
End Sub
エラーの判定と空っぽの判定どちらもエラーになる
指定された値は境界を超えていますはエラーでも空っぽでもないってことみたい
そうなんだろうけど、でもどうやって判定すればいいかわからないので
エラーになるならエラーになったら単独図形で
エラーにならなかったらグループ化図形の中の1つ
って判定することにした
複数の図形が選択されている場合
TypeはmsoShapeTypeMixedってのになっているなあ、これは気にしてない
複数の図形が選択されている場合の特徴は
Countが2以上の数値になっているのと
その数値分のItemがあること
なのでSelection.ShapeRange.Countが2以上なら
複数の図形が選択されているって判定できる
あとはそれぞれの図形の種類の判定
単独図形なら見出しの図形ってことになるからそれ以外の
見出し付きテキストボックスと画像付き見出し付きテキストボックス
この2つの中の図形をそれぞれ判定することになる
2つのグループ化図形を選択した状態これをそれぞれ取得して
中を見てみる
Sub testShape()
Dim SR As ShapeRange
Set SR = Selection.ShapeRange
Dim GP1 As GroupShapes, GP2 As GroupShapes
Set GP1 = SR.Item(1).GroupItems
Set GP2 = SR.Item(2).GroupItems
End Sub
GroupShapesっていうクラス?型?を使って
ShapeRange.Item(n).GroupItemsでそれぞれのグループ化図形を取得している少し広げてみると
1個目のGroupItemsの中にはItemが2つ
2個めのGroupItemsの中にはItemが3つ
あるのがわかる
GP1のItem1のTypeはmsoAutoShape
Item2のTypeはmsoTextBox
実際にGP1.Item(1).Typeの値を取得するとmsoAutoShapeじゃなくて
数値の1になってる、これだとわかりにくいので
DrawingObjectっていうのを使ってこれをTypeNameにまかせてみたら
わかりやすくRectangleっていう文字列が返ってきた
テキストボックスも17っていう数字じゃなくて文字列のTextBox
このDrawingObjectってのが便利だけどよくわからなくて
候補一覧には出てこない、なんで?
画像図形はPictureで返ってくる、わかりやすい
これで図形の取得や判別はできたので後は順番にサイズと位置を変更するだけ
デザイン画面
名前をつけるのがめんどくさくなってそのままの名前になっている
このボタンのクリックイベントに
Private Sub CommandButton7_Click()
Call ReAjustAllShape選択図形すべての位置とサイズを再調整
End Sub
フォームモジュールに書いても同じだけど
このへんから標準モジュールに書いているんだなあ
書いてあるのは選択された画像を順番に取得して
図形のサイズと位置を再調整するプロシージャに投げている( ´∀`)つ ミ
フローチャートだとエクセル方眼紙大活躍!
見なおしたら間違っているのに気づいた
選択画像が1個の時の処理を辿るとNext i に行っているけどそのまま終了が正解
フローチャートで条件分岐の図形は<>◇菱型みたいなんだけど
文字表示にやたら面積を取るので使いにくいから全部四角形で作った
使いにくく感じるのは書き方が良くない?
グループ化図形の中の1つの図形なのか
単独図形なのかの判定
方法を思いつかないのでエラーで判定しているところ
0=見出し、1=本文、2=画像の順番に配列に入れて返している
プロシージャに投げている
図形の数が1なら見出しだけ、2こなら見出し付きテキストボックス
3個なら画像付き見出し付きテキストボックス
って判定している
これでサイズと位置を再調整ボタンに関係するのは全部かな
やっぱりフローチャートあったほうがわかりやすいかなあ
フローチャート追記した
2019/10/23追記
以下の日記はヤフーブログのときのものではてなブログとは関係ない
ヤフーブログも後日対応してもらって解決したので取り消し
主な原因はタブ文字が空白4文字になっていて、これで見かけより多くの文字数が消費されていたから
主な原因はタブ文字が空白4文字になっていて、これで見かけより多くの文字数が消費されていたから
追記ここまで
今回の記事も文字が多いので全部書いてから投稿ボタンを押してエラーになって
書き直しが怖くて少し書いては投稿→記事の修正→少し書いては投稿をして書いた
これを繰り返している間は公開範囲設定を公開しないにして
書き終わったら全公開にして投稿
これなら変なエラーで記事を作りなおすことは避けられるけどめんどくさいw
ここまでで文字数は9500文字くらい
昨日はこれくらいでも投稿エラーになった