fc2ブログ

記事一覧

MS Excel:吹き出しの移動やサイズ変更で指示先の位置が変わる

Microsoft EXCELの吹き出しを移動したり大きさを変えると、引き出し線の先端(矢印が指している位置)が変わるのって不便。
確かExcel 2007より前はテキストボックス部分だけ動いて先っちょは止まってたよね。
WEBで検索すると、同様の不便を感じている人は結構居る。

そして、旧来の指示先端部を固定したまま本体の移動・大きさ変更をする方法は見当たらない。

これって誰得?

つまり、
x230531_01.png
例えば「線吹き出し 2 (枠付き)」をマウスで掴んで、

x230531_02.png
ドラッグすると、

x230531_03.png
引き出し線(指示線)も一緒に動く。

x230531_04.png
さらに、幅のハンドルを掴んでドラッグすると、

x230531_05.png
幅が広がったのと同じ比率で引き出し線も反対側に拡がる。

ちなみに、PDF-XChange Editor(フリーソフト)の
x230531_06.png
コメントと呼ばれるオブジェクトに含まれる吹き出しツールで描いたものを

x230531_07.png
ドラッグしても、

x230531_08.png
矢印の先は元の位置に残っている。

x230531_09.png
例えば文字数が増えて拡大したくなったら(実は文字数が増えると自動的に大きくなるが)、

x230531_10.png
矢印の先を心配することなく拡大(縮小)できる。

フリーソフトにできることがどうしてできない?
アチラの国は訴訟天国なので、誰かが何らかの不利益を主張して変えさせたのか、なんて邪推してしまう。

ごまめの私が歯ぎしりしても仕方がないので…
そうなるとマクロ(VBA)のお世話になるしかないのか?

結論から先に言うと、どういう風にプログラムすればいいかの目途は立った。
結構面倒くさい処理になりそうなので、マクロはまだできていない。

はい、解散!
じゃなくて、本稿では調べて分かったことを報告しておきたい。

まずは、こんな感じで
x230531_11.png
エクセルのワークシートに全タイプの吹き出しを並べた。

これのオブジェクトをすべて選択した状態で、以下のマクロを実行した。
Sub TextBoxTest()

Dim MyResult As String

If TypeName(Selection) = "Range" Then
MsgBox "オートシェイプが選択されていません"
Exit Sub
End If


For iii = 1 To Selection.ShapeRange.Count
MyResult = ""
MyResult = MyResult & "●No." & iii & " [Type]=" & Selection.ShapeRange.Item(iii).AutoShapeType
MyResult = MyResult & " [Name]=" & Selection.ShapeRange.Item(iii).Name & " [Text]=" & Selection.ShapeRange.Item(iii).TextFrame.Characters.Text & vbCrLf
MyResult = MyResult & "[Left] & [Top] =" & Selection.ShapeRange.Item(iii).Left & " " & Selection.ShapeRange.Item(iii).Top
MyResult = MyResult & " [Width] & [Hight]=" & Selection.ShapeRange.Item(iii).Width & " " & Selection.ShapeRange.Item(iii).Height & vbCrLf
MyResult = MyResult & "[Item(1)-(" & Selection.ShapeRange.Item(iii).Adjustments.Count & ")] ="
For jjj = 1 To Selection.ShapeRange.Item(iii).Adjustments.Count
MyResult = MyResult & " " & Selection.ShapeRange.Item(iii).Adjustments.Item(jjj)
Next
MyResult = MyResult & vbCrLf
Cells(43 + iii, 1).Value = MyResult
Next

End Sub

「For iii = 1 To Selection.ShapeRange.Count」で、選択したオブジェクトを順に処理する。
「MyResult = ""」で、出力用の文字列変数を空っぽにしてから、
処理回数(iii)、吹き出しの種類(Selection.ShapeRange.Item(iii).AutoShapeType)、オブジェクトの名前(Selection.ShapeRange.Item(iii).Name)、吹き出し内に書いたテキスト(Selection.ShapeRange.Item(iii).TextFrame.Characters.Text)、吹き出し本体の左・上の座標(Selection.ShapeRange.Item(iii).Left 、 Selection.ShapeRange.Item(iii).Top)、同 幅・高さ(Selection.ShapeRange.Item(iii).Width 、 Selection.ShapeRange.Item(iii).Height)、
そしてこれが肝なんだが、引き出し線に関する情報(Selection.ShapeRange.Item(iii).Adjustments.Item(jjj))を、改行(& vbCrLf)で区切りながら「MyResult」に代入して、最後にセルに書き出す(Cells(43 + iii, 1).Value = MyResult)。

