図形のテキストボックスの段落のタブの配置をVBAで正確に取得できないことがあったので調べてみた
図形やテキストボックスの中の文字列をセルにコピーするマクロ



やっぱり可逆だよね
複数行のセルの値をまとめて1つのテキストボックスにするマクロ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14674215.html今回のマクロはここから始まったセルの値をテキストボックスにするマクロの逆
http://blogs.yahoo.co.jp/gogowaten/14674215.html今回のマクロはここから始まったセルの値をテキストボックスにするマクロの逆
一方通行より双方向
目的は
午後ツールその55、選択セル範囲を図形のテキストボックスにする、印刷用の点線を消すマクロを追加 ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14715274.html
http://blogs.yahoo.co.jp/gogowaten/14715274.html
このアドインで作成したテキストボックスの文字列をセルに戻せるようにすること
蛇足だけど複数列から作った文字列の場合

v = Split(str, vbTab) 'タブ文字で区切って配列に入れる
あとは先頭にあるタブ文字は要らないので削除、これでOK
ここからが本当の地獄だヽ(・ω・)/
図形のテキストボックスの段落のタブの配置をVBAで正確に取得できないことがあったので調べてみた


セルにコピーするときに反映するにはこの配置の値を取得する必要がある
この値は図形の1行目の1個めの場合は
図形.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(1).Type
これで取得できる
けど状況によっては正しく取得できなくなることがある
僕の書き方が良くないのかもしれないけど、よくわからん
対処法としての結論が
正しい値を取得するには上のように図形から直接するか
変数に入れるときは
図形.TextFrame2、
図形.TextFrame2.TextRange
ここまでにする、例えば図形.TextFrame2.TextRangeから
Dim tr As TextRange2
Set tr = 図形.TextFrame2.TextRange
Set ts01 = tr.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(1)
Set ts02 = tr.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(2)
type01 = tr.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(1).Type
type02 = tr.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(2).Type
これならOK
正しい値が取得できないのはもっと深いところを変数に入れてそこから取得する時
図形.TextFrame2.TextRange.Paragraphs.Item(1)
図形.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat
図形.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat.TabStops
これを変数に入れてそこから取得するとおかしくなる
ここから経緯
Sub testtabs5()
Dim s As Shape
Set s = Selection.ShapeRange.Item(1)
Dim ts01 As TabStop2, ts02 As TabStop2
Dim type01 As MsoTabStopType, type02 As MsoTabStopType
Dim pf As ParagraphFormat2
Set pf = s.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat
Set ts01 = pf.TabStops.Item(1)
Set ts02 = pf.TabStops.Item(2)
type01 = pf.TabStops.Item(1).Type
type02 = pf.TabStops.Item(2).Type
End Sub


配置はそれぞれtype01とtype02に取得する
期待する結果は
type01 = msoTabStopCenter '中央
type02 = msoTabStopLeft '左
なんだけど…

type01 = msoTabStopCenter '中央
type02 = msoTabStopCenter '中央
と、2個めの配置が正しく取得できていない、なんで?

次にタブの取得をする9,10行目をコメントアウトして


type01 = msoTabStopCenter '中央
type02 = msoTabStopLeft '左
正確に取得できる
タブを取得した時点でおかしくなるみたい…
⊂( ・∀・)ワケ ( ・∀・)つワカ ⊂( ・∀・)つラン♪
それでも一番上から直接取得するようにして
図形.TextFrame2.TextRange.Paragraphs.Item(1).ParagraphFormat.TabStops.Item(2).Type
ってすると

正確に取得できるので
ParagraphFormatを変数に入れて
その変数からタブを取得するとおかしくなる?
ParagraphFormatの上のParagraphから取得してみる

もう1個上のTextRangeから取得してみる

これでなんとかなるかなあ

もっと簡単にできるかと思っていたけど思わぬ落とし穴?があった
次は文字の装飾