結果一覧を以下に示す。
●No.1 [Type]=105 [Name]=Rectangular Callout 1 [Text]=四角形吹き出し
[Left] & [Top] =47.25 43.12496 [Width] & [Hight]=107.25 76.5
[Item(1)-(2)] = -0.20833 0.625
●No.2 [Type]=106 [Name]=Rounded Rectangular Callout 2 [Text]=角丸四角形吹き出し
[Left] & [Top] =190.5 43.12496 [Width] & [Hight]=126 76.5
[Item(1)-(3)] = -0.20833 0.625 0.16667
●No.3 [Type]=107 [Name]=Oval Callout 3 [Text]=円形吹き出し
[Left] & [Top] =369.75 42 [Width] & [Hight]=126.75 78.75
[Item(1)-(2)] = -0.20833 0.625
●No.4 [Type]=108 [Name]=Cloud Callout 4 [Text]=雲形吹き出し
[Left] & [Top] =547.5 40.12496 [Width] & [Hight]=142.5 82.5
[Item(1)-(2)] = -0.20833 0.625
●No.5 [Type]=109 [Name]=Line Callout 1 5 [Text]=線吹き出し 1 (枠付き)
[Left] & [Top] =99.75 167.25 [Width] & [Hight]=105 64.5
[Item(1)-(4)] = 0.1875 -0.08333 1.125 -0.38333
●No.6 [Type]=111 [Name]=Line Callout 2 6 [Text]=線吹き出し 2 (枠付き)
[Left] & [Top] =336 167.25 [Width] & [Hight]=99 72
[Item(1)-(6)] = 0.1875 -0.08333 0.1875 -0.16667 1.125 -0.46667
●No.7 [Type]=112 [Name]=Line Callout 3 7 [Text]=線吹き出し 3 (枠付き)
[Left] & [Top] =557.25 167.25 [Width] & [Hight]=132.75 72
[Item(1)-(8)] = 0.1875 -0.08333 0.1875 -0.16667 1 -0.16667 1.12963 -0.08333
●No.8 [Type]=114 [Name]=Line Callout 1 (Accent Bar) 8 [Text]=強調線吹き出し 1
[Left] & [Top] =87 268.5 [Width] & [Hight]=117.75 54.75
[Item(1)-(4)] = 0.1875 -0.08333 1.125 -0.38333
●No.9 [Type]=115 [Name]=Line Callout 2 (Accent Bar) 9 [Text]=強調線吹き出し 2
[Left] & [Top] =324.75 268.5 [Width] & [Hight]=110.25 72.75
[Item(1)-(6)] = 0.1875 -0.08333 0.1875 -0.16667 1.125 -0.46667
●No.10 [Type]=116 [Name]=Line Callout 3 (Accent Bar) 10 [Text]=強調線吹き出し 3
[Left] & [Top] =560.25 268.5 [Width] & [Hight]=129.75 77.25
[Item(1)-(8)] = 0.1875 -0.08333 0.1875 -0.16667 1 -0.16667 1.12963 -0.08333
●No.11 [Type]=113 [Name]=Line Callout 1 (No Border) 11 [Text]=線吹き出し 1
[Left] & [Top] =87.75 376.5 [Width] & [Hight]=117 59.25
[Item(1)-(4)] = 0.1875 -0.08333 1.125 -0.38333
●No.12 [Type]=119 [Name]=Line Callout 2 (No Border) 12 [Text]=線吹き出し 2
[Left] & [Top] =344.25 376.5 [Width] & [Hight]=90.75 62.25
[Item(1)-(6)] = 0.1875 -0.08333 0.1875 -0.16667 1.125 -0.46667
●No.13 [Type]=120 [Name]=Line Callout 3 (No Border) 13 [Text]=線吹き出し 3
[Left] & [Top] =562.5 376.5 [Width] & [Hight]=127.5 63
[Item(1)-(8)] = 0.1875 -0.08333 0.1875 -0.16667 1 -0.16667 1.12963 -0.08333
●No.14 [Type]=122 [Name]=Line Callout 1 (Border and Accent Bar) 14 [Text]=強調線吹き出し 1 (枠付き)
[Left] & [Top] =75 462 [Width] & [Hight]=129.75 76.5
[Item(1)-(4)] = 0.1875 -0.08333 1.125 -0.38333
●No.15 [Type]=123 [Name]=Line Callout 2 (Border and Accent Bar) 15 [Text]=強調線吹き出し 2 (枠付き)
[Left] & [Top] =330 458.25 [Width] & [Hight]=105 80.25
[Item(1)-(6)] = 0.1875 -0.08333 0.1875 -0.16667 1.125 -0.46667
●No.16 [Type]=124 [Name]=Line Callout 3 (Border and Accent Bar) 16 [Text]=強調線吹き出し 3 (枠付き)
[Left] & [Top] =558 466.5 [Width] & [Hight]=132 72
[Item(1)-(8)] = 0.1875 -0.08333 0.1875 -0.16667 1 -0.16667 1.12963 -0.08333

ここから分かるように、[Item(1)-(n)]=「Adjustments.Item(jjj)」の個数が吹き出しの種類ごとに異なる。

指示先が単純に1つのものは「Item」は2つ。
具体的には、本体の高さ・幅に対する指示先座標の比率だ。(逆だったかもしれん)
「角丸四角形吹き出し」の場合は角の丸さを定義するため「Item」が一つ増えて3つ。
「線吹き出し 1 (枠付き)」は引き出し線の始点と終点を定義するため、「Item」は4つ。
「線吹き出し 2 (枠付き)」は引き出し線に折れ点が増えるので「Item」は6つ。
という具合になっている。

上述の通り、「引き出し線の先端」は座標ではなく、吹き出し本体に対する比率で定義される。
Excel も Word も Office 2007 から XML でデータを保存するように変わったので、XML の仕様が原因で冒頭で述べた不便な状況が生じたのではないかと考えている。

尤も、Excelに読み込んだ時点で動かし方を変えることは、できない相談じゃない気がするんだが。

ついでに比較的有名な豆知識だが、拡張子が .xlsx 、 .docx などのバージョンは、拡張子を .zip に変えるだけで中身が見えて、フォルダ体系の中の「media」フォルダの中には、Excel/Wordに貼り付けた写真などの生画像データが入っていて、これを画像処理ソフトで弄くってから .zipに戻して拡張子を復元すると、Excel/Wordで開いたファイルに反映される、なんて小技がある。
失敗して開けなくなる可能性もあるので、元データは残してコピーで試すのがお勧め。


話を戻して、
上記のとおり下調べはできたので、
(1) オブジェクトが選択された状態で、マクロを起動すると
(2) その時点で上記各データから引き出し線先端の座標を比率に基づき算出して記憶し、
(3) InputBoxまたはMsgBoxで“吹き出しを移動・拡大縮小して「OK」をクリック”と表示、
  注) InputBoxは関数ではなくメソッドで呼び出さないとオブジェクト操作できない
     → 参考(小さな書店の経営術さん)
(4) マクロに制御が戻ったら、オブジェクトの位置とサイズを再取得して、(2)の座標からItemで記述される様式の数値を逆算してセット
という流れで当初の目的は達成できるはず。

ただ、面倒くさいのわかるでしょ?
誰かマクロ作ってくれてもいいぞ。

関連記事
スポンサーサイト



にほんブログ村 自転車ブログ 自転車生活へ ←このボタンをクリックすると書いている人が喜びます(それだけです)
にほんブログ村

プロフィール

potaiko

Author:potaiko
関西在住のミニベロ=ちっちゃい自転車乗りです。
ポタリング/サイクリングの話題と自転車いじり(いわゆるカスタム)の話題が中心。
現在の愛車は5号車(こちら)、6号車(こちら)と7号車(こちら)の3台!

過去には、持ってるけど現在不稼働の1号車(こちら)、譲渡済みの2号車と3号車(こちら)、譲渡済みだがもうすぐ帰ってきそうな4号車(こちら)が存在している。

お約束: このブログは情報の正確さを保証するものではありません。参考にされる場合は、自己責任でお願いします。

フリーエリア

にほんブログ村 自転車ブログ 自転車生活へ にほんブログ村 写真ブログ 近畿風景写真へ にほんブログ村 地域生活(街) 関西ブログ 近畿情報へ PVアクセスランキング にほんブログ